CREATE2 在廣義狀態通道中的使用

  • 2019 年 10 月 25 日
  • 筆記

君士坦丁堡硬升級中引入了一個新操作碼 CREATE2[1] ,它使用新的方式來計算常見的合約地址,讓生成的合約地址更具有可控性,通過 CREATE2 可以延伸出很多新的玩法,這篇文章來探討下,在廣義狀態通道中的妙用。

關於合約地址與狀態通道,先科普一下相關知識點。

合約地址如何計算出來的?

在 CREATE2 以前,CREATE指令創建的合約地址是通通過交易發起者(sender)的地址以及交易序號(nonce)來計算確定的。sender 和 nonce 進行 RLP 編碼,然後用 Keccak-256 進行 hash 計算(偽碼):

keccak256(rlp([sender, nonce]))

而 CREATE2 指令則主要是根據創建合約的初始化程式碼(init_code)及鹽(slat) 生成(偽碼):

init_code 程式碼是用來創建合約的,合約創建完成後將返回運行時位元組碼(runtime bytecode)。通常init_code程式碼包括合約的構造函數及其參數,以及合約程式碼本身。

keccak256(0xff + sender + salt + keccak256(init_code))

CREATE創建的合約地址依賴於一個跟隨交易者發起的交易數量不斷的增長的nonce變數,這種方式很難確定一個未來要部署的合約地址(比如提前使用一個還未部署的合約地址),而使用 CREATE2 只需要確定了創建合約的程式碼(init_code)及鹽(slat),則合約地址就是確定的(實際上讓地址變成了對合約程式碼的驗證)。

狀態通道

狀態通道由支付通道演進而來,我們先通過一個簡單的例子介紹下支付通道,假設曉娜經常要去樓下的咖啡店喝咖啡,曉娜每次除了支付0.1 eth 咖啡費用之外,還需要支付一筆小費給礦工。為了節約小費,曉娜可以在她與咖啡店之間創建一個支付通道,通過加密簽名可以重複安全的轉移以太幣,而不用支付手續費。曉娜可以這樣做:

1.創建一個支付通道智慧合約,並存入20個以太幣(鏈上)。2.每次買咖啡時簽名一條交易資訊給老闆,交易資訊包含內容有:第幾次購買咖啡、總共要支付多少錢給老闆及簽名數據本身。(鏈下)3.曉娜重複步驟2,而老闆任何時候都可以把曉娜的簽名資訊發送給鏈上支付通道智慧合約,取回資金。4.曉娜不想喝咖啡了,取回支付通道的餘額。

通過這樣的方式,曉娜可以節約大量的手續費。這裡例子的程式碼可以參考編寫一個簡單的支付通道[2]及simple-payment-channel[3]。本例沒有考慮一些極端條件,在比特幣閃電網路白皮書[4] 有關於支付通道詳細的闡述。

狀態通道則可以基於特定應用程式的狀態進行鏈下交互(而不僅僅是支付資訊), 如果可以部署一個遊戲合約定義遊戲規則並抵押資金,玩家可以在鏈下玩遊戲(每進行一步遊戲簽名發給對方), 遊戲結束時,只需要把最後的狀態提交給合約,合約進行輸贏判斷,並獎勵。

Force-Move 遊戲框架[5] 就是讓開發者可以模組化的、可擴展的方式,開發基於狀態通道的的回合制遊戲。

廣義狀態通道

感覺才進入主題,廣義狀態通道的意思是,用戶可以用同一個通道做多種不同的事情。剛剛上面介紹的狀態通道,都是基於特定目的的通道,抵押的資金只能根據實現定義好的合約邏輯進行分配,而廣義狀態通道則是使用一個強大的多簽錢包,可以根據其他合約定義的規則來進行資金的分配,從而實現更加通用的目的。

舉個例子:Tiny熊和曉娜擁有一個抵押的資金的多簽錢包,然後定義一個剪刀石頭布的遊戲合約,每次輸方向贏方支付1個以太幣,玩遊戲可以在鏈下進行,結束後,最終的狀態提交給遊戲合約,並觸發多簽錢包根據狀態分配資金。

通過使用 CREATE2,可以在遊戲合約不上鏈的情況下進行遊戲,因為只要遊戲的規則程式碼確定了,就可以確定遊戲合約的地址,在鏈下就可以基於這個確定的合約地址進行簽名玩遊戲,甚至我們根本不需要部署遊戲合約,僅僅在有遊戲玩家作弊的時候,部署遊戲合約進行鏈上仲裁。

如果不能理解上面這一點,就當作剪刀石頭布遊戲,Tiny熊和曉娜贏的次數一樣多,這樣誰也不用給對方支付費用,對於鏈上的多簽錢包,相當於什麼也沒有發生,這樣也同樣不需要部署遊戲合約。

Counterfactual 技術

有一個專門的項目 Counterfactual[6] 研究廣義狀態通道想想擴容技術,現在中文資料里把 Counterfactual 直譯為「反事實」,非常的晦澀,我認為應該翻譯成「擬上鏈」。為了方便大家閱讀 Counterfactual 相關文檔,對 Counterfactual 相關的術語進行下解釋,這個概念本身有一點「哲學」。

Counterfactual 官方的一個介紹是,在狀態通道中,一個「Counterfactual X」 代表:

•X 可以在鏈上發生,但它並沒有。•任何參與者都可以單方面使得 X 在鏈上發生。•參與者們能夠假設「 X 已經在鏈上發生」,並基於此進行其他行動。

Counterfactual 表達為擬上鏈還是比較準確,充分表達了可以上鏈,卻沒有上鏈。

Counterfactual instantiation 是另一個常用術語,通過 Counterfactual instantiation 可以擴展狀態通道的功能, 我把翻譯為擬上鏈實例化,它表示實例化一個並沒有實際上鏈的合約,儘管它沒有上鏈,各方卻都會在假設合約已經被部署上鏈進而進行交互。

參考文章

•Counterfactual: Generalized State Channels on Ethereum[7]•State Channels for Dummies: Part 5[8]

深入淺出區塊鏈[9] – 打造高品質區塊鏈技術部落格,學區塊鏈都來這裡,關注知乎[10]、微博[11] 掌握區塊鏈技術動態。

References

[1] 新操作碼 CREATE2: https://learnblockchain.cn/docs/eips/eip-1014.html [2] 編寫一個簡單的支付通道: https://learnblockchain.cn/docs/solidity/examples/micropayment.html#id8 [3] simple-payment-channel: https://github.com/eolszewski/simple-payment-channel [4] 比特幣閃電網路白皮書: https://lightning.network/lightning-network-paper.pdf [5] Force-Move 遊戲框架: https://github.com/magmo/force-move-protocol [6] Counterfactual: https://www.counterfactual.com/technology/ [7] Counterfactual: Generalized State Channels on Ethereum: https://medium.com/statechannels/counterfactual-generalized-state-channels-on-ethereum-d38a36d25fc6 [8] State Channels for Dummies: Part 5: https://medium.com/blockchannel/state-channels-for-dummies-part-5-6238f83f8da3 [9] 深入淺出區塊鏈: https://learnblockchain.cn/ [10] 知乎: https://www.zhihu.com/people/xiong-li-bing/activities [11] 微博: https://weibo.com/517623789