PalletOne調色板跨鏈的ETH提幣實現

實現區塊鏈的跨鏈,最主要的訴求就是Token的轉移,而Token的跨鏈轉移又分爲充幣和提幣2種操作。以PalletOne調色板來說,如果要把ETH跨鏈到PalletOne上來流轉,就是ETH的充幣操作,要將PalletOne上的PETH(PalletOne上發行的與ETH1:1等值兌換的Token)跨鏈回到以太坊,變成ETH,就是ETH的提幣操作。

ETH的充幣

這裏的過程其實和我之前的一篇博客PalletOne調色板Token PTN跨鏈轉網的技術原理 相似,只是我們需要在PalletOne上面創建一個與ETH等值兌換的Token,我們這裏就命名爲PETH吧。總結一下充幣的過程,細節我就不再累述了:

1.用戶在以太坊映射和鎖定合約上註冊映射自己的PalletOne地址。

2.用戶將一定數量的ETH轉賬到該映射和鎖定合約。

3.定時任務掃描合約的轉入事件,發現有新的轉入,就發起PalletOne充幣合約的調用,該充幣合約檢查ETH的轉賬和地址映射,將同等數量的PETH轉賬到用戶指定的映射地址上。

ETH的提幣

用戶在獲得了PETH後,可以在PalletOne網絡進行各種Token操作,比如去中心化交易所的幣幣互換,遊戲合約的道具購買,積分兌換等等。假如另一個用戶拿到了PETH,他需要將這些Token變現爲ETH,該怎麼操作呢?下面我們來詳細介紹一下其中的過程。

0.初始化了4個陪審員的公鑰到以太坊鎖定合約

這個是運營方在設置ETH充幣提幣合約時就做好的,只需要做一次。ETH的提幣合約在PalletOne中是由陪審團來執行,而陪審團是由4個陪審員節點組成。每個陪審員節點都生成了一個以太坊的公私鑰和地址,並且將公鑰和地址公開到網絡上。項目運營方在以太坊的映射和鎖定合約(接下來我們就命名爲0x1合約)上將這4個陪審員的公鑰設置進去,只有這4個公鑰中的3個簽名才能解鎖其中的ETH。

1.(PalletOne合約)傳入ETH收款地址,鎖定PETH

PalletOne上面有一個ETH提幣合約我們就命名爲PC1,用戶將自己的PETH轉賬到PC1,並調用了該合約的”提幣註冊”方法,提供了自己的以太坊地址。合約在“提幣註冊”方法內部,將以下信息組合在一起,並計算Hash:

  • 以太坊ETH映射和鎖定合約的地址0x1
  • 用戶映射的收ETH的地址
  • 要轉網的ETH數量(=轉入的PETH的數量-ETH轉網Gas費)
  • 鎖定PETH的RequestID(也就是本次請求”提幣註冊”方法的請求ID)

以上數據被組合在一起,並計算Hash後,PC1合約會將這4個數據以及計算的Hash保存到StateDB中,以供下一步使用。

2.(PalletOne合約)發起提幣調用,生成解鎖ETH的簽名,並最終生成以太坊合約的inputdata

等步驟1的調用被打包後,用戶或者定時任務發起對PC1合約的“提幣”方法的調用,該方法讀取步驟1中保存到StateDB的數據,並由4個陪審員各自用自己的以太坊私鑰進行簽名,簽名後的數據再進行排序,我們只需要取3個簽名即可。這個時候,合約已經獲得了調用0x1合約進行ETH提幣的所有參數:

  • 以太坊ETH映射和鎖定合約的地址0x1
  • 用戶映射的收ETH的地址
  • 要轉網的ETH數量
  • 鎖定PETH的RequestID
  • 3個陪審員的簽名

在以太坊鎖定合約0x1上,有一個方法:

function withdraw(address recver, uint amount, bytes32 reqid, bytes sigstr1, bytes sigstr2, bytes sigstr3) public

該方法接收的參數都已經完備,所以我們就可以按照以太坊的規則,生成對應的inputData。最終將合約地址0x1,調用的inputData寫入到StateDB中,以供專門用於以太坊合約調用的定時任務查詢和調用。

3.(以太坊合約)發起以太坊鎖定合約的提幣,用戶獲得ETH

定時任務(以太坊合約調用者)掃描PC1合約的狀態,一旦發現有新的提幣調用,就讀取這次提幣申請的如下信息:

  • 要被調用的以太坊合約地址
  • 調用合約時傳入的inputData(也就是要被調用的合約方法和合約參數編碼後的值)
  • GasFee

定時任務根據以上信息,用自己的賬號發起對指定合約的調用。調用完畢後,可以獲得本次調用的TxHash,定時任務再發起對PC1合約的調用,登記本次ETH提幣的TxHash,以便用戶能夠查詢轉網的結果。陪審員會根據TxHash去驗證轉網結果,並更新本次轉網提幣請求的狀態。如果一切正常,用戶映射的以太坊收款地址,將收到對應數量的ETH,對用戶來說本次轉網提幣結束。

4.(PalletOne合約)以太坊合約調用者獲得GasFee的補償

因爲以太坊的合約調用是需要花費真金白銀的ETH的,所以轉網提幣合約必須對該調用者進行ETH的補償。我們前面提到:  要轉網的ETH數量=轉入的PETH的數量-ETH轉網Gas費。也就是說,如果我有1個PETH要進行提幣,而轉網提幣的手續費是0.01PETH,那麼我最終以太坊錢包會收到0.99ETH。而以太坊合約調用者在步驟3中向PC1合約登記了轉網TxHash,陪審員驗證轉網成功的同時,也會將手續費0.01PETH記賬到合約調用者的地址下,合約調用者隨時可以從PC1合約提取PETH。

總結

以上就是PalletOne調色板關於跨鏈以太坊提幣的詳細過程,我們以鎖定PETH的RequestHash作爲提幣的唯一標識,無論在PalletOne合約還是在以太坊合約中,都使用,主要就是爲了防止重放攻擊,由於RequestHash是唯一的,不可能碰撞出一模一樣的RequestHash,所以合約中只需要檢查RequestHash對應的狀態,就可以確定下一步該怎麼處理。

按理來說,步驟1和步驟2應該是可以合併成一步的,爲什麼要分開呢?主要是爲了預防雙花攻擊。如果一個人發起了雙花交易,這兩筆交易都是轉入1PETH,但是手續費用的是同一筆UTXO,由於PalletOne的合約是異步執行的,所以陪審團在執行兩個提幣請求時,並不知道存在雙花,所以陪審團都會生成3個簽名,而最終在打包的時候Mediator發現雙花,只打包其中的一筆。這個時候雖然最終打包是一筆,但從P2P角度來看,整個網絡上其實獲得了兩筆提取ETH的簽名,用戶可以在以太坊合約中進行兩次提幣。而分成兩步後,就可以杜絕這種情況的發生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章