如何快速部署Simplechain子鏈

買賣虛擬貨幣

我們都知道simplechain是一種主子鏈架構,主鏈simplechain是pow共識演算法的公鏈。那如何快速建立一條屬於自己的子鏈呢?下面我們就是快速部署一條子鏈流程。首先clone 原始碼, 然後按照下面流程操作。

部署dpos共識子鏈網路

  1. 創世區塊
{ "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最小允許的投票額度,單位為wei

  • voterreward dpos投票者能否獲得獎勵(若開啟,則在生產者出塊時投票者也能獲得分紅)

  • genesistimestamp dpos允許初始塊出塊的時間,並透過此時間計算後續出塊的時間與生產者

  • signers dpos初始生產者列表

  • pbft dpos是否在每輪出塊後使用pbft的方式確認每一個區塊

  • alloc dpos初始生產者抵押投票數額

  1. 子鏈初始化流程 方式一. 使用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目錄下建立對應節點檔案

  1. 子鏈啟動流程
  2. 啟動節點
sipe --datadir=dposdata --mine --etherbase=<生產者地址> --unlock=<生產者地址> --password=<密碼檔案> --port=30303 --role=subchain --v5disc
  1. 連線其他節點
sipe --datadir=dposdata --mine --etherbase=<生產者地址> --unlock=<生產者地址> --password=<密碼檔案> --port=30304 --role=subchain --v5disc --bootnodesv5={enode1} --bootnodesv4={enode1}
  1. 投票與提案

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")})
  1. 檢視共識狀態
> dpos.getsnapshot()
  • candidates 礦工候選者名單

  • confirmednumber 確認的區塊高度

  • historyhash 最近兩輪出塊的塊hash,用來計算新一輪的生產者出塊順序

  • minerreward 每個塊生產者獲得的獎勵千分比,若開啟voterreward,剩下的為投票者的獎勵

  • signers 列舉生產者名單與出塊順序

  • punished 列舉每個生產者因未按時出塊受到的懲罰資訊

  • tally 列舉每個候選人的總得票數

  • votes 列舉投票資訊

  • voters 投票人發起投票的區塊高度

  • proposals 提案列表

部署pbft共識子鏈網路

  1. 創世區塊
{ "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指定為0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365

  • extradata pbft初始生產者計算後得到的header.extra

  • alloc pbft暫無區塊獎勵,因此需要提前分配代幣

  1. 子鏈初始化流程 方式一. 使用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
  1. 將節點的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目錄下建立對應節點檔案

  1. 子鏈啟動流程
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的過期時間,單位毫秒,預設值為10000

  • istanbul.blockperiod pbft出塊間隔,單位秒,預設值為1

4.檢視共識狀態

> istanbul.getsnapshot()
  • validators pbft區塊生產者名單

  • votes 新增validator或移除validator的投票

  • tally 總投票情況

部署raft共識子鏈網路

  1. 創世區塊
{ "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共識只有存在交易的時候才打包區塊,因此需要提前分配代幣

  1. 子鏈初始化流程 方式一. 使用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/consensus目錄下執行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目錄下建立對應節點檔案

  1. 子鏈啟動流程
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的生態中

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;