話說在最前稍刀,區(qū)塊鏈?zhǔn)荘2P的介袜,因此沒有誰是主服務(wù)器炫贤,每個(gè)點(diǎn)都是平等的方篮。
自己動(dòng)手搭建以太坊開發(fā)環(huán)境,可能版本也比較多象踊,總沒有一個(gè)能成功到底的温亲,所以自己寫了一個(gè)。
參考文獻(xiàn):
https://blog.csdn.net/weixin_34402090/article/details/91700963
1杯矩、Geth安裝
主要講解Windows 環(huán)境下的Geth安裝栈虚,下載Windows-Geth安裝包直接安裝即可:
https://geth.ethereum.org/downloads/
不知道為什么有個(gè)遮罩層,用F12史隆,display=none去掉魂务,就可以點(diǎn)擊了
下載后雙擊安裝,安裝完成后Geth會(huì)自己配置環(huán)境變量泌射,
如果沒有設(shè)置成功粘姜,我安裝確實(shí)沒有設(shè)置成功,可以手動(dòng)設(shè)置熔酷,path增加:D:\Program Files\Geth(安裝的根路徑)
在命令行中執(zhí)行?geth version? 查看到版本即安裝成功孤紧,如下:
2、使用Geth創(chuàng)建以太坊私有鏈
1纯陨、新建創(chuàng)世塊文件
? ? 新建工作目錄文件夾坛芽,例如:Gth留储,在此文件下新建創(chuàng)世塊文件:genesis.json翼抠,內(nèi)容如下:
{
"config": {
"chainId":4528989,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00002",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": { }
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
chainId : 以太坊區(qū)塊鏈網(wǎng)絡(luò)Id咙轩,ethereum主鏈?zhǔn)?,私有鏈只用不要與主鏈沖突即可阴颖。
alloc : 預(yù)留賬戶活喊,如下
??"alloc":{
???"0x0000000000000000000000000000000000000001":{"balance":"121312321"},
???"0x0000000000000000000000000000000000000002":{"balance":"121312321"},
??}
Coinbase: 曠工賬戶
Difficulty: 挖礦難度,0x400量愧,這個(gè)是簡(jiǎn)單钾菊。
extraData:相當(dāng)于備注
gasLimit:最小消耗gas
nonce :?64位隨機(jī)數(shù),用于挖礦偎肃,注意他和mixhash的設(shè)置需要滿足以太坊黃皮書中的要求
parentHash : 上一個(gè)區(qū)塊的Hash值煞烫,因?yàn)槭莿?chuàng)世塊,石頭里蹦出來的累颂,沒有在它前面的滞详,所以是0
? Timestamp : 時(shí)間戳
2、新建第一個(gè)賬戶
命令行cd到genesis.json所在目錄紊馏,我為了方便料饥,放在Geth目錄下了
命令行執(zhí)行初始化客戶端:
初始化:
geth --datadir data0 init genesis.json
啟動(dòng)客戶端:
geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3,admin,personal" --rpcaddr "127.0.0.1" --ipcpath "data0\geth\geth.ipc" --rpcport "8486" --port "30304" --networkid "4528989"--allow-insecure-unlock console
沒有error就是成功了
這里可能出現(xiàn)的錯(cuò)誤要么就是datadir沖突,要么就是端口沖突朱监,自己改改岸啡。
如果networkid沒有和創(chuàng)世塊一致,可能就沒有連到本機(jī)私有鏈赫编,最明顯的問題就是轉(zhuǎn)賬是會(huì)提示余額不足
執(zhí)行命令創(chuàng)建賬戶
// 新建賬戶巡蘸,括號(hào)里是交易密碼
> personal.newAccount("123456")
// 列出客戶端上的賬戶
> eth.accounts
["0xc47420632c4ae1bc4d7954a24b804720ad02fcc0"]
// 顯示賬戶余額
eth.getBalance(eth.accounts[0])
0
// 解鎖
personal.unlockAccount(eth.accounts[0])
// 轉(zhuǎn)賬, 需要?jiǎng)?chuàng)建第2個(gè)賬戶才能交易
eth.sendTransaction({from:eth.accounts[0],to:"0x32bcf0bf330fdfca200d5def003bc5fcac646f90",value:"100"})
開啟挖礦
// 開啟挖礦
miner.start()
// 停止挖礦
miner.stop()
// 挖到后再查看余額,余額會(huì)增加
eth.getBalance(eth.accounts[0])
18000000000000
這樣我們就創(chuàng)建好第一個(gè)賬戶了
3擂送、新建第二個(gè)賬戶
我們?cè)賱?chuàng)建一個(gè)賬戶
// 初始化客戶端
> geth --datadir data1 init genesis.json
//?
> geth --identity "TestNode2" --datadir "data1" --rpc --rpcapi "db,eth,net,web3,admin, personal" --rpcaddr "127.0.0.1" --ipcpath "data1\geth\geth.ipc" --rpcport "8487" --port "30305" --networkid "4528989" --allow-insecure-unlock console
// 新建賬戶赡若,括號(hào)里是交易密碼,密碼可以相同
> personal.newAccount("123456")
// 解鎖賬號(hào)
>?personal.unlockAccount(eth.accounts[0])
// 查看enode
admin.nodeInfo.enode
"enode://cb42a93bc5378357d30f3598942e43f7b7ec69716f42d7789f840e144d57f78c203c1a78d18ff9637fcb76b12da1639010dbfe2ce1c8b1f0d53b02d2a9432a6f@221.232.139.254:30305"
然后在第一個(gè)客戶端上附加這個(gè)節(jié)點(diǎn), encode就是之前記錄的
> admin.addPeer("enode://cb42a93bc5378357d30f3598942e43f7b7ec69716f42d7789f840e144d57f78c203c1a78d18ff9637fcb76b12da1639010dbfe2ce1c8b1f0d5
3b02d2a9432a6f@221.232.139.254:30305")
true
此時(shí)团甲,我們可以使用命令號(hào)轉(zhuǎn)賬了
//客戶端2上輸入eth.accounts查看賬號(hào)id
> eth.accounts
["0x5e0bbf69fbcfbe730c6d1c972b541f97a549f5d0"]
//現(xiàn)在從第一個(gè)客戶端賬戶向第2個(gè)客戶端賬戶劃點(diǎn)錢逾冬,to就是賬號(hào)2的id,躺苦,這里的錢單位我不太確定
> eth.sendTransaction({from:eth.accounts[0],to:"0x5e0bbf69fbcfbe730c6d1c972b541f97a549f5d0",value:"100"})
轉(zhuǎn)賬后必須開啟挖礦才能傳輸上去身腻,雙方都可以開起來挖礦
// 開啟挖礦
miner.start()
// 停止挖礦
miner.stop()
// 顯示余額
eth.getBalance(eth.accounts[0])
可以明顯看到,少了100
這樣我們就完成了2個(gè)客戶端的交互與轉(zhuǎn)賬