待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》凯砍,馬良老師講授蟆肆。此簡書文集記錄我的學(xué)習(xí)筆記。
課程共8節(jié)課掉奄。其中规个,前四課講ETH原理凤薛,后四課講智能合約。
第三課分為三部分:
- 以太坊區(qū)塊結(jié)構(gòu)
- GHOST協(xié)議
- 搭建測試網(wǎng)絡(luò)
這篇文章是第三課第三部分的學(xué)習(xí)筆記:搭建測試網(wǎng)絡(luò)诞仓。
這節(jié)課是使用Go-ethereum搭建一個(gè)測試網(wǎng)絡(luò)缤苫,并使用它觀察交易的變化。
本節(jié)課內(nèi)容需要在以太坊平臺(tái)搭建的基礎(chǔ)上完成墅拭。
老師給出的操作步驟文檔為:
我的操作如下:
-
首先創(chuàng)建目錄
mkdir -p ~/testnet/chaindata/
后面生成的數(shù)據(jù)會(huì)保存在這個(gè)目錄里活玲。
-
生成新的地址(賬戶)用于預(yù)分配 ether
./geth account new --datadir ~/testnet/chaindata/
過程中系統(tǒng)會(huì)要求輸入這個(gè)賬戶的密碼, 生成以后保存好這個(gè)地址, 和地址對(duì)應(yīng)的密碼谍婉。
-
清除數(shù)據(jù)庫舒憾,方便后期的初始化。
./geth removedb --datadir ~/testnet/chaindata/
編輯 ~/testnet/CustomGenesis.json
視頻中穗熬,老師的JSON文件是在~/go-ethereum/vendor文件夾镀迂,用cp ../../vendor/CustomGenesis.json ~/testnet/命令,把JSON文件復(fù)制到~/testnet/目錄唤蔗。
使用 vim ~/testnet/CustomGenesis.json 打開文件探遵,替換掉里面的地址為第2步生成的地址。
特別注意:替換地址一定要記得做措译,我在做練習(xí)時(shí)别凤,經(jīng)常忘了這一步。
VIM的使用也要多練習(xí)领虹。
使用創(chuàng)始?jí)K配置文件初始化測試網(wǎng)絡(luò)
./geth --identity "BlcokGeekTestNode" --datadir ~/testnet/chaindata init ~/testnet/CustomGenesis.json運(yùn)行這個(gè)測試網(wǎng)絡(luò)规哪,里面的參數(shù)有一定的作用。
./geth --rpc --rpcaddr 0.0.0.0 --rpccorsdomain "*" --ws --wsaddr 0.0.0.0 --wsorigins "*" --datadir ~/testnet/chaindata --networkid 201803286666 --nodiscover打開另外一個(gè)終端, 進(jìn)入到 go-ethereum/build/bin 目錄, 連接到測試網(wǎng)絡(luò)
./geth attach ~/testnet/chaindata/geth.ipc
連續(xù)到測試網(wǎng)絡(luò)后塌衰,左邊會(huì)顯示挖礦的收益地址已自動(dòng)配置好诉稍,就是前面創(chuàng)建的地址。
可以使用eth.accounts命令查看地址∽罱現(xiàn)在有一個(gè)地址杯巨。
至此,測試網(wǎng)絡(luò)的搭建已經(jīng)完成努酸。接下來觀察交易的過程服爷。先來創(chuàng)建兩個(gè)地址。
- 在這個(gè)連接中輸入命令获诈,括號(hào)里的參數(shù)是密碼仍源。
personal.newAccount("test222")
personal.newAccount("test333")
再使用eth.accounts可查看到,有三個(gè)地址了舔涎。
- 把已有的地址賦予給三個(gè)變量笼踩,方便后面的使用。
addr1 = eth.accounts[0]
addr2 = eth.accounts[1]
addr3 = eth.accounts[2]
查詢?nèi)齻€(gè)地址的余額: web3.fromWei(eth.getBalance(addr1), "ether") 亡嫌,以ether為單位嚎于【蚨可以看到,只有第一個(gè)地址里有余額于购。后面有18位小數(shù)袍睡。
- 設(shè)置挖礦收益人地址,(為了便于觀察)
miner.setEtherbase(addr3)
再確認(rèn)一下肋僧,eth.coinbase命令女蜈,顯示的是地址3。
查看當(dāng)前區(qū)塊號(hào):eth.blockNumber色瘩,顯示的是0伪窖,因?yàn)檫€沒有開始挖礦
發(fā)起交易
在不解鎖的情況下直接轉(zhuǎn)賬,會(huì)報(bào)錯(cuò)居兆。eth.sendTransaction({from:addr1, to:addr2, value: web3.toWei(10.0, "ether")})
解鎖賬號(hào):personal.unlockAccount(addr1)
發(fā)起交易前先看交易池的狀態(tài):txpool.status覆山,顯示都為0
解鎖后再進(jìn)行轉(zhuǎn)賬:eth.sendTransaction({from:addr1, to:addr2, value: web3.toWei(10.0, "ether")}),左邊的窗口顯示泥栖,交易已提交簇宽。
再看交易池:txpool.status,顯示有1個(gè)Pending吧享。
- 開始挖礦魏割,miner.start()
當(dāng)有區(qū)塊產(chǎn)生時(shí),要馬上停止钢颂,miner.stop()钞它,這樣便于觀察余額的變化。
操作了三四遍殊鞭,終于來到挖礦這一步遭垛。但是挖了很長時(shí)間,沒有挖出區(qū)塊操灿。在知識(shí)星球上提問锯仪,老師說配置低了(挖礦初始化很占內(nèi)存,初始化完成后將挖礦就快了趾盐,與難度有關(guān))庶喜,于是修改虛擬機(jī)為4G內(nèi)存,重做救鲤。
修改方法:Ubuntu右擊久窟,設(shè)置,系統(tǒng)頁蜒简,改為4096M瘸羡,OK漩仙,啟動(dòng)Ubuntu
又照著上述步驟做了一遍搓茬,挖礦成功犹赖。
- 分析結(jié)果。
查看區(qū)塊號(hào)卷仑,挖出了3個(gè)區(qū)塊峻村。
查看交易池,交易被執(zhí)行锡凝。
看三個(gè)賬號(hào)的余額粘昨。地址2收到了10個(gè)以太幣;發(fā)起人地址1少了不止10個(gè)以太幣窜锯,因?yàn)檫€有交易費(fèi)张肾;地址3有15個(gè)多的以太幣。每塊獎(jiǎng)勵(lì)5個(gè)以太幣(這個(gè)測試網(wǎng)絡(luò)是老的規(guī)定)锚扎,多的部分是交易費(fèi)吞瞪。
- 觀察區(qū)塊結(jié)構(gòu)
當(dāng)前區(qū)塊是3,而挖出交易的是區(qū)塊1驾孔,使用eth.getBlock(1) 芍秆,查看區(qū)塊包含的具體內(nèi)容。
可對(duì)照以太坊區(qū)塊結(jié)構(gòu)一節(jié)的內(nèi)容翠勉。
Difficulty 區(qū)塊難度妖啥。有很多因素決定,由一個(gè)公式算出对碌。
gasLimit gas上限荆虱。比特幣通過大小限制區(qū)塊尺寸,而以太坊通過gas上限朽们。
gasUsed 當(dāng)區(qū)塊被挖出時(shí)克伊,實(shí)際的gas消耗。
logBloom 日志的Bloom過濾器
miner 挖礦收益人的地址华坦。
extraData愿吹、mixHash、nonce 三個(gè)與挖礦有關(guān)的參數(shù)惜姐。
number 直系父節(jié)點(diǎn)的個(gè)數(shù).
parentHash 父區(qū)塊的區(qū)塊頭散列值犁跪。
receiptsRoot 收據(jù)的狀態(tài)樹
sha3Uncles 叔塊的哈希
stateRoot 全局狀態(tài)樹
timestamp 時(shí)間戳
transactions 交易的哈希。復(fù)制下來歹袁,后面可以查看交易的具體內(nèi)容坷衍。
uncles 叔塊列表,因?yàn)楸纠龥]有叔塊条舔,所以是空的枫耳。
- 獲取交易的具體內(nèi)容
eth.getTransaction(參數(shù)),參數(shù)是交易的散列值孟抗,即前文的transactions值迁杨。各項(xiàng)參數(shù)意義都很明確钻心,不再詳述。
本課練習(xí)結(jié)束铅协。課程中捷沸,搭建了測試網(wǎng)絡(luò),發(fā)起了交易狐史,挖了礦痒给,觀察了三個(gè)地址余額的變化,觀察了區(qū)塊和交易的具體信息骏全。
不足之處苍柏,請(qǐng)批評(píng)指正。