升級服務鏈
Kaia 及其 ServiceChain 不斷髮布新版本,以開發新功能和修復漏洞。 本頁是升級 ServiceChain 二進制文件和設置 ServiceChain 硬分叉區塊編號的指南。
升級
本節介紹如何升級 ServiceChain 二進制文件。
注意* 服務鏈二進制文件的升級可能是不可逆和向後兼容的,這意味著您不能降級到舊版本。 有關詳細信息,請參閱發行說明。 例如,Kaia v1.9.0 發佈說明 說:
注意:該版本更新了數據庫版本,以支持快照同步。 更新到 v1.9.0 後,您不能使用現有數據降級到舊版本。
您可以通過以下鏈接獲取最新版的 Kaia 和 ServiceChain 二進制文件:
要升級 ServiceChain 二進制文件,請停止 ServiceChain 節點並替換二進制文件。 例如,您可以使用以下命令停止 SCN 節點,並將二進制文件替換為更新的二進制文件。
$ kscnd stopShutting down kscnd: OK$ cp /path/to/new/kscn /path/to/original/kscn
升級後可以重新啟動 ServiceChain 節點。 但是,如果計劃在 ServiceChain 中激活硬分叉,就必須保持 ServiceChain 節點的宕機。 有關 ServiceChain 硬分叉的說明,請參閱 硬分叉。
$ kscnd start
硬分叉
本節說明在 ServiceChain 應用 Kaia hard fork 的步驟。
要將硬分叉應用於 ServiceChain,您需要
- 為硬分叉選擇一個合適的區塊編號
- 將 ServiceChain 二進制版本升級到支持硬分叉的版本
- 在服務鏈中設置硬分叉區塊編號
1) 為硬分叉選擇一個合適的區塊編號
在 ServiceChain 的 Javascript 控制檯中,您可以檢查當前的區塊編號,如下圖所示。
$ kscn attach --datadir ~/kscnd_home歡迎訪問 Kaia JavaScript 控制檯!instance:Kaia/vX.X.X/XXXX-XXXX/goX.X.X datadir: ~/kscnd_home modules: admin:1.0 debug:1.0 eth:1.0 governance:1.0 istanbul:1.0 klay:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0> kaia.blockNumber1234
現在,您必須選擇一個合適的區塊編號來激活硬分叉。 確保當前區塊和硬分叉區塊之間有足夠多的區塊(每秒產生一個)。
2. 升級服務鏈二進制文件
有關升級 ServiceChain 二進制文件的說明,請參閱本頁的 Upgrade 部分。 確保暫時關閉(或停止)ServiceChain 節點。 設置硬分叉區塊編號後,您將重新啟動它們。
3. 設置硬分叉區塊編號
如果已將 ServiceChain 二進制文件升級為支持所需硬分叉的版本,則可以通過更新 genesis 重新初始化鏈配置,在 ServiceChain 中設置硬分叉區塊編號。
更新 genesis 並重新初始化所有 ServiceChain 節點的鏈配置
首先,在 genesis.json
的 config
字段中指定硬分叉編號。 例如,如果要在 ServiceChain 中激活 Magma 硬分叉,則應在創世的 "配置 "字段中指定 "magmaCompatibleBlock",如下所示。
{ "config": { "chainId": 1000, "istanbulCompatibleBlock": 0, ... "magmaCompatibleBlock": 1500, ... }, ...}
要在鏈配置中啟用硬分叉,應先啟用之前的硬分叉。 也就是說,要啟用 Magma 硬分叉,EthTxType 硬分叉應該已經啟用。 如果鏈配置中缺少前面硬分叉的兼容區塊編號字段,也必須添加。
例如,如果你想設置 Magma 硬分叉區塊編號,而你的 genesis.json
的 config
字段中沒有 ethTxTypeCompatibleBlock
,如下所示:
{ "config": { "chainId": 1000, "istanbulCompatibleBlock": 0, "londonCompatibleBlock": 0, "istanbul": { "epoch": 3600, "policy":0, "sub":21 }, ... }}
在 "配置 "字段中添加 "magmaCompatibleBlock "時,還必須添加 "ethTxTypeCompatibleBlock",如下所示。
{ "config": { "chainId": 1000, "istanbulCompatibleBlock": 0, "londonCompatibleBlock": 0, "ethTxTypeCompatibleBlock": 1500, "magmaCompatibleBlock": 1500, "istanbul": { "epoch": 3600, "policy":0, "sub":21 }, ... }}
您可以在 Kaia Docs 中找到 Kaia 硬分叉的歷史。
如果您已使用所需的硬分叉更新了您的 genesis.json
,請重新初始化鏈配置並應用您的更改。
$ kscn --datadir /path/to/data/directory init /path/to/genesis.json
注意* 重新初始化鏈配置時打印以下錯誤日誌是正常現象。
ERROR[08/02,09:12:39 Z] [48] The same or more recent governance index exist. Skip writing governance index newIdx=0 govIdxes=[0]
確認更新的鏈配置
現在,重新啟動 ServiceChain 節點。 例如,您可以使用以下命令重新啟動 SCN 節點。
$ kscnd start
然後,您可以在 SCN 的 Javascript 控制檯中檢查更新後的鏈配置。
$ kscn attach --datadir ~/kscnd_home歡迎來到 Kaia JavaScript 控制檯!instance:Kaia/vX.X.X/XXXX-XXXX/goX.X.X datadir: ~/kscnd_home modules: admin:1.0 debug:1.0 eth:1.0 governance:1.0 istanbul:1.0 klay:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0> governance.chainConfig.magmaCompatibleBlock1500
硬分叉的一些具體情況
本節將介紹特定硬分叉的一些細節。
Magma
Magma 硬分叉引入了 KIP-71,即動態氣體費。 它包括Gas 價格的上限和下限。
默認情況下,上限設置為 7500000000
,下限設置為 25000000000
。 您可以使用 governance APIs 在 SCN 節點的 Javascript 控制檯中更改這些邊界。 顯然,下限不能超過上限。
要將Gas 價格設置為靜態值,必須將Gas 價格的上限和下限設置為相同的值。 例如,您可以在 SCN 節點的 Javascript 控制檯中使用 "governance.vote "API 將Gas 價格設為 "0"。
$ kscn attach --datadir ~/kscnd_home歡迎訪問 Kaia JavaScript 控制檯!instance:Kaia/vX.X.X/XXXX-XXXX/goX.X.X datadir: ~/kscnd_home modules: admin:1.0 debug:1.0 eth:1.0 governance:1.0 istanbul:1.0 klay:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0> governance.vote("kip71.lowerboundbasefee", 0)"Your vote is prepared.您的投票已準備就緒,將放入區塊頭,或在您的節點作為提案人生成區塊時應用。請注意,您的投票可能是重複的。"> governance.vote("kip71.upperboundbasefee", 0)"您的投票已準備就緒。您的投票已準備就緒,它將被放入區塊頭,或在您的節點作為提案人生成區塊時應用。請注意,您的投票可能是重複的。"
注 無論 Magma 硬分叉是否激活,都可以使用治理投票及其更新。 也就是說,治理投票也可以在 Magma 硬分叉激活之前進行。
如果更新Gas 價格上限和下限的投票成功,這些更改將在 2 個伊斯坦布爾紀元後生效(紀元的值以塊號表示)。
例如,如果歷時為 3600,而更新Gas 價格上下限的投票被置於區塊 #4000 中,則這些更改將從區塊 #10800 開始生效。 具體來說,投票將在 #7200 區塊達到其第一個紀元時最終完成,而更改將在第二個紀元(#10800 區塊)應用。
要檢查紀元,可以使用 governanace.itemsAt
API,如下所示。
> governance.itemsAt(kaia.blockNumber){ governance.governancemode: "none", governance.governingnode: "0x05ad406f31e22b74f18c9ed65ed1ccd349bbbee0", governance.unitprice: 0, istanbul.committeesize: 21, istanbul.epoch: 3600, istanbul.policy: 0, kip71.basefeedenominator: 20, kip71.gastarget: 30000000, kip71.lowerboundbasefee: 25000000000, kip71.maxblockgasusedforbasefee: 60000000, kip71.upperboundbasefee: 750000000000, reward.deferredtxfee: false, reward.minimumstake: "2000000", reward.mintingamount: "9600000000000000000", reward.proposerupdateinterval: 3600, reward.useginicoeff: false}
你可以看到,"istanbul.epoch "的值為 3600 個區塊,通常需要一個小時才能通過。
您還可以使用 "governance.vote "API 更改時間。
> governance.vote("istanbul.epoch", 60)"Your vote is prepared. It will be put into the block header or applied when your node generates a block as a proposer. Note that your vote may be duplicate."