我們都知道simplechain是一種主子鏈架構,主鏈simplechain是pow共識演算法的公鏈。那如何快速建立一條屬於自己的子鏈呢?下面我們就是快速部署一條子鏈流程。首先clone 原始碼, 然後按照下面流程操作。
部署dpos共識子鏈網路
- 創世區塊
{
"config": {
"chainid": 10388,
"dpos": {
"period": 3,
"epoch": 300,
"maxsignerscount": 21,
"minvoterbalance": 100000000000000000000,
"genesistimestamp": 1554004800,
"signers": [
"3d50e12fa9c76e4e517cd4ace1b36c453e6a9bcd",
"f97df7fe5e064a9fe4b996141c2d9fb8a3e2b53e",
"ef90068860527015097cd031bd2425cb90985a40"
],
"pbft": false,
"voterreward": true
}
},
"nonce": "0x0",
"timestamp": "0x5ca03b40",
"extradata": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gaslimit": "0x47b760",
"difficulty": "0x1",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"3d50e12fa9c76e4e517cd4ace1b36c453e6a9bcd": {
"balance": "0x21e19e0c9bab2400000"
},
"ef90068860527015097cd031bd2425cb90985a40": {
"balance": "0x21e19e0c9bab2400000"
},
"f97df7fe5e064a9fe4b996141c2d9fb8a3e2b53e": {
"balance": "0x21e19e0c9bab2400000"
}
},
"number": "0x0",
"gasused": "0x0",
"parenthash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
period
dpos出塊間隔時間,單位為秒epoch
dpos間隔多少個塊定期清除投票(清除後需要投票者重新發起投票交易)maxsignerscount
dpos最大允許的生產者數量minvoterbalance
dpos最小允許的投票額度,單位為weivoterreward
dpos投票者能否獲得獎勵(若開啟,則在生產者出塊時投票者也能獲得分紅)genesistimestamp
dpos允許初始塊出塊的時間,並透過此時間計算後續出塊的時間與生產者signers
dpos初始生產者列表pbft
dpos是否在每輪出塊後使用pbft的方式確認每一個區塊alloc
dpos初始生產者抵押投票數額
- 子鏈初始化流程 方式一. 使用sipe初始化 1.建立或匯入生產者賬戶
sipe --datadir=dposdata account new
2.將建立或匯入的生產者地址寫入genesis.json中,同時寫入初始投票數額(參考1.創世區塊)
3.初始化子鏈節點
sipe --datadir=dposdata --role=subchain init genesis.json
方式二. 使用consensus工具一鍵初始化叢集 在cmd/consensus
目錄下執行init_dpos.sh
cd cmd/consensus
./init_dpos.sh --numnodes 3
numnodes
生成叢集節點數量
初始化完成後,會在cmd/consensus/dposdata
目錄下建立對應節點檔案
- 子鏈啟動流程
- 啟動節點
sipe --datadir=dposdata --mine --etherbase=<生產者地址> --unlock=<生產者地址> --password=<密碼檔案> --port=30303 --role=subchain --v5disc
- 連線其他節點
sipe --datadir=dposdata --mine --etherbase=<生產者地址> --unlock=<生產者地址> --password=<密碼檔案> --port=30304 --role=subchain --v5disc --bootnodesv5={enode1} --bootnodesv4={enode1}
- 投票與提案
4.1 發起投票交易
> eth.sendtransaction({from:"<投票地址>",to:"<被投票地址>",value:0,data:web3.tohex("dpos:1:event:vote")})
4.2 發起取消投票交易
> eth.sendtransaction({from:"<投票地址>",to:"<投票地址>",value:0,data:web3.tohex("dpos:1:event:devote")})
4.3 發起更改礦工獎勵的提案
- 將礦工區塊獎勵比例改為
666‰
> eth.sendtransaction({from:"<提案地址>",to:"<提案地址>",value:0,data:web3.tohex("dpos:1:event:proposal:proposal_type:3:mrpt:666")})
4.4 發起更改最小允許投票額度的提案
- 將最小允許投票額度改為
10
ether
> eth.sendtransaction({from:"<提案地址>",to:"<提案地址>",value:0,data:web3.tohex("dpos:1:event:proposal:proposal_type:6:mvb:10")})
4.5 透過或反對提案
yes
透過提案,no
反對提案
> eth.sendtransaction({from:"<投票地址>",to:"<投票地址>",value:0,data:web3.tohex("dpos:1:event:declare:hash:<提案hash值>:decision:yes")})
- 檢視共識狀態
> dpos.getsnapshot()
candidates
礦工候選者名單confirmednumber
確認的區塊高度historyhash
最近兩輪出塊的塊hash,用來計算新一輪的生產者出塊順序minerreward
每個塊生產者獲得的獎勵千分比,若開啟voterreward
,剩下的為投票者的獎勵signers
列舉生產者名單與出塊順序punished
列舉每個生產者因未按時出塊受到的懲罰資訊tally
列舉每個候選人的總得票數votes
列舉投票資訊voters
投票人發起投票的區塊高度proposals
提案列表
部署pbft共識子鏈網路
- 創世區塊
{
"config": {
"chainid": 10388,
"istanbul": {
"epoch": 30000,
"policy": 0
}
},
"nonce": "0x0",
"timestamp": "0x0",
"extradata": "0x0000000000000000000000000000000000000000000000000000000000000000f843f83f941c46d10e91eafaac430718df3658b1a496b827bd94b67ee9395542b227c99941eb4168e3f3c6502dd8949d6510b637970085962c908c69e63e9d36a36cb480c0",
"gaslimit": "0xe0000000",
"difficulty": "0x1",
"mixhash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {},
"number": "0x0",
"gasused": "0x0",
"parenthash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
epoch
pbft間隔多少個塊定期清除投票policy
pbft提議者輪詢方式,0為roundrobin(按順序更換),1為sticky(提議者未出錯時不更換提議者)mixhash
pbft區塊須將mixhash指定為0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365extradata
pbft初始生產者計算後得到的header.extraalloc
pbft暫無區塊獎勵,因此需要提前分配代幣
- 子鏈初始化流程 方式一. 使用sipe初始化 1.建立或匯入生產者賬戶
sipe --datadir=pbftdata account new
2.使用consensus工具生成extradata,寫入到genesis.json中(參考1.創世區塊)
cd cmd/consensus
./init_pbft.sh --numnodes 1 --validator <生產者地址>
3.初始化子鏈節點
sipe --datadir=pbftdata --role=subchain init genesis.json
- 將節點的nodekey寫入到pbftdata/static-nodes.json中(nodekey公鑰為生產者公鑰)
方式二. 使用consensus工具一鍵初始化叢集 在cmd/consensus目錄下執行init_pbft.sh
cd cmd/consensus
./init_pbft.sh --numnodes 3 --ip 127.0.0.1 127.0.0.2 127.0.0.3 --port 21001 21002 21003
numnodes
生成叢集節點數量ip
指定節點的ip列表(預設ip為127.0.0.1)port
指定節點的埠列表(預設埠為21001~2100x,x為numnodes)
初始化完成後,會在cmd/consensus/pbftdata
目錄下建立對應節點檔案
- 子鏈啟動流程
sipe --datadir=pbftdata --istanbul.requesttimeout=10000 --istanbul.blockperiod=5 --syncmode=full --mine --minerthreads=1 --port=21001 --role=subchain
port
需要和static-nodes.json中配置的enode保持一致istanbul.requesttimeout
pbft每個view的過期時間,單位毫秒,預設值為10000istanbul.blockperiod
pbft出塊間隔,單位秒,預設值為1
4.檢視共識狀態
> istanbul.getsnapshot()
validators
pbft區塊生產者名單votes
新增validator或移除validator的投票tally
總投票情況
部署raft共識子鏈網路
- 創世區塊
{
"config": {
"chainid": 10,
"raft": true
},
"nonce": "0x0",
"timestamp": "0x0",
"extradata": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gaslimit": "0xe0000000",
"difficulty": "0x0",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"1e69ebb349e802e25c7eb3b41adb6d18a4ae8591": {
"balance": "0x21e19e0c9bab2400000"
},
"73ce1d55593827ab5a680e750e347bf57485a511": {
"balance": "0x21e19e0c9bab2400000"
},
"b8564a5657fa7dc51605b58f271b5bafad93b984": {
"balance": "0x21e19e0c9bab2400000"
}
},
"number": "0x0",
"gasused": "0x0",
"parenthash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
raft
true為使用raft共識alloc
raft共識只有存在交易的時候才打包區塊,因此需要提前分配代幣
- 子鏈初始化流程 方式一. 使用sipe初始化 1.建立或匯入生產者賬戶
sipe --datadir=raftdata account new
2.初始化子鏈節點
sipe --datadir=raftdata --role=subchain init genesis.json
4.將節點的nodekey
寫入raftdata/static-nodes.json
中(nodekey公鑰為生產者公鑰)
方式二. 使用consensus工具一鍵初始化叢集 在cmd/consensu
s目錄下執行init_pbft.sh
cd cmd/consensus
./init_raft.sh --numnodes 3 --ip 127.0.0.1 127.0.0.2 127.0.0.3 --port 21001 21002 21003 --raftport 50401 50402 50403
numnodes
生成叢集節點數量ip
指定節點的ip列表(預設ip為127.0.0.1)port
指定節點的埠列表(預設埠為21001~2100x,x為numnodes)raftport
指定節點的raft通訊埠列表(預設埠為50401~5040x,x為numnodes)
初始化完成後,會在cmd/consensus/raftdata目錄下建立對應節點檔案
- 子鏈啟動流程
sipe --datadir=raftdata --raft --port=21001 --raftport=50401 --role=subchain
port
需要和static-nodes.json中配置的enode保持一致raft
使用raft模式raftport
raft埠號,需要和static-nodes.json中配置的enode保持一致
4.檢視共識狀態
> istanbul.getsnapshot()
validators
pbft區塊生產者名單votes
新增validator或移除validator的投票tally
總投票情況
上面就是部署不同共識子鏈的流程,不久我們的區塊鏈管理平臺將支援一鍵部署子鏈,屆時我們的社羣開發者和愛好者可以更方便的部署一條子鏈,加入到simpelchain的生態中