一文讀懂Arbitrum Rollup的工作原理

最近我發表了一篇博文比較 Arbitrum Rollup 和相互競爭的其他 rollup 系統(中文譯本)。不過,那篇文章里面沒有詳細介紹 Arbitrum Rollup 的工作原理,所以這一篇文章的任務就是填補這個空白。

一句話,Arbitrum Rollup 是一個由以太坊鏈上合約管理的鏈下協議,為使自己的應用能夠在 Arbitrum Rollup 上運行,dApp 的開發者需要用 Solidity 編寫一組合約,然后將這些合約編譯成可以在 Arbitrum 虛擬機上運行的可執行代碼。運行速度會更快,你我期待的就是這個。

Rollup 基礎知識

先從基礎知識說起,我們使用默克爾樹(Merkle Tree)來組織虛擬機的狀態,因而可以算出虛擬機狀態的密碼學哈希值。我們把這個哈希值存儲在鏈上,因此在協議的任何一個時間點,都會有一些虛擬機的狀態(通過鏈上共識)被完全確認和最終敲定。這些已經獲得終局性的狀態的哈希值,就存在鏈上。

協議的參與者,通過提出一個爭議斷言(Disputable Assertion,DA)來推進該虛擬機的狀態;該斷言聲明,從某些狀態哈希開始,基于一些技術前提,虛擬機將會執行特定數量的計算步驟,生成新的狀態哈希,并在執行期間完成相關的支付,生成相關的日志事件。爭議斷言可能是有效的(即可信的),也可能是無效的,參與者在提出爭議斷言時需要為保證斷言的有效性而賭上一筆押金,(更多關于押注及其工作原理的內容將在后面介紹,)

– 爭議斷言會使協議產生一個決策點 –

如上圖所示,提出一個爭議斷言就會產生一個協議最終必須要解決的邏輯決策點,如果爭議斷言是有效的,則系統將進入圖中右上角的新狀態,包括由爭議斷言生成的新狀態哈希值,以及其他附帶效果(產生相應的支付和日志),若爭議斷言是無效的,則進入右下角的分支,爭議斷言被系統拒絕,原來的狀態不會發生變化,

舊的 Arbitrum 協議

最開始的 Arbitrum 協議每次只處理一個爭議斷言,當某些參與者提出一個爭議斷言后,會有一個挑戰期,在此期間任何人都可以挑戰這個爭議斷言。如果沒有被挑戰,則該爭議斷言將被系統接受;否則就會執行糾紛解決協議,撤銷爭議斷言(這是為了防止提議者和挑戰者合謀炮制爭議結果),

這樣做很簡單,但是有兩個缺點,首先,因為每次只處理一個爭議斷言,所以虛擬機的處理速度很受限。在每個挑戰期內,正常的處理流程基本上都將停滯。第二,惡意參與者通過故意挑戰所有的爭議斷言可以徹底凍結虛擬機。攻擊者需要付出一些押金作為代價,但是只要他們愿意,他們至少可以在某些特定場景下通過這種攻擊長時間延誤系統(而獲利),

新的改進版本

在我這篇文章中介紹的新的 Arbitrum Rollup 協議解決了上述的兩個缺點,通過 “流水線化” 處理多個爭議斷言,驗證節點模擬虛擬機的運算速度有多快,虛擬機的處理速度就有多快。第二,我們后面將會解釋,惡意參與者無法延阻系統,他們只能暫時延誤對最終結果的鏈上確認,但這些結果對誠實節點來說早已 “無需信任地被敲定了”,

所以,到底怎么做到呢?那就要講得再深一點了……

每個狀態后面最多可以接一個爭議斷言,如果一個狀態后面沒有爭議斷言,那么任何人都可以生成一個爭議斷言接在后面,作為一個新的分叉點,結果就是產生了一棵平行未來之樹,

– 平行未來之樹 –

押注

協議的另外一個重要的部分是押注,任何人都可以在樹上的某個方框(狀態)后面下注,對某個方框押注,意味著你在斷言該方框最終將被協議確認,換句話說,你在斷言從當前狀態到你押注的方框所在的這條分支是正確的分支。如果你錯了,可以想見你的押金將被罰沒。

押注行為不能被撤銷,你可以將你的押注向右移動——可以在分叉點后向上或向下選擇分支——但你不能向左移動押注,因為這相當于撤銷你之前作出的押注承諾。

提出爭議斷言的參與者要在 “認可其斷言有效” 的繼任方框上押注。通常他們可以向右移動已存在的押注到滿足條件的方框上,(在極少數情況下(譯者注:比如他們的斷言是無效的,被成功挑戰)他們不能這樣做,他們可以額外再押一注到需要的方框上。但是注意,他們將在相沖突的兩條路徑上押注,因此最終他們會損失至少一筆押金——通常自相矛盾不是明智的移動選擇)。

關于押注還有一個細節:如果你押注的方框被確認成為被接受的歷史的一部分,你可以選擇收回押金。這意味著,如果你是正確的,你可以停止移動你的押注,直到系統 “追上” 你,然后你就可以收回你的押金,

– 一棵更標準的狀態樹 —— 由一連串的有效斷言組成 –

在這一點上,你可能會擔心,平行未來之樹會變得非常大,而且枝繁葉茂,這在現實中是不可能發生的,因為這需要多方押注不一致的結果,只要他們中有一個是誠實的,其他所有人都會損失他們的押金,更有可能的是,這棵樹實際上是一個由有效 DA 串成的鏈,一個接一個,所有的押注都在同一條分支上,

押注期限

我們需要系統在盡可能短的時間內對每個爭議斷言做出決定。所以當一個爭議斷言被添加上鏈、產生一個分叉點的時候,會有一個期限與之關聯。這個期限足夠長,任何人如果愿意,都有足夠的時間檢查這個爭議斷言是否有效,以及產生一筆押注交易上鏈,任何要押注的人都必須在期限結束之前完成操作(過期的押注仍然可以上鏈,但它們不能決定那個爭議斷言的有效性)。一旦期滿,所有可以決定爭議斷言的押注都將可知,

糾紛

如果 Alice 和 Bob 押注不同的方框,那么以下兩件事件中,必有一件為真,要么其中一個押注可以向右移動到另一個 —— 意味著他們的斷言是一致的 —— 要么找不到這樣的路徑。如果沒有一條向右移動的路徑可以連接 Alice 和 Bob 的方框,則他們必然有分歧。他們之間一定可以找到一個唯一的分叉點 —— 一個唯一的爭議斷言,某個人押注這個斷言是有效的,而另一個押注其無效。

– Alice 和 Bob 之間存在爭議 –

當兩個參與者之間出現糾紛時,系統可以啟動一個交互式糾紛解決協議。我在這里沒有足夠的篇幅來描述這個糾紛解決協議 —— 我只想說,這是一個類似我們在其他 Arbitrum 文檔中描述過的二分法交互協議,

糾紛解決協議的結果是一個參與者將被發現是錯誤的,這個參與者的押金會被罰沒。押注會從所在的方框上刪除。部分押金會給到糾紛的另一方,剩下的被燒掉。

多個糾紛可以同時解決,但是每個押注者一次最多只能參與一個糾紛。因為輸家的押注將被刪除,每解決一個糾紛都會減少整個系統的分歧數量,損失押金的參與者可以繼續押注,但是新的押注無法影響押注期限已過的爭議斷言,這樣做的效果是,一個爭議斷言的押注窗口結束后,一切有關如何處理該斷言的分歧都將被消除。

結果確認

某個爭議斷言的押注期限到期后,如果所有及時提交(且尚未被刪除)的押注,都存在于從該斷言產生的同一條分支上,那么系統就可以肯定該斷言的結果為真,爭議斷言要么被接受要么被拒絕,當前狀態會移動到爭議斷言右邊正確的方框上,如果爭議斷言被確認有效,則其附帶效果,如支付等,也會在鏈上生效,虛擬機的狀態就是這樣向前移動的。

一般情況下,參與者都會誠實守矩,誰也不想因為押注錯誤而損失押金,只有有效的爭議斷言會被(其他參與者)斷言,構成一條鏈,沒有人會在任何爭議斷言的無效分支上押注,在這種情況下,所有的爭議斷言都會在押注期限一過后立即被確認,

何以無需信任(Trustless)

Arbitrum Rollup 的一個重要性質就是無需信任 —— 只要有一個誠實參與者就可以確保虛擬機狀態正確向前推進,為什么呢,想象一下 Alice 總是在正確的分支上押注,如果沒有爭議斷言,她就自己斷言,

因為 Alice 總是在正確的分支上押注,所以她會贏下每一次糾紛,如果有任何人不同意 Alice,他們要么 (a) 與一個無關的第三方產生糾紛并損失押金,或者 (b) 最終和 Alice 產生糾紛并輸給 Alice 押金,無論哪種情況,所有與 Alice 不一致的人都將失去押金。只有同意 Alice 的押注才能存活下去,所以 Alice 在樹上的路徑最終會成為唯一一個有及時押注的分支 —— 并且 Alice 的路徑會被確認。

– 只要 Alice 是誠實的,無論別人怎么做,綠色方框都會得到確認 –

因為按這種方式系統是無需信任的,如果 Alice 押注某個方框,她一定知道到這個方框的路徑是可信的,Alice 可以確定這個方框最終一定會被確認,對于 Alice 來說,這條路徑就跟被敲定了一樣。

即使你沒有押注某條路徑,如果你看到有好幾個人對它押注,只要你相信其中至少有一個誠實的人,你就可以肯定這條路徑最終一定會被確認——對你來說,這條路徑就跟被敲定了一樣,

無需信任的終局性(Finality)的好處

為什么說無需信任的終局性有價值?經典的例子來自于之前對其他 rollup 協議的討論。假設一個虛擬機要向 Alice 進行支付,支付事件發生在誠實的路徑上,但是包含這筆支付的方框還需要等待一些時間被鏈上確認,

無需信任的終局性讓 Alice 可以立即拿到錢,如果 Bob 有余錢,可以立即付給 Alice,以交換 Alice 尚未被確定的收款(加上支付給 Bob 一點小費),Bob 只有在他能確定 Alice 的這筆收款一定會發生,才會想和 Alice 交易,Bob 可以通過押注誠實的結果來確保這一點——這樣他對這筆支付最終一定會發生抱有無需信任的信心。不僅僅是 Bob 可以這樣做。任何有點錢的人,都可以用這樣的方式借錢給 Alice 或者有她這樣需求的人,這些人通過提供更低的費用相互競爭,使 Alice 立即拿到錢的成本大大降低。

關鍵是,這種市場機制的可行性取決于無需信任的終局性。如果 “每個人” 都知道這件事最終會被確認,那么鏈上確認的延遲就不會帶來那么多的不便。

不僅對于支付,虛擬機能做的其他事情也是如此,如果虛擬機要生成一個日志事件記錄發生了什么事情,無需信任的終局性意味著任何人都可以肯定地采取行動,因為這個日志事件最終一定會被鏈上承認。

延遲攻擊

因為這個系統是無需信任的,壞人無法強行制造錯誤的結果。他們能做的只能是延緩系統,這樣做需要他們付出押金,如果押金數額巨大,則代價高昂,

想象一下,如果有人寧愿付出押金也要發動延遲攻擊,他們能造成的最壞的情況是怎樣的?

首先要注意的是,壞人無法阻止好人繼續構筑誠實的分支,而且他們也無法阻止好人獲得對 “誠實的分支終將被確認” 的無需信任的信心,

攻擊者能做的只是在錯誤的分支上押注,以延遲誠實路徑的鏈上確認,他們每次的押注都會產生一起和誠實參與者的糾紛,而誠實的參與者會從糾紛中拿走攻擊者的一大部分押金,等到攻擊者的全部押金被拿走了,鏈上確認還會繼續向前推進,

如果攻擊者多筆押注錯誤的結果會怎樣?那么這些押金會在一個接一個的糾紛中被拿走。如果有多人押注誠實的結果,這些人都可以進入糾紛解決,并行拿走攻擊者的押金。而且需要注意,所有人都很清楚發生了什么,很多人都想加入進來分一杯羹,押注正確的結果從攻擊者手上搶奪押金,如果誠實方有 K 個人押注,則在一次糾紛延遲期內,就要消耗攻擊者 K 份押金。如果攻擊者下更多的押注,那很可能會吸引更多的誠實押注者,這對攻擊者來說是個災難。

優化

還可以做很多優化來降低操作協議所需的鏈上記賬數據量,降低鏈上的 gas 消耗,讓攻擊者延遲攻擊引發的喂養狂潮更容易上演,我不會再這里詳述這些優化 —— 這篇文章已經足夠長了,

0 条回复 A文章作者 M管理員
    暫無討論,說說你的看法吧