首先說明,本次的Quorum部署是在一臺Ubuntu服務器上的,實際生產環境建議一個節點一臺服務器。一臺服務器上部署多個節點的流程跟多個服務器部署多個節點的流程其實是一樣的。
並且,經過我的親身測試,Quorum鏈4個節點就能夠正常運行起來。
我的演示系統環境時 Ubuntu 18.04 LTS
環境要求:
golang (ubuntu建議安裝方法:sudo apt install golang)
步驟1:
要部署Quorum鏈,首先編譯源代碼得到可運行的Quorum可執行文件。在github上獲取源碼,並編譯
git clone https://github.com/jpmorganchase/quorum.git
cd quorum
make all
編譯完成開始設置環境變量,指向/quorum/build/bin。
因爲我是一臺服務器搭建4個節點,所以我需要把不同節點的數據分開存放在不同的文件夾內,我是要把所有的數據都存在/mnt/volume_nyc1_02目錄下。
mkdir node1
mkdir node2
mkdir node3
mkdir node4
步驟2:
接下來我們就可以針對每一個節點進行初始化。
geth --datadir node1 account new //這段命令是node1在創建賬戶
控制檯會有返回信息
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: //第一次輸入密碼
Repeat passphrase: //再次輸入密碼
Address: {bb9ef512675df6********4c259143d9e660ce2d} //創建成功返回的賬戶地址
步驟3:
重複剛纔的命令操作,把node1分別換成node2,node3,node4,確保每個節點下都有一個可操作賬戶,方便後面測試操作。接下來創建一個公用的genesis.json,因爲是公用的, 所以我們把genesis.json放在volume_nyc1_02目錄下。
{
"alloc": {
"0xbb9ef512675df6d2c1f7874c259143d9e660ce2d": { //替換上node1剛剛產生的賬戶地址
"balance": "10000000000000000000000" //這裏是設置該賬戶初始化餘額
},
"0xf4674808becfbecfb0452dde30cfe5c154394ecc": { //替換上node2產生的賬戶地址
"balance": "10000000000000000000000"
},
"0x0ba0306e5fe478a7fbb7fc487b25a9e1e783bade": { //替換上node3......
"balance": "10000000000000000000000"
},
"0x26043d75501d2698b41a99a6d19b87347992f7e2": { //替換上node4......
"balance": "10000000000000000000000"
}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"config": {
"homesteadBlock": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"chainId": 10,
"eip150Block": 0,
"eip155Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip158Block": 0,
"maxCodeSize": 35,
"maxCodeSizeChangeBlock" : 0,
"isQuorum": true
},
"difficulty": "0x0",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0xE0000000",
"mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
"nonce": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
保存文檔退出。
步驟4:
接下來創建每個節點密鑰的nodekey
bootnode --genkey=nodekey1 // 創建節點1的nodekey
bootnode --genkey=nodekey2 //節點2的nodekey
......
然後分別放到對應節點目錄下
mv nodekey1 node1/nodekey //移動nodekey1到node1目錄下,重命名爲nodekey
mv nodekey2 node2/nodekey //移動nodekey2到node2目錄下,重命名爲nodekey
.....
解析nodekey,顯示節點ID,(這個節點ID很重要的)
bootnode --nodekey=node1/nodekey --writeaddress //解析節點1的nodekey
fa0a52153370170f8fb9e0bd3a324bd6f11ce4b8ef500baa8c38596d7c9bdc65629903fad30001a319c2b1603a177cc44ab4dc65b8107354e32da3985e272431 //解析出的結果,node id
bootnode --nodekey=node2/nodekey --writeaddress
.....
步驟5:
接下來就是分別對每個節點操作,首先從node1(節點1)開始
接下來的操作依舊是在我的/mnt/volume_nyc1_02目錄下操作,創建static-nodes.json文件,該文件是展示鏈中節點連接信息
[
"enode://fa0a52153370170f8fb9e0bd3a324bd6f11ce4b8ef500baa8c38596d7c9bdc65629903fad30001a319c2b1603a177cc44ab4dc65b8107354e32da3985e272431@127.0.0.1:21001?discport=0&raftport=50001"
]
//這裏的enode值就是剛剛獲取的node id
//127.0.0.1:21001 是服務器地址+程序通訊端口號,因爲我是一臺服務器4個節點所以是21001,21002....
//raftport 是raft通訊端口號,跟上面一樣,50001,50002.....
並且把當前static-nodes.json文件複製到node1目錄下,是複製哦
cp static-nodes.json node1
步驟6:
節點初始化創世塊
geth --datadir node1 init genesis.json
步驟7:
編寫節點1啓動腳本:startnode1.sh
PRIVATE_CONFIG=ignore nohup geth --datadir node1 --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50001 --rpc --rpcaddr 0.0.0.0 --rpcport 22001 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21001 >> node1.log 2>&1 &
//50001 22001 21001 就是幾個對應的端口號
給startnode1.sh文件設置權限
chmod +x startnode1.sh
然後運行腳本啓動節點,判斷是否成功很簡單,查看node1目錄下是否有 geth.ipc 文件,如果有,就說明啓動成功
打開geth控制檯,並查看raft共識狀態
geth attach node1/geth.ipc
> raft.cluster
因爲當前節點是加入到鏈中的第一個節點,所以模式是以minter的角色存在的。至此一個基礎節點部署完成了。隱私管理模塊後面再部署。
接下來部署第二個節點。
步驟8:
先修改當前目錄(我的目錄:/mnt/volume_nyc1_02)下的static-nodes.json文件,把節點2的node id,ip,port信息添加上去
[
"enode://fa0a52153370170f8fb9e0bd3a324bd6f11ce4b8ef500baa8c38596d7c9bdc65629903fad30001a319c2b1603a177cc44ab4dc65b8107354e32da3985e272431@127.0.0.1:21001?discport=0&raftport=50001",
"enode://98e7cbbe32bf437a44bee225f33ffbe4ca6a575ce6ca26f8fa5e67af2b026030f1c9e84fa638a9d78684ed248f2b623d844eac4e11d3873e0dfe59e6b6334f23@127.0.0.1:21002?discport=0&raftport=50002"
]
然後複製到node2目錄下
步驟9:
初始化節點2的創世塊
geth --datadir node2 init genesis.json
步驟10:
然後打開節點1的控制檯,通過控制檯命令添加共識節點node2,raft.addPeer('這裏直接把static-nodes中 node2的信息複製進來就行')
geth attach node1/geth.ipc
>raft.addPeer('enode://98e7cbbe32bf437a44bee225f33ffbe4ca6a575ce6ca26f8fa5e67af2b026030f1c9e84fa638a9d78684ed248f2b623d844eac4e11d3873e0dfe59e6b6334f23@127.0.0.1:21002?discport=0&raftport=50002')
執行raft.cluster命令查詢節點狀態,能夠查到node2信息,說明添加成功
步驟11:
編寫節點2啓動腳本:startnode2.sh,並且給startnode.sh設置權限,然後運行該文件。
PRIVATE_CONFIG=ignore nohup geth --datadir node2 --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50002 --rpc --rpcaddr 0.0.0.0 --rpcport 22002 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21002 >> node2.log 2>&1 &
老規矩,查看geth.ipc是否在node2的目錄下,如果有,說明運行成功
接下來的其他節點啓動照着節點2的來就是了。其實就是從步驟8修改重複執行
這裏只是節點啓動起來了,但是隱私管理模塊還沒有部署,下一個文章我會繼續寫Tessera隱私管理模塊的部署。