arbitrum 資產橋合約
資產橋的作用
Rollup 的主要流程中,實際上不包含資產橋,也就是說即使沒有資產橋,L2依然能正常運行但是此時L1與L2在數據上是完全獨立的兩條鏈,L1不理解L2上的數據(L1只保存L2壓縮后的數據,不理解數據),L2上也不知道L1上發生了什么(只能拿到區塊高度等一些基本信息)。完全可以把L2做是另外一條鏈。
在這種情況下如果需要做資產轉移,就和普通的一層鏈之間的資產轉移沒什么區別.
而有了自己實現的資產橋就不一樣,因為實際上L2的數據都是通過L1上的inbox(sequencer inbox)合約保存的,所以當我們在inbox合約中解析數據,L1上就可以看到L2上的部分數據
雖然這會增加L1上的手續費,但是這樣可以降低跨鏈帶來的安全性問題(跨鏈過程本質上是在L1上的inbox合約中,其他邏輯則完全嵌套在L2的主用邏輯中,也就是跨鏈的安全性=整個L2的安全性=aribtrum的any-trust模型)
arbitrum 的快箱&慢箱
在介紹資產橋之前,我們先來區分一下arbitrum的快箱和慢箱。
快箱 (Sequencer Inbox)
快箱是L2交易的入口(寫入sequencer的交易最終會在L2上被處理,sequencer的處理實際上還沒進入L2)
在Sequencer inbox中交易會迅速被validator打包(validator的打包邏輯就是在在inbox中拿數據,來打包)
慢箱(inbox)
慢箱中的交易是L1往L2上發送的交易,通過慢箱,我們可以在L1上改變L2的世界狀態.
慢箱的實際價值有兩個
-
L1向L2發送數據是,L2不需要驗證L1的數據,L1的數據只能通過inbox進入L2,對數據的校驗都發生在L1的inbox合約中
-
抗審查,因為L2的所有交易都是由sequencer打包的,而sequencer是一個中心化的節點,sequencer可以對L2上的交易進行惡意的審查從而拒絕部分交易(sequencer 不能修改交易內容,因為他沒有指定賬戶的私鑰).此時可以通過L1上的inbox合約強行把交易寫入L2(實際上最終也是寫入sequencer inbox),L2的區塊是validator在Rbolck中確定的(sequencer不同意也無所謂),當交易通過慢箱寫入L2后,sequencer只能接受這個交易(否則會因為與L2的狀態不一致導致失去部分功能)
資產橋的運作
知道慢箱的處理邏輯之后,我們可以來看看資產橋是怎么運作的.
資產橋分為兩種處理邏輯,L1到L2(充值),L2到L1(提現),當然arbitrum的資產橋不只是能做資產轉移的操作,實際上也可以完成calldata的跨鏈操作(把calldata傳遞到L2指定的合約)
充值過程
在討論充值問題之前,我們需要考慮下面幾個
- ETH怎么鑄造?
- ERC20怎么處理?
- L2上沒有對應的ERC20合約怎么辦?自動部署,還是交易直接失敗?
- 怎么控制L2鑄造的權限,L2上的代幣最終是可以提現在L1上的,如果隨便鑄造,跟L1對不上賬怎么辦?
- 鑄造的時候L2手續費暴漲,鑄造失敗怎么辦?
arbitrum 的資產橋是典型的
鎖定-鑄造 銷毀-解鎖模型,L1上鎖定的代幣,L2上怎么鑄造.
gateway
要回答這些問題,我們先來看一下arbitrum的資產橋模型 gateway

gateway實現了L1 <--> L2資產合約的映射(ETH也使用合約的方式來映射)
arbitrum提供來了一些標準的ERC20 template,正常情況下,如果L1上的資產合約也是標準的ERC20,那么arbitrum會自動在L2上部署一個相同的ERC20合約(可能詳細功能不同,但是能實現ERC20的邏輯),而這個映射出來的ERC20 通過gateway做權限驗證,也就是只有gateway合約能在這個合約中鑄造和銷毀,這樣保證了L1和L2上的賬能對的上.
插一個小知識,arbitrum鏈上的交易手續費是使用ETH來支付的,但arbitrum本身不產生ETH(這點我不是很確定),所以在使用arbitrum之前,需要從以太坊上沖一些ETH到arbitrum上,這個充值交易的手續費在L1上支付,注意這里不是代付,是在交易到達L2后直接在L1中的msg.value中扣除。涉及到L1 <--> L2交易一個非常麻煩的問題 -- 手續費處理。這里就不詳細展開
retryable 可重試票據
可重試票據主要是用來解決L2上鑄造失敗的情況,L1上充值交易發送到L2上之后,可能因為L2上手續費超過 用戶愿意支付的手續費閾值(在L1上發送充值交易時指定的)時可能導致交易的失敗。這時候交易已經記錄到L2上只是執行失?。╟alldata還在),用戶可以在L2上手動重試,手動重試不能改變calldata,但是手續費是在重試交易中一起支付的。L1 -> L2的可重試票證只會保存7天,7天之后,資產將會永久的鎖定在L1上(可以續費延期).
正常情況L1上的充值操作不需要用戶去L2上觸發鑄造,L2會自動完成鑄造.L2 -> L1就不行,必須去L1上手動提現,當然相對而言L2 -> L1的票據是永久有效的,用戶不需要急著提現
ok,我們已經知道了資產橋的架構,現在來看一下充值的詳細過程
充值過程,用戶調用L1 inbox合約中的createRetryableTicket方法創建可重試票據,指定L2上的接受者地址,token地址,手續費等,
inbox會將L1的資產鎖定的L1上對應資產的gateway合約中,并將L2上的鑄造請求的ticket寫入sequencer inbox合約中
L2 訂閱到sequencer inbox 中的鑄造請求后會找到對應的gateway合約(這部分工作是gateway router做的),鑄造代幣
如果L2自動鑄造失敗,這是用戶可以在L2 上手動重試,或者在L1上完成手動重試(避免排序器審查)
提現流程
在理解充值流程后,提現就很容易理解了
提現的過程實質上是操縱gateway合約完成代幣銷毀,并生成票據,將票據寫回到L1上
這里簡單解釋一下寫回操作:
寫回操作是通過arbitrum的outbox實現的,由validator來調用L1上的outbox合約將數據寫回到L1,但是寫回操作并不直接執行這些數據,只是記錄數據,最后的執行需要用戶手動去觸發,這也是為什么提現操作不會自動在L1上進行(目前猜測是因為L2->L1不好控制手續費,所以沒有在這里做自動執行,并且,自動執行相當于是L2自動修改L1的狀態,實際上是比較不可控的)
當充值操作寫回到L1的outbox之后,用戶就可以在L1上解鎖資產
Q: 我沖了10WETH 可以提現20WETH嗎?
這是可以的,如果你在L2上賺錢了(多賺了10WETH),只要L2提供的票據說你銷毀了20WETH, 那么在L1上就會給你解鎖20WETH, 橋只要保證總資產的帳對的上就可以.

浙公網安備 33010602011771號