NO IMAGE

區塊鏈 之 搭建以太坊私有鏈

作者:鄒祁峰
郵箱:[email protected]
部落格:http://blog.csdn.net/qifengzou
日期:2018.03.02 13:32
轉載請註明來自”祁峰”的CSDN部落格

1 引言

本人使用的是Ubuntu作業系統,在搭建以太坊私鏈的過程中踩到過不少的坑.希望此文能幫助新學者快速的掌握以太坊的搭建過程.

2 安裝步驟

如果在Ubuntu中直接使用”apt-get install geth”安裝以太坊環境,雖然在終端模式下能夠正常使用geth的相關命令,但是進行智慧合約的部署操作”truffle migrate”時可能會出現如下異常: [原因:由於truffle與geth的版本不匹配]

Using network ‘development’.

Running migration: 1_initial_migration.js
Deploying Migrations…
… 0x41fc37a37333d251c762c6d1e337e58abe89e941ce94a9655897586e010b0b43
Migrations: 0x4a350b563a48fc1d7e2f85057ae6aabc2b6f3827
Saving successful migration to network…
… 0x1fc8a9c099d743812f0469c83cce6cd3d550d9725fdbe0f59650183d705c4c26
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: unknown transaction
at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)
…(此處省略)

因此, 本人強烈推薦使用原始碼搭建以太坊環境.

2.1 前期準備

以太坊是使用go語言編寫的,因此,首先需要安裝和配置go編譯環境. 具體過程可在網上查詢.

2.2 下載原始碼

可通過如下命令下載官方原始碼:

# go get github.com/ethereum/go-ethereum

待以上操作完成後,以太坊原始碼將會存放在$GOPATH/src/github.com/ethereum/go-ethereum目錄下.[備註: 環境變數$GOPATH是安裝go程式時配置的變數, 關於go的安裝過程請上網查詢]

2.3 編譯原始碼

進入原始碼目錄並執行編譯操作:

# cd $GOPATH/src/github.com/ethereum/go-ethereum // 切至原始碼目錄
# git checkout release/1.7 // 備註:當master編譯失敗時可以切換到其他版本進行編譯
# make // 備註:執行編譯

完成以上編譯後, 生成的可執行程式geth就存放在原始碼中的./build/bin/目錄下.只需將geth程式拷貝到$PATH目錄中便可使用以太坊了.

3 搭建私鏈

以太坊節點之間能夠相互連線需滿足以下2個條件:

1.相同的協議版本
2.相同的networkid

搭建私鏈最方便的方法是通過geth命令中的--networkid選項, 設定一個與主網不同的networkid(主網networkid值為1), 這也是官方推薦的方式.

3.1 創世區塊

序號機器IP備註
0110.168.0.1初始節點

1.新建目錄

# mkdir private-block
# cd private-block

2.新建配置
在私鏈目錄下新建配置檔案,配置檔名:genesis.json(可以隨便命名)

{
"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": {}
}

3.創世節點
通過如下命令初始化創世節點:

# geth --datadir ./data/00 init genesis.json

4.啟動私鏈
通過如下命令啟動私鏈, 該命令的各選項含義和作用將在後續博文中進行講解.

# geth --datadir ./data/00 --networkid 15 --port 28000 --rpc --rpcaddr 10.168.0.1 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --nodiscover console

引數描述:

序號欄位描述備註
01datadir資料載入和儲存目錄
02networkid網路編號, 主網ID為1,私網ID為其他值
03port私鏈節點之間的通訊埠
04rpc是否開啟HTTP-RPC功能預設關閉
05rpcaddr指定HTTP-RPC網絡卡IP預設127.0.0.1,導致其他機器無法訪問
06rpcport指定HTTP-RPC通訊埠預設8545
07rpcapi指定提供哪些HTTP-RPC的介面

完成以上操作後,私鏈就已搭建完成, 這時可以輸入以太坊的相關命令進行賬戶管理/節點管理/挖礦/轉賬交易等操作了.

5.建立賬號
1.檢視當前節點的賬號列表

> eth.accounts
[]

2.新建賬號
通過personal.newAccount()新建賬號, 該方法的引數為私鑰, 輸出結果為公鑰.私鑰用於資料的加密, 公鑰用於資料的解密, 公鑰也是賬戶的地址.

> personal.newAccount(“123456”)
“0x5b901c2495c077f515ae84fc53206f2eb3bf8296”

> eth.accounts // 檢視賬號資訊
[“0x5b901c2495c077f515ae84fc53206f2eb3bf8296”]

3.節點資訊
每個區塊鏈節點的enode是唯一的, 新建節點要加入某鏈, 其需要將該鏈中某節點的enode加入到自己的遠端節點列表中. 可通過以下命令檢視enode值:

>admin.nodeInfo.enode // 檢視enode資訊
“enode://3a5d4f2c15ae0e16bbf1e7c819558373e0b6d4dfcb72a931c3e59ed72f01fc217[email protected][::]:28000?discport=0”

6.挖礦操作
1.開始挖礦

> miner.start()

2.開始挖礦

> miner.stop()

3.賬戶餘額

> eth.getBalance(eth.accounts[0])
635000000000000000000

7.後臺執行
如果要後臺執行以太坊節點, 則可輸入以下指令:

# nohup geth --datadir ./data/00 --networkid 15 --port 28000 --rpc --rpcaddr 10.168.0.1 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --unlock '0' &

3.2 新增節點

序號機器IP備註
0110.168.0.2新增節點

1.初始節點
通過如下命令初始化節點:

# geth --datadir ./data/00 init genesis.json // 配置資訊與初始節點一直

2.啟動節點
通過如下命令啟動私鏈新節點, 該命令的各選項含義和作用將在後續博文中進行講解.

# geth --datadir ./data/00 --networkid 15 --port 61910 --rpc --rpcaddr 10.168.0.2 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --nodiscover console

3.建立賬號
1.檢視當前節點的賬號列表

> eth.accounts
[]

2.新建賬號
通過personal.newAccount()新建賬號, 該方法的引數為私鑰, 輸出結果為公鑰.私鑰用於資料的加密, 公鑰用於資料的解密, 公鑰也是賬戶的地址.

> personal.newAccount(“123456”)
“0x5b901c2495c077f515ae84fc53206f2eb3bf8296”

> eth.accounts
[“0x5b901c2495c077f515ae84fc53206f2eb3bf8296”]

4.新增節點
由於此時該節點並未與其他節點建立聯絡, 因此此時該節點還是一個孤立節點. 其要加入剛才的私鏈中, 需要將其他一個或多個節點加入到本地:

>admin.addPeer(“enode://3a5d4f2c15ae0e16bbf1e7c819558373e0b6d4dfcb72a931c3e59ed72f01fc217[email protected]10.168.0.1:28000?discport=0”) // 新增遠端節點
>admin.peers // 檢視遠端節點列表

5.後臺執行
如果要後臺執行以太坊節點, 則可輸入以下指令:

# nohup geth --datadir ./data/00 --networkid 15 --port 28000 --rpc --rpcaddr 10.168.0.2 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --unlock '0' &