能夠參照示例合約。java
這是一個能夠跨鏈轉移 token 的 Token 合約。git
相比普通的 Token 合約增長了 send_to_side_chain 和 recv_from_side_chain 兩個函數用於跨鏈轉 token 。github
send_to_side_chain 只是在一條鏈上扣掉一部分 token 。json
等交易執行以後,使用 JsonRPC 接口 cita_getTransactionProof 獲取交易執行的證實。markdown
將證實發送到另一個鏈上的 recv_from_side_chain。校驗證實以後解析出原始交易的內容。在這個例子裏就是轉帳金額。網絡
而後執行整個交易的後半段,給一樣的用戶增長一樣數量的 token ,完成 token 的跨鏈轉移。ide
send_to_side_chain 中 destFuncHasher 是 recv_from_side_chain 的 function signature 。用來確保發送方和接受方的合約是匹配的。函數
txDataSize 是跨鏈傳遞的數據的大小。即 send_to_side_chain 除去前兩個參數(固定必須的參數)以後全部參數的總大小,這些參數須要以 bytes 的方式傳遞。工具
nonce 是爲了防止跨鏈交易重放***增長的,做用同 CITA 交易中的 nonce 。atom
跨鏈交易必須嚴格按照交易發生的順序在兩條鏈之間傳遞,所以 crosschain_nonce 設計爲自增的計數。
將證實發送到另一個鏈上以前,先調用 get_cross_chain_nonce 獲取當前 nonce。
同時有工具能夠解析證實,提取證實中的 nonce 。只有二者相等才能發送成功,若是不相等,則說明證實已經發送過,能夠丟棄;或者前序交易還未發送,還須要等待。
sendTransaction 中的 event 爲跨鏈提供必須的信息。請勿修改,也不要在sendToSideChain中增長其餘 event。
recv_from_side_chain 解析出原始交易的數據爲 bytes 類型,用戶須要參照 send_to_side_chain 自行解析成對應的類型。
目前,側鏈使用系統合約 ChainManager 進行管理。
生成側鏈的驗證節點的私鑰,使用側鏈的驗證節點地址,在主鏈上使用系統合約 ChainManager 的方法 newSideChain 進行新建側鏈,獲得側鏈的 Id 。
在主鏈上使用系統合約 ChainManager 的方法 enableSideChain 啓動指定 Id 的側鏈。
新建側鏈,創世塊裏的系統合約 ChainManager 構造時,使用上一個步驟申請的側鏈 Id 、主鏈的 Id 和主鏈的驗證節點地址做爲參數。
啓動側鏈便可。
部署跨鏈合約
在主側鏈分別部署跨鏈合約,分別獲得合約地址。
調用任意一條鏈的跨鏈合約的 send_to_side_chain 方法, 使用接收鏈(另外一條鏈)的 Id 、接收鏈跨鏈合約的合約地址和轉移的 token 數量做爲參數, 發送跨鏈轉移 token 交易,並獲得交易 hash 。
在操做步驟中不區分主鏈和側鏈。
使用跨鏈交易的交易 hash 、該交易所在鏈的 Id,和一個配置文件做爲入參調用工具:
cita-relayer-parser -c SEND_CHAIN_ID -t TX_HASH -f relayer-parser.json
其中配置文件 relayer-parser.json 目前主要有 2 個參數:
工具使用的私鑰。
全部相關鏈的 JsonRPC 網絡地址,使用 Id 做爲索引。
範例以下:
{ "private_key": "0x1111111111111111111111111111111111111111111111111111111111111111", "chains": [ { "id": 1, "servers": [ { "url": "http://127.0.0.1:11337", "timeout": { "secs": 30, "nanos": 0 } }, { "url": "http://127.0.0.1:11338", "timeout": { "secs": 30, "nanos": 0 } }, { "url": "http://127.0.0.1:11339", "timeout": { "secs": 30, "nanos": 0 } }, { "url": "http://127.0.0.1:11340", "timeout": { "secs": 30, "nanos": 0 } } ] }, { "id": 2, "servers": [ { "url": "http://127.0.0.1:21337", "timeout": { "secs": 30, "nanos": 0 } }, { "url": "http://127.0.0.1:21338", "timeout": { "secs": 30, "nanos": 0 } }, { "url": "http://127.0.0.1:21339", "timeout": { "secs": 30, "nanos": 0 } }, { "url": "http://127.0.0.1:21340", "timeout": { "secs": 30, "nanos": 0 } } ] } ] }
該工具主要作的任務爲:
根據入參,去發送鏈上查詢跨鏈交易的交易證實數據。
根據跨鏈交易的交易證實數據,獲得轉移 token 的接收鏈的 Id 。
發送證實到接收鏈上,完成 token 轉移。
在發送鏈和接收鏈分別使用跨鏈合約中的查詢接口(實例合約中 get_balance 方法)查詢當前用戶的 token 數量。
用戶轉移到側鏈的資產,須要發送跨鏈交易才能再回到主鏈。若是側鏈再也不工做,用戶將沒法經過這種方式從側鏈退出。
爲此咱們提供了狀態證實,經過 jsonrpc 接口getStateProof,能夠獲取合約中一個變量在指定高度的值的證實。
將這個證實發送到主鏈上的ChainManager系統合約中的verifyState,對證實進行校驗以後會進行後續處理。
state proof功能須要將側鏈的 block header 同步到主鏈。
relayer 能夠在側鏈上調用getBlockHeader,獲取指定高度的側鏈的block header,而後將數據發送到主鏈上的ChainManager系統合約verifyBlockHeader。
ChainManager系統合約驗證以後,保存側鏈每一個高度的state root,用來驗證用戶提交的state proof。
block header須要按順序傳遞,所以ChainManager系統合約提供了getExpectedBlockNumber,能夠查詢指定側鏈同步的進度。
考慮極端的狀況,側鏈可能隨時退出。
所以用戶在側鏈上發生的交易,必須等交易所在的 block 的 header 同步到主鏈,交易纔算肯定。
這樣即便側鏈退出,也能夠用過state proof的方式在主鏈上恢復對應的資產。 ———————————————— 原文連接:https://blog.csdn.net/shangsongwww/article/details/89445730