跳至主要內容
本頁面使用機器翻譯自英語,可能包含錯誤或不清楚的語言。如需最準確的信息,請參閱英文原文。由於更新頻繁,部分內容可能與英文原文有出入。請加入我們在 Crowdin 上的努力,幫助我們改進本頁面的翻譯。 (Crowdin translation page, Contributing guide)

轉讓價值

如 Kaia 設計部分所述,服務鏈支持父鏈和子鏈之間的價值(KAIA、ERC-20 和 ERC-721)轉移。 本頁說明如何在 SCN 中啟用數值傳遞功能。

設置 EN 和 SCN 後,需要執行以下步驟才能在鏈之間進行價值轉移。

  1. 檢查網橋操作員賬戶的地址,並將 KAIA 添加到網橋操作員賬戶。
  2. 將橋接合約部署到父鏈/子鏈上。
  3. 向父/子鏈部署代幣(ERC-20 或 721)合約。 (如果您只需要 KAIA 轉機,則可跳過步驟 3 和 4)。
  4. 在父鏈/子鏈上將代幣合約與橋接合約進行註冊。
  5. 訂閱父鏈/子鏈上的橋接合約。

在按步驟操作之前,讓我們先來看看高層系統架構,以瞭解該機制的背後。

系統架構

圖 1 顯示了帶有橋樑/令牌合約和橋樑節點的服務鏈系統架構。

下面的合約通過主橋/子橋相互通信,處理用戶的價值轉移請求。

  • 橋牌合約
  • ERC-20 合同(如需要)
  • ERC-721合同(如需要)

圖 1. Service chain architecture

橋樑操作員賬戶

對於 ServiceChain,有兩個操作員賬戶:父鏈橋操作員賬戶和服務鏈橋操作員賬戶。 每個操作員賬戶都用於簽署交易。 如果交易將值轉移到父鏈,則父鏈橋接操作員賬戶會簽署該交易。 對子鏈而言,使用的是子鏈橋操作員賬戶。 如果用戶提交了 "請求價值轉移 "交易,子橋就會創建一個由橋操作員賬戶簽署的 "處理價值轉移 "交易。 因此,母鏈橋接運營商的餘額中需要有足夠的 KAIA 來向母鏈支付交易費。 如果服務鏈的Gas 價格設置為非零,則服務鏈橋運營商的餘額中也應包含 KAIA。

密鑰存儲和密碼文件

啟動 SCN 時,如果父/子操作符的密鑰不存在,則會自動生成其密鑰存儲文件和密碼文件。 如果要使用特定賬戶作為操作員,可以提供密鑰。 啟動 SCN 前,將以下文件放到指定路徑。 密碼文件應包含密鑰存儲文件的密碼字符串。 密碼文件名應為相應密鑰存儲文件的賬戶地址。

文件

  • keystore file : UTC--2019-10-21T04-05-41.493850000Z--2ed72a9d7fe5da7672fd21567e07302431649b0b
  • 密碼文件 : 0x2eD72a9D7fe5da7672fD21567e07302431649B0B

文件路徑

  • 父鏈橋操作員 : $datadir/parent_bridge_account
  • 子鏈橋操作員 : $datadir/child_bridge_account

> pwd
/$dataDIR/child_bridge_account
> ls
0x2eD72a9D7fe5da7672fD21567e07302431649B0B
UTC--2019-10-21T04-05-41.493850000Z--2ed72a9d7fe5da7672fd21567e07302431649b0b
> cat 0x2eD72a9D7fe5da7672fD21567e07302431649B0B
%S~f5qqM38cB47jL%
> cat UTC--2019-10-21T04-05-41.493850000Z--2ed72a9d7fe5da7672fd21567e07302431649b0b
{"address":"2ed72a9d7fe5da7672fd21567e07302431649b0b","crypto":{"cipher":"aes-128-ctr","ciphertext":"6486509e8158bf4984608cbc5562cf2c9a27cd988a98e543731b39251144e633","cipherparams":{"iv":"96d7e5b6a936278c0797faae6cb3d903"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"8928ba41b8228af19390ec881c51452fa3ea973ad2c253ca0f5bc9197a8b24c4"},"mac":"9c8ec63694c20a473e0ea33840e7d16e9f1a20afc52b3244b703a3ac0a66cfa3"},"id":"9ae10527-7fd3-4aae-a4eb-316af211494e","version":3}

檢查橋接運營商地址

如果成功運行 SCN,則可以使用 RPC API 檢查父/子鏈橋操作符地址,如下所示。


$ kscn attach --datadir ~/kscnd_home
歡迎來到 Kaia JavaScript 控制檯!
instance:Kaia/vvX.X.X/XXXX-XXXX/goX.X.X
datadir: ~/kscnd_home
modules: admin:1.0 subbridge:1.0 debug:1.0 governance:1.0 istanbul:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 servicechain:1.0 txpool:1.0
> subbridge.parentOperator
"0xA057995175B93Ee0D1bdfA54f078Ad0F0116130b"
> subbridge.childOperator
"0x5C1C757a6Cb6c6FcEFE398674D8209FDA2A74Df4"

詳細信息請參閱 subbridge API

向橋樑運營商發送 KAIA

與錨定一樣,母鏈橋運營商需要 KAIA 進行價值轉移交易。 如果服務鏈的Gas 價格設置為非零,則服務鏈橋運營商的餘額中也應包含 KAIA。

給運營商賬戶充值後,您可以像下面這樣查看賬戶餘額。

家長鏈橋操作員


$ kscn attach --datadir ~/kscnd_home
歡迎來到 Kaia JavaScript 控制檯!
instance:Kaia/vvX.X.X/XXXX-XXXX/goX.X.X
datadir: ~/kscnd_home
modules: admin:1.0 subbridge:1.0 debug:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
> subbridge.parentOperatorBalance
1e+50

兒童鏈橋操作員


$ kscn attach --datadir ~/kscnd_home
歡迎來到 Kaia JavaScript 控制檯!
instance:Kaia/vvX.X.X/XXXX-XXXX/goX.X.X
datadir: ~/kscnd_home
modules: admin:1.0 subbridge:1.0 debug:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
> subbridge.childOperatorBalance
1e+50

橋牌合約

為實現跨鏈價值轉移,應在父鏈/子鏈上部署橋樑合同。 用戶可以向橋接合約申請 KAIA 轉移,將其 KAIA 發送到另一條鏈上。 此外,如果在橋接合約中註冊了代幣合約,橋接合約可以處理父鏈和子鏈之間的代幣轉移。

部署

子橋提供橋接合同部署應用程序接口。 您可以使用單個 RPC 調用將橋接合約部署到兩個鏈上,如下所示。 在此之前,您應該已經連接了主橋和副橋。 請參閱 網橋配置 獲取詳細指南。


$ kscn attach --datadir ~/kscnd_home
歡迎來到 Kaia JavaScript 控制檯!
instance:Kaia/vvX.X.X/XXXX-XXXX/goX.X.X
datadir: ~/kscnd_home
modules: admin:1.0 subbridge:1.0 debug:1.0 governance:1.0 istanbul:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 servicechain:1.0 txpool:1.0
> subbridge.deployBridge()
["0x27caeba831d98b5fbb1d81ce0ed20801702f443a", "0x22c41ae528627b790233d2e59ea520be12350eb5"].
> subbridge.listBridge
[{
localAddress:"0x27caeba831d98b5fbb1d81ce0ed20801702f443a",
remoteAddress:"0x22c41ae528627b790233d2e59ea520be12350eb5",
subscribed: false
}]

更多詳情可參考 subbridge API

subbridge_listBridge 顯示網橋合同地址及其訂閱狀態。 子橋將橋接器合同地址列表保存在文件中。 重啟時,子橋會從文件中重新加載橋接器合同列表。

訂閱

部署橋接器合同後,應讓子橋接器訂閱已部署的橋接器合同,以實現價值轉移。 這可以通過另一個 RPC API 調用 "subbridge_subscribeBridge "來實現。


> subbridge.subscribeBridge("0x27caeba831d98b5fbb1d81ce0ed20801702f443a", "0x22c41ae528627b790233d2e59ea520be12350eb5")
null
> subbridge.listBridge
[{
localAddress: "0x27caeba831d98b5fbb1d81ce0ed20801702f443a",
remoteAddress: "0x22c41ae528627b790233d2e59ea520be12350eb5",
subscribed: true
}]

檢查狀態

訂閱後,SCN 將自動處理用戶的 "請求價值轉移 "交易。 本節介紹如何檢查橋接合同狀態。

在橋接聯繫人中,有兩個 nonces,即 "requestNonce "和 "handleNonce"。 與鏈內交易不同,子橋可以先處理較高的 nonce 請求,然後再處理較低的請求。

  • requestNonce:用戶向該橋接合約提出的 "跨鏈價值轉移 "請求的次數。
  • handleNonce:子橋處理過的最高 nonce。
  • lowerHandleNonce:子橋應處理的最低 nonce。

因此,如果非ces 按如下方式更新,我們就可以說跨鏈值傳輸得到了正確處理。

  • 父鏈橋合約的 "handleNonce "和 "lowerHandleNonce "不斷接近子鏈橋合約的 "requestNonce"。
  • "handleNonce "和 "lowerHandleNonce "不斷接近父鏈橋合約的 "requestNonce"。

如果 "handleNonce "等於對應橋接合約的 "requestNonce",且 "lowerHandleNonce "比 "handleNonce "大 1,則用戶的請求已全部處理完畢。

日誌

以下是 SCN 正常運行時的典型日誌輸出。 每 1 秒鐘打印一次橋牌合約狀態。


INFO[10/16,19:37:40 +09] [45] VT : Parent -> Child Chain request=8699 handle=4826 lowerHandle=4826 pending=3873
INFO[10/16,19:37:40 +09] [45] VT : Child -> Parent Chain request=7894 handle=4207 lowerHandle=4207 pending=3687

該日誌顯示了請求、句柄、lowerHandle 和待處理 nonces。 每個值的含義如下

  • request:所有已認購橋接合約的價值轉移請求 nonce 的總和。
  • handle:所有已簽訂的橋接合同的上層句柄非密碼總和。
  • lowerHandle:所有已訂閱橋接合約的下層句柄非採樣字符串的總和。
  • pending:"request "和 "lowerHandle "的區別。

RPC API

您可以像下面這樣查看橋牌合約的狀態。 詳細信息請參閱 subbridge API


> subbridge.getBridgeInformation("0x27caeba831d98b5fbb1d81ce0ed20801702f443a")
{
counterPart: "0x22c41ae528627b790233d2e59ea520be12350eb5",
handleNonce: 0,
lowerHandleNonce: 0,
isRunning: true,
isSubscribed: true,
onServiceChain: true,
pendingEventSize: 0,
requestNonce: 0
}

代幣合約(ERC-20/721)

服務鏈還支持 ERC-20/721 價值轉移。 為支持它們,應在父鏈和子鏈上部署與服務鏈兼容的 ERC-20/721 令牌合約。 關於 ERC-20/721 令牌合約代碼, ,您可以參考 Token standard.

部署

SCN 尚不支持部署 ERC-20/721 代幣的 API。 您需要通過 caver-js 部署令牌。 部署 ERC-20/721 合約時,應使用正確的橋接運營商帳戶。 使用父操作員賬戶部署主鏈,使用子操作員賬戶部署服務鏈。 如果使用錯誤的賬戶部署了代幣合約,價值轉移將不起作用,您需要使用正確的賬戶重新部署代幣合約。

註冊

部署令牌合約後,您應該在父鏈/子鏈上將令牌合約與橋接合約註冊在一起,如下所示。


> subbridge.registerToken("0x27caeba831d98b5fbb1d81ce0ed20801702f443a", "0x22c41ae528627b790233d2e59ea520be12350eb5", "0x376b72abe1b29cace831bd3f5acdfa967814c9cd", "0x53160735f7cc6ff75e48619f368bb94daff66a1b")
null

該命令將子鏈令牌("0x376b72abe1b29cace831bd3f5acdfa967814c9cd")與子鏈橋合約("0x27caeba831d98b5fbb1d81ce0ed20801702f443a")進行註冊。 以及父鏈令牌("0x53160735f7cc6ff75e48619f368bb94daff66a1b")和父鏈橋接合約("0x22c41ae528627b790233d2e59ea520be12350eb5")。

詳細信息請參閱 Service Chain API

申請價值轉移

本節將解釋用戶在請求價值轉移時將調用的合約方法。 請求交易不允許零值(KAIA/ERC-20)。

KAIA 轉機

用戶可使用以下方法向橋合約進行 "要求價值轉移 "交易。

fallback

如果用戶調用網橋的回退功能,則會請求向對應鏈中與請求用戶相同的賬戶地址進行 KAIA 轉賬。


function () external payable;

請求 KAIATransfer

如果用戶使用 _to調用該函數,則會請求向對應鏈中的 _to地址進行 KAIA 傳輸。


function requestKAIATransfer(address _to, uint256 _value, bytes calldata _extraData) external payable

ERC-20 轉讓

通過橋樑合同提出 2 步申請

用戶在批准橋接合約的令牌後,可使用以下方法向橋接合約進行 "請求價值轉移 "交易。


function requestERC20Transfer(address _tokenAddress, address _to, uint256 _value,uint256 _feeLimit,bytes memory _extraData) external

通過 ERC-20 合同提出 1 步申請

用戶可以使用以下方法直接向ERC-20 合同進行 "要求價值轉移 "交易,而無需審批。 那麼,ERC-20 合同就應該實現這一功能。


function requestValueTransfer(uint256 _amount, address _to, uint256 _feeLimit, bytes calldata _extraData) external

ERC-721 轉移

通過橋樑合同提出 2 步申請

用戶在批准橋接合約的令牌後,可使用以下方法向橋接合約進行 "請求價值轉移 "交易。


function requestERC721Transfer(address _tokenAddress, address _to, uint256 _tokenId, bytes memory _extraData) external

通過 ERC-721 合同提出 1 步申請

用戶可以使用以下方法直接向ERC-721 合同進行 "申請價值轉移 "交易,而無需審批。 那麼,ERC-721 合同就應該實現該功能。


function requestValueTransfer(uint256 _uid, address _to) external

onERC721Received()

ERC-721 標準有 onERC721Received 回調函數。 onERC721Received() "與 "safeTransferFrom() "函數一起工作,但當前的網橋合約實現使用 "transferFrom()",這意味著 "onERC721Recieved() "預計不會被調用。

另外,"onERC721Recieved() "之類的進一步操作應以另一種方式實現,如事件監聽(例如,"event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId)` )。

價值轉移回收

價值轉移請求可能因多種原因而失敗。 假設您要求從副橋到主橋或從主橋到副橋的 KAIA 轉機。 在這種情況下,接收方的橋接合約必須比請求的 KAIA 數量多。 否則,傳輸將失敗,返回值中不會有錯誤提示。 價值轉移恢復功能會發現未處理的事件,並在給定的時間間隔內將其重新插入事件池,這意味著當對應的橋接器能成功處理該事件時,失敗的事務就能再次成功。 在上述例子中,當對應的橋接器有足夠的 KAIA 時,失敗的交易最終將通過價值轉移恢復來處理。 要將值傳輸恢復設置為默認值,需要設置兩個屬性:


SC_VTRECOVERY=1
SC_VTRECOVERY_INTERVAL=5

通過設置 SC_VTRECOVERY=1 可以自動運行數值傳送恢復。 SC_VTRECOVERY_INTERVAL "表示執行值傳遞恢復的間隔時間。

收取 KAIA/ERC-20 轉移費用

在 ServiceChain 中,KAIA/ERC-20 轉賬具有收費功能。

**即將更新。

定製您的橋牌合約

在 ServiceChain 中,您可以使用自己定製的橋接器合同,該合同繼承自原始橋接器合同,用於自己的獨特服務。 本節將解釋如何定製 Bridge 合同,並介紹示例代碼。

**即將更新。

讓這個頁面變得更好