要想研讀以太坊源碼币他,首先必須了解這些代碼實(shí)現(xiàn)了哪些功能。這一篇我們通過聯(lián)盟鏈的方式以兩條鏈的交互來了解下以太坊核心的功能。
準(zhǔn)備工作
創(chuàng)世區(qū)塊配置文件
在之前的文章我們了解過創(chuàng)世區(qū)塊的源碼,知道其結(jié)構(gòu),也知道創(chuàng)世區(qū)塊的產(chǎn)生需要一個(gè)叫做genesis.json的配置文件膛檀。該配置文件內(nèi)容對(duì)應(yīng)創(chuàng)世區(qū)塊數(shù)據(jù)結(jié)構(gòu),如下:
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x40000",
"extraData" : "",
"gasLimit" : "0xffffffff",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00",
"alloc": {}
}
聯(lián)盟鏈環(huán)境構(gòu)造
在自己的目錄下新建兩個(gè)目錄aChain娘侍,bChain分別作為兩條鏈的目錄咖刃。并在各自的目錄創(chuàng)建一個(gè)如上的genesis.json的配置文件。
接下來憾筏,我們需要利用以太坊的geth工具來初始化區(qū)塊鏈嚎杨。geth工具在之前搭建以太坊本地環(huán)境的文章中已經(jīng)搭建好。
打開終端進(jìn)入a鏈對(duì)應(yīng)的目錄氧腰,執(zhí)行初始化命令:
// 根據(jù)配置文件初始化區(qū)塊鏈
geth --datadir ./data-init1/ init genesis.json
執(zhí)行成功后枫浙,我們發(fā)現(xiàn)在a鏈目錄下多了一個(gè)存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù)的目錄data-init1,進(jìn)入查看古拴。
同理箩帚,同樣的方法初始化bChain。
聯(lián)盟鏈構(gòu)造
啟動(dòng)控制臺(tái)
初始化操作執(zhí)行成功后需要啟動(dòng)geth控制臺(tái)黄痪,使用下列命令:
// networkid 指定網(wǎng)絡(luò)id紧帕,1-4為系統(tǒng)內(nèi)置,不建議使用
// nodiscover 表示不去主動(dòng)發(fā)現(xiàn)peers節(jié)點(diǎn)
geth --datadir ./data-init1/ --networkid 88 --nodiscover console
終端出現(xiàn)下列界面桅打,表示啟動(dòng)成功:
接著繼續(xù)在bChain中啟動(dòng)geth是嗜,這時(shí)我們發(fā)現(xiàn)使用上面的命令會(huì)啟動(dòng)失敗。這是為什么呢挺尾?
根據(jù)錯(cuò)誤提示我們知道鹅搪,端口30303已經(jīng)被綁定。因此潦嘶,我們推測(cè)可能是aChain的geth占用了30303端口涩嚣,其實(shí)從上一個(gè)圖的橢圓標(biāo)注中即可就看出geth端口號(hào),但是我們?cè)趫?zhí)行命令時(shí)并沒有指定端口掂僵,所以得知不指定時(shí)默認(rèn)端口30303.
這時(shí)航厚,我們就需要手動(dòng)指定端口號(hào)來啟動(dòng)bChain的geth控制臺(tái)。
// port 指定geth端口號(hào)锰蓬,默認(rèn)30303
geth --datadir ./data-init2/ --port 30304 --networkid 88 --nodiscover console
這時(shí)發(fā)現(xiàn)幔睬,端口為30304的geth控制臺(tái)啟動(dòng)成功。
Coinbase賬戶
啟動(dòng)成功后芹扭,我們就可以給區(qū)塊鏈添加一個(gè)賬戶麻顶。添加賬戶的命令在之前搭建以太坊環(huán)境時(shí)已經(jīng)介紹過,這里回憶一下:
// 添加賬戶舱卡,密碼為“chaors”
personal.newAccount("chaors")
// 列出當(dāng)前所有賬戶
personal.listAccounts
// coinbase賬戶
eth.coinbase
// 錢包信息
personal.listWallets
為aChain創(chuàng)建一個(gè)密碼為“chaors”的賬戶辅肾。
這時(shí),我們發(fā)現(xiàn)原來初始化生成的秘鑰目錄下多了兩個(gè)文件轮锥,因?yàn)槲覀儎?chuàng)造了兩個(gè)用戶矫钓。
聯(lián)盟鏈互通
現(xiàn)在已經(jīng)存在兩個(gè)相互獨(dú)立的鏈,我們要做的就是將兩個(gè)鏈互通舍杜。用到的命令有:
// 查看節(jié)點(diǎn)peers
admin.peers
// 查看節(jié)點(diǎn)信息
admin.nodeInfo.enode
// 添加節(jié)點(diǎn)參數(shù)為admin.nodeInfo.enode查詢到信息內(nèi)容
admin.addPeer("enode://e4b51e8bf54c82660e3123ff1d996cb4d9234bc1e8312b5144cc6e2d3538b33e8f8f438dad2f08cd968a408e31f5781535eaf1f1e5944e9af7c962ddd05a9594@[::]:30306?d
iscport=0")
具體步驟如下:
添加成功后新娜,再次利用admin.peers查看來驗(yàn)證是否成功。
挖礦
已經(jīng)有了鏈和賬戶的概念了既绩,接下來就可以在賬戶上搞事情了概龄。查詢賬戶余額發(fā)現(xiàn)為零,這個(gè)時(shí)候我們就需要通過挖礦來生成獎(jiǎng)勵(lì)饲握,使得賬戶余額不為零私杜。
用到的命令有:
// 查詢余額 參數(shù)為賬戶地址,這里查詢的是礦工地址
eth.getBalance(eth.coinbase)
// 挖礦開始
miner.start()
// 挖礦結(jié)束
miner.stop()
在aChain執(zhí)行挖礦,當(dāng)aChain挖到區(qū)塊時(shí)救欧,我們發(fā)現(xiàn)bChain控制臺(tái)在不斷地打印信息歪今。
由此可見,aChain在挖礦的同時(shí)颜矿,bChain在同步數(shù)據(jù)寄猩。
接下來,停止挖礦骑疆。分別在兩個(gè)控制臺(tái)查看礦工賬戶余額發(fā)現(xiàn)一致田篇,說明挖礦的過程也同步成功。
交易
轉(zhuǎn)賬
賬戶有了余額之后就可以搞大事情了箍铭,可以在兩個(gè)賬戶之間進(jìn)行轉(zhuǎn)賬泊柬。用到的命令有:
// 解鎖賬戶
personal.unlockAccount(eth.accounts[0])
// 轉(zhuǎn)賬
eth.sendTransaction({from: eth.coinbase, to: '0x02b7344004c45465796f779b7b95d7912
c2ef572', value: 100000000})
首先在aChain中解鎖賬戶并給bChain賬戶發(fā)生轉(zhuǎn)賬,發(fā)現(xiàn)bChain賬戶余額仍然為零诈火。這是為什么呢兽赁?
因?yàn)椋覀冸m然發(fā)生了交易,但是并沒有進(jìn)行挖礦打包刀崖。aChain挖礦后進(jìn)行查詢發(fā)現(xiàn)bChain賬戶到賬惊科。
知其所以然?
現(xiàn)在基本了解了geth的功能亮钦,可以算是知其然了馆截。下一步需要做的就是深入到源碼去,在了解大概功能的基礎(chǔ)上知其所以然蜂莉。
更多以太坊源碼解析請(qǐng)移駕全球最大同性交友網(wǎng),覺得有用記得給個(gè)小star哦??????
.
.
.
.
互聯(lián)網(wǎng)顛覆世界蜡娶,區(qū)塊鏈顛覆互聯(lián)網(wǎng)!
--------------------------------------------------20180905 23:28