本篇文章給大家分享的是有關(guān)如何進(jìn)行Ethereum Bootstrap本地私有鏈開發(fā)環(huán)境搭建,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
長(zhǎng)垣網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),長(zhǎng)垣網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為長(zhǎng)垣超過千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的長(zhǎng)垣做網(wǎng)站的公司定做!
通過本文所述方法和項(xiàng)目中的腳本,我們可以快速的搭建好自己的私鏈進(jìn)行開發(fā)測(cè)試。
倉(cāng)庫中包含的工具有:
一個(gè)測(cè)試賬戶導(dǎo)入腳本,在首次部署時(shí)將五個(gè)測(cè)試賬戶私鑰導(dǎo)入以太坊節(jié)點(diǎn)。
一個(gè)genesis.json配置文件,為對(duì)應(yīng)的五個(gè)測(cè)試賬戶提供初始資金(以太幣),方便開發(fā)測(cè)試。
一個(gè)快速啟動(dòng)私有鏈節(jié)點(diǎn)并進(jìn)入交互模式的腳本。
一個(gè)合約樣例:contracts/Token.sol
。這是一個(gè)使用合約語言Solidity編寫的智能合約。Token合約的功能是發(fā)行一種token(可以理解為貨幣,積分等等),只有合約的創(chuàng)建者有發(fā)行權(quán),token的擁有者有使用權(quán),并且可以自由轉(zhuǎn)賬。
測(cè)試賬戶私鑰是放在Github上的公開數(shù)據(jù),千萬不要用于正式環(huán)境中或者公有鏈上。如果在測(cè)試環(huán)境之外的地方使用這些私鑰,你的資金將會(huì)被竊??!
在本地安裝好go-ethereum和solc, 可以執(zhí)行geth
和solc
命令。如果操作系統(tǒng)是ubuntu, 安裝官方的ethereum安裝包即可。
將本倉(cāng)庫通過git clone
命令下載到本地。
安裝expect,工具腳本用它來自動(dòng)化一些過程。例如在ubuntu上: sudo apt-get install expect
進(jìn)入本倉(cāng)庫目錄: cd ethereum-bootstrap
導(dǎo)入測(cè)試賬戶私鑰: ./bin/import_keys.sh
啟動(dòng)私有鏈節(jié)點(diǎn): ./bin/private_blockchain.sh
. 啟動(dòng)成功后可以看到類似如下輸出:
此時(shí)以太坊交互式控制臺(tái)已經(jīng)啟動(dòng),我們可以開始測(cè)試和開發(fā)了。
注意:工具腳本假設(shè)你的geth安裝在默認(rèn)位置, 可以直接通過geth
執(zhí)行。如果geth
命令安裝在非標(biāo)準(zhǔn)的位置,可以設(shè)置GETH
環(huán)境變量指定geth可執(zhí)行文件的路徑。例如:
GETH=/some/weird/dir/geth ./bin/import_keys.sh
在contracts
目錄下有一個(gè)智能合約樣例文件Token.sol
, 通過Solidity語言實(shí)現(xiàn)了基本的代幣功能, 合約持有者可以發(fā)行代幣, 使用者可以互相轉(zhuǎn)賬.
我們可以使用以太坊控制臺(tái)來編譯部署這個(gè)合約.以太坊控制臺(tái)是最基本的工具,使用會(huì)比較繁瑣.社區(qū)也提供了其他更加方便的部署工具,此處不做討論.
第一步,我們先把合約代碼壓縮為一行.新建一個(gè)ssh session, 切換到geth用戶環(huán)境su - geth
, 然后輸入:cat contracts/Token.sol | tr '\n' ' '
.
切換到以太坊控制臺(tái),把合約代碼保存為一個(gè)變量:
var tokenSource = 'contract Token { address issuer; mapping (address => uint) balances; event Issue(address account, uint amount); event Transfer(address from, address to, uint amount); function Token() { issuer = msg.sender; } function issue(address account, uint amount) { if (msg.sender != issuer) throw; balances[account] += amount; } function transfer(address to, uint amount) { if (balances[msg.sender] < amount) throw; balances[msg.sender] -= amount; balances[to] += amount; Transfer(msg.sender, to, amount); } function getBalance(address account) constant returns (uint) { return balances[account]; } }';
然后編譯合約代碼:
var tokenCompiled = web3.eth.compile.solidity(tokenSource);
通過tokenCompiled.Token.code
可以看到編譯好的二進(jìn)制代碼,通過tokenCompiled.Token.info.abiDefinition
可以看到合約的ABI.
接下來我們要把編譯好的合約部署到網(wǎng)絡(luò)上去.
首先我們用ABI來創(chuàng)建一個(gè)javascript環(huán)境中的合約對(duì)象:
var contract = web3.eth.contract(tokenCompiled.Token.info.abiDefinition);
我們通過合約對(duì)象來部署合約:
var initializer = {from: web3.eth.accounts[0], data: tokenCompiled.Token.code, gas: 300000}; var callback = function(e, contract){ if(!e) { if(!contract.address) { console.log("Contract transaction send: TransactionHash: ">
contract.new
方法的第一個(gè)參數(shù)設(shè)置了這個(gè)新合約的創(chuàng)建者地址from
, 這個(gè)新合約的代碼data
, 和用于創(chuàng)建新合約的費(fèi)用gas
.gas
是一個(gè)估計(jì)值,只要比所需要的gas多就可以,合約創(chuàng)建完成后剩下的gas會(huì)退還給合約創(chuàng)建者.
contract.new
方法的第二個(gè)參數(shù)設(shè)置了一個(gè)回調(diào)函數(shù),可以告訴我們部署是否成功.
contract.new
執(zhí)行時(shí)會(huì)提示輸入錢包密碼.執(zhí)行成功后,我們的合約Token就已經(jīng)廣播到網(wǎng)絡(luò)上了.此時(shí)只要等待礦工把我們的合約打包保存到以太坊區(qū)塊鏈上,部署就完成了.
在公有鏈上,礦工打包平均需要15秒,在私有鏈上,我們需要自己來做這件事情.首先開啟挖礦:
miner.start(1)
此時(shí)需要等待一段時(shí)間,以太坊節(jié)點(diǎn)會(huì)生成挖礦必須的數(shù)據(jù),這些數(shù)據(jù)都會(huì)放到內(nèi)存里面.在數(shù)據(jù)生成好之后,挖礦就會(huì)開始,稍后就能在控制臺(tái)輸出中看到類似:
:hammer:Mined block
的信息,這說明挖到了一個(gè)塊,合約已經(jīng)部署到以太坊網(wǎng)絡(luò)上了!此時(shí)我們可以把挖礦關(guān)閉:
miner.stop(1)
接下來我們就可以調(diào)用合約了.先通過token.address
獲得合約部署到的地址, 以后新建合約對(duì)象時(shí)可以使用.這里我們直接使用原來的contract對(duì)象:
// 本地錢包的第一個(gè)地址所持有的token數(shù)量 > token.getBalance(web3.eth.accounts[0]) 0 // 發(fā)行100個(gè)token給本地錢包的第一個(gè)地址 > token.issue.sendTransaction(web3.eth.accounts[0], 100, {from: web3.eth.accounts[0]}); I1221 11:48:30.512296 11155 xeth.go:1055] Tx(0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c "0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef" // 發(fā)行token是一個(gè)transaction, 因此需要挖礦使之生效 > miner.start(1) :hammer:Mined block > miner.stop(1) // 再次查詢本地錢包第一個(gè)地址的token數(shù)量 > token.getBalance(web3.eth.accounts[0]) 100 // 從第一個(gè)地址轉(zhuǎn)30個(gè)token給本地錢包的第二個(gè)地址 > token.transfer.sendTransaction(web3.eth.accounts[1], 30, {from: web3.eth.accounts[0]}) I1221 11:53:31.852541 11155 xeth.go:1055] Tx(0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c "0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b" > miner.start(1) > miner.stop(2) > token.getBalance(web3.eth.accounts[0]) 70 > token.getBalance(web3.eth.accounts[1]) 30
私有鏈的所有數(shù)據(jù)都會(huì)放在倉(cāng)庫根目錄下的data
目錄中,刪除這個(gè)目錄可以清除所有數(shù)據(jù),重新啟動(dòng)新環(huán)境。
以上就是如何進(jìn)行Ethereum Bootstrap本地私有鏈開發(fā)環(huán)境搭建,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。