開發(fā)以太坊相關(guān)還是私鏈更方便。
本文為linux環(huán)境操作。windows環(huán)境需要自行修改目錄。
準(zhǔn)備
創(chuàng)建一個(gè)為私鏈專用的系統(tǒng)用戶:ethPrivate 在ethPrivate的home目錄操作。
步驟:
- 準(zhǔn)備一個(gè)創(chuàng)世塊文件
genesis.json - 用
genesis.json初始化數(shù)據(jù)到一個(gè)目錄node1 - 在
node1中啟動(dòng)一個(gè)節(jié)點(diǎn) - 在另一個(gè)目錄
node2,重復(fù)2操作,來為另一個(gè)節(jié)點(diǎn)做初始化 - 在
node2中啟動(dòng)另一個(gè)節(jié)點(diǎn)(端口號(hào)要區(qū)分開來) - 重復(fù)4,5步驟來啟動(dòng)下一個(gè)節(jié)點(diǎn)
- 在啟動(dòng)的節(jié)點(diǎn)中添加其他節(jié)點(diǎn)
創(chuàng)世塊文件
創(chuàng)世塊文件用來初始化數(shù)據(jù),如果私鏈上的節(jié)點(diǎn)要互聯(lián)必須用同一個(gè)創(chuàng)世塊文件來初始化。
初始化之后,啟動(dòng)節(jié)點(diǎn)時(shí)不會(huì)再讀取該文件。
文件示例如下:/home/ethPrivate/genesis.json
{
"config": {
"chainId": 200,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0xffffff",
"extraData" : "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fb",
"gasLimit" : "0xffffffff",
"nonce" : "0x0000000000000000",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00",
"alloc": {
"de1e758511a7c67e7db93d1c23c1060a21db4615":{"balance":"300000"},
"27dc8de9e9a1cb673543bd5fce89e83af09e228f":{"balance":"500000"}
}
}
| key | 說明 |
|---|---|
| alloc | 用來預(yù)置賬號(hào)以及賬號(hào)的以太幣數(shù)量。因?yàn)樗接墟溚诘V比較容易,所以不需要預(yù)置有幣的賬號(hào)。 |
| nonce | 生成的工作證明的散列。注意它和 mixhash 的設(shè)置需要滿足以太坊的 Yellow paper,4.3.4.Block Header Validity,(44)章節(jié)所描述的條件。 |
| difficulty | 設(shè)置當(dāng)前區(qū)塊的難度,如果難度過大,CPU 挖礦就越難,這里設(shè)置較小難度,方便 CPU 挖礦,十六進(jìn)制。 |
| mixhash | 與 nonce 配合用于挖礦,由上一個(gè)區(qū)塊的一部分生成的 hash。注意它和 nonce 的設(shè)置需要滿足以太坊的 Yellow paper,4.3.4.Block Header Validity,(44)章節(jié)所描述的條件。 |
| coinbase | 礦工的賬號(hào),可以在創(chuàng)建私鏈之前導(dǎo)入已經(jīng)創(chuàng)建好的賬號(hào)。 |
| parentHash | 上一個(gè)區(qū)塊的 hash 值,創(chuàng)始區(qū)塊沒有上一個(gè)區(qū)塊,所以設(shè)置為 0。 |
| extraData | 附加信息,可以填寫任意信息,已達(dá)到私有鏈的個(gè)性化,可以加入自己的名字等。 |
| gasLimit | 該值設(shè)置對(duì) GAS 的消耗總量限制,用來限制區(qū)塊能包含的交易信息總和,私有鏈可以設(shè)置為最大值。 |
如果創(chuàng)始?jí)K文件或者網(wǎng)絡(luò)id不一樣,節(jié)點(diǎn)無法互聯(lián)
挖礦難度
初始?jí)K的難度值決定整個(gè)鏈的速度.
| difficulty值 | 十進(jìn)制 | 生成速度 |
|---|---|---|
| 2ffffd | 3145725 | 一分鐘五到十個(gè)之間個(gè) |
| 5ffffa | 6291450 | 一分鐘五個(gè) |
| bffff4 | 12582900 | 六分鐘挖了八個(gè) |
| 3bfffc4 | 62914500 | 六分鐘兩個(gè) |
| 77fff88 | 125829000 | 十分鐘兩個(gè) |
| 12bffed4 | 314572500 | 15分鐘沒有一個(gè) |
搭建網(wǎng)絡(luò)
初始化和啟動(dòng)
#初始化兩個(gè)節(jié)點(diǎn)
geth --datadir /home/ethPrivate/node0 init genesis.json
geth --datadir /home/ethPrivate/node1 init genesis.json
#后臺(tái)啟動(dòng)第一個(gè)節(jié)點(diǎn),網(wǎng)絡(luò)id200,端口2001
nohup geth --datadir /home/ethPrivate/node0 --networkid 200 --port 2001 --nodiscover > /dev/null 2>&1 &
#后臺(tái)啟動(dòng)第二個(gè)節(jié)點(diǎn),網(wǎng)絡(luò)id200,端口2011,rpc端口2012
nohup geth --datadir /home/ethPrivate/node1 --networkid 200 --port 2011 --nodiscover > /dev/null 2>&1 &
添加節(jié)點(diǎn)
節(jié)點(diǎn)啟動(dòng)后可以通過ipc,rpc,websocket等方式與節(jié)點(diǎn)通信。在同一臺(tái)機(jī)器上一般使用geth 的ipc鏈接方式。不在同一臺(tái)機(jī)器則使用其他方式。
ipc鏈接后對(duì)節(jié)點(diǎn)的操作不受限制。其他方式則需要單獨(dú)開啟,并且可能需要對(duì)各種模塊的開放訪問限制。
#鏈接到第1個(gè)節(jié)點(diǎn)
geth attach ipc:/home/ethPrivate/node0/geth.ipc
#查看節(jié)點(diǎn)信息
> admin.nodeInfo.enode
"enode://07007...cf6fa@[::]:2001?discport=0"
> exit
#鏈接到第2個(gè)節(jié)點(diǎn)
geth attach ipc:/home/ethPrivate/node1/geth.ipc
#查看伙伴節(jié)點(diǎn)
> admin.peers
[]
#添加伙伴節(jié)點(diǎn)
> admin.addPeer('enode://07007...cf6fa@[::]:2001?discport=0')
true
#再次查看伙伴節(jié)點(diǎn)
> admin.peers
[{
caps: ["eth/63"],
id: "07007...cf6fa",
name: "Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.2",
network: {
localAddress: "[::1]:37098",
remoteAddress: "[::1]:2001"
},
protocols: {
eth: {
difficulty: 6291450,
head: "0x3358e132db6a144c73f09605055def2720dc954983aa40c046ba8ca735e9e9d2",
version: 63
}
}
}]
> exit
私鏈網(wǎng)絡(luò)搭建完成。