配置高可用性
如果服務鏈中只使用一個網橋,該網橋就會成為單點故障。為了解決這個問題,我們將介紹如何使用兩個或更多網橋構建 HA 系統。如下圖所示,將網橋配置為至少兩對連接,這樣即使其中一個網橋連接出現問題,數據錨定和鏈之間的價值傳輸仍可通過另一個網橋正常進行。

先決條件
- EN 的主橋和 SCN 的副橋相連。如果不是,請參考 Kairos connection建立連接。
- 本節將介紹如何在 Kairos 和 ServiceChain 之間添加額外的橋接器。同樣,您也可以通過添加另一個網橋來設置 HA。
步驟 1:在 EN-SCN 之間添加另一個網橋
在連接到 Kairos中,我們假設 EN 和 SCN 分別以 EN-01 和 SCN-L2-01 的橋接方式連接。在本節中,我們將在 EN-02 和 SCN-L2-02 之間添加另一座橋樑。由於程序相同,我們將作簡要說明。

構建 EN-02 後,在 conf/kend.conf 中將 SC_MAIN_BRIDGE 設置為 1,然後在 EN-02 上重啟 ken。
SC_MAIN_BRIDGE=1
通過以下命令檢查 EN-02 的 KNI 信息:
EN-02$ ken attach --datadir ~/data> mainbridge.nodeInfo.kni"kni://eb8f21df10c6562...25bae@[::]:50505?discport=0"
登錄 SCN-L2-02,使用 EN-02 的 KNI 創建main-bridges.json。請確保它應該是帶方括號的 JSON 數組格式。
SCN-L2-02$ echo '["kni://eb8f21df10c6562...25bae@192.168.0.5:50505?discport=0"]' > ~/data/main-bridges.json
在 SCN-L2-02 的外殼上,按以下說明編輯 kscn-XXXXX-amd64/conf/kscnd.conf。要連接橋接器,請將 SC_SUB_BRIDGE 設置為 1。
SC_PARENT_CHAIN_ID "設置為 Kairos 的 "chainID "1001。
SC_ANCHORING_PERIOD "是一個參數,用於決定向父鏈發送錨定事務的週期。在這個例子中,每 10 個子區塊就會向父鏈(Kairos)提交一個錨交易。
...SC_SUB_BRIDGE=1...SC_PARENT_CHAIN_ID=1001...SC_ANCHORING_PERIOD=10...
如果在 EN-02 上重新啟動 ken,EN-02 和 SCN-L2-02 之間將自動連接橋接,數據錨定將從連接點開始,如下圖所示。
在 EN-02 和 SCN-L2-02 之間添加橋接器後,可以看到節點之間的連接已建立,如下圖所示。

第 2 步:註冊和訂閱橋接合同
如上圖所示,橋接合同只在 EN-01 和 SCN-L2-01 中登記。
連接 SCN-L2-02 控制檯,運行用於網橋註冊、網橋訂閱和令牌註冊的 API。在跨鏈價值轉移 第 2 步中部署帶有 EN-01 和 SCN-L2-01 的橋接合約時,創建 了橋接合約和代幣合約。
$ kscn attach --datadir ~/data> subbridge.registerBridge("0xCHILD_BRIDGE_ADDR", "0xPARENT_BRIDGE_ADDR")null> subbridge.subscribeBridge("0xCHILD_BRIDGE_ADDR", "0xPARENT_BRIDGE_ADDR")null> subbridge.registerToken("0xCHILD_BRIDGE_ADDR", "0xPARENT_BRIDGE_ADDR", "0xCHILD_TOKEN_ADDR", "0XPARENT_TOKEN_ADDR")null

在橋樑合同中,應更新有關增加一座橋樑的信息。 service-chain/value-transfer 的 erc20/erc20-addOperator4HA.js 腳本,會將額外橋接器的操作員註冊至部署於 跨鏈價值轉移 中的橋接合約中。
首先,請檢查 SCN-L2-02 上額外橋接器的運作者位址,並將其新增至 common/bridge_info.json 中的 bridges 欄位。
$ kscn attach --datadir ~/data> subbridge.childOperator"0x2ed72a9d7fe5da7672fd21567e07302431649b0b"> subbridge.parentOperator"0x5f4d5ac6da5d2d1f0af0e1bd8bc85a43a0ba41c5"
"bridges": [ { "child": { "operator": "0x10221f7f9355017cd0c11444e7eecb99621bacce" }, "parent": { "operator": "0x3ce216beeafc62d20547376396e89528e1d778ca" } }, { "child": { "operator": "0x2ed72a9d7fe5da7672fd21567e07302431649b0b" }, "parent": { "operator": "0x5f4d5ac6da5d2d1f0af0e1bd8bc85a43a0ba41c5" } } ]
只有橋接合約的所有者才能註冊操作員。 erc20-deploy.js 已將橋接合約的所有權轉移給 SCN-L2-01 的營運商,因此該腳本必須使用他們的金鑰進行簽署。 SCN-L2-01 將它們儲存於 ~/data/child_bridge_account 和 ~/data/parent_bridge_account 目錄中,每個目錄內皆包含一個金鑰庫檔案及其對應的密碼檔案。請將這兩個目錄複製到執行該腳本的電腦上,並將其路徑傳遞給該腳本。在 erc20 目錄中執行此腳本,該目錄中的 transfer_conf.json 檔案是由 erc20-deploy.js 所建立的。
$ cd erc20$ CHILD_OWNER_KEYSTORE=/path/to/child_bridge_account \ PARENT_OWNER_KEYSTORE=/path/to/parent_bridge_account \ node erc20-addOperator4HA.js
橋接帳戶目錄中包含操作員金鑰庫及其明文密碼,這使得攻擊者能夠完全掌控操作員帳戶。執行完腳本後,請刪除這些副本。
當有多個橋接器時,可以通過設置閾值來更安全地進行價值轉移。只有當閾值以上的操作員正常請求數值轉移時,才能啟用數值轉移。例如,在當前示例中,如果有兩個橋接器對,閾值設置為 2,則只有當兩個橋接器對都正常請求時,才能進行數值傳送。也就是說,即使一座網橋受到攻擊併發送了異常請求,也可以阻止它。此腳本將閾值設定為 bridge_info.json 中的橋樑數量。若要使用不同的數值,請在執行時設定 THRESHOLD,例如:THRESHOLD=1 node erc20-addOperator4HA.js。
該腳本會將來自 SCN-L2-01 營運商帳戶的交易傳送至節點之外。完成後,請在 SCN-L2-01 上重新啟動 kscn,以便其子橋接器重新載入操作員帳戶的隨機數。
SCN-L2-01$ kscnd stopSCN-L2-01$ kscnd start
註冊完成後,如下圖所示,將在 EN-02 和 SCN-L2-02 中註冊橋接合同,以配置 HA。

當兩個或更多橋對連接用於 HA 時,同一區塊的數據錨定事務會發生多次,價值轉移事務也會發生多次 。也就是說,需要額外付費。