Optimistic Rollup 爲何能以安全且可持續的方式實現擴容的同時又能保持去中心化?Optimistic Rollup 概念的提出者 John Adler 解釋其背後的設計原理。

原文標題:《科普 | Optimistic Rollup 爲什麼要這麼設計?》(The “Why”s of Optimistic Rollup)
撰文:John Adler
翻譯 & 校對:閔敏 & 阿劍

此刻正在閱讀這篇文章的你一定已經聽說過 Optimistic Rollup 了吧。它是一個前途無量的新型擴容方案,在 2019 年的 DevCon 上引發了熱烈討論。目前已經有很多文章解釋了該技術的工作原理,卻沒有一篇文章來解釋其背後的原因。這就導致有很多團隊都在嘗試用自己的方式來實現 Optimistic Rollup ,這種各自爲政的開發模式通常不利於整個加密貨幣經濟系統的安全性。

本文聚焦於那個被大衆忽略的問題:解釋 Optimistic Rollup 爲何能以安全且可持續的方式實現擴容,同時又能保持去中心化的特性。

何爲 Optimistic Rollup ?

我在 2019 年 6 月撰寫了 Optimistic Rollup 的首個最小可行規範,爲我早些時候與 Mikerah 合著的論文《構建可擴展的去中心化支付系統》提供了一個具體的參數化高級規範。該規範旨在實現區塊鏈發展史上的第一條具有免許可性和可擴展性的免信任型側鏈。

科普 | Optimistic Rollup 爲什麼要這麼設計?我說的 「Rollup」 不是可以吃的這種

Optimistic Rollup 的運作方式如下:任何人都可以在無需許可地提交一個側鏈區塊,將整個區塊作爲有待驗證(即有待默克爾化)的調用數據(calldata)發佈到鏈上,並交納保證金。一個新的側鏈區塊只能鏈接到側鏈的末端,由鏈上合約進行追蹤(從最簡化的角度看,該合約就像在運行一個側鏈的輕客戶端,存儲着側鏈區塊頭的哈希值)。一段較長的時間過後(這是一個系統參數,但需要足夠長,例如一至兩週),側鏈區塊會被確定下來,之後就會退還保證金。從側鏈中取款回到主鏈上的操作要在側鏈上發起,只需提供對一個已確定的側鏈區塊的非交互式包含證明(non-interactive inclusion proof)即可。如果一個側鏈區塊是無效的,且還沒有得到最終確認,只要提交一個非交互式錯誤性證明,回滾這條側鏈的末端,這個區塊連同其之後的區塊都會成爲孤塊。保證金會被銷燬一半,另一半則獎勵給提供錯誤性證明的人。這就實現了一條信任最小化的雙向資金橋樑。

沒錯,就是這麼簡單。那之前爲什麼一直沒能實現呢?

我來解釋下: 爲什麼要這麼設計 Optimistic Rollup?

事實證明,Optimistic Rollup 和之前的擴容方案之間存在一些細微差異,使前者成爲了最有前途的短期至中期擴容方案,讓後者成爲了歷史。這一節會介紹這些重要差異背後的成因。

合併共識

Optimistic Rollup 最突出的一個特點是合併共識(merged consensus)。合併共識是一種可在鏈上驗證的共識協議(除此之外還有真正的區塊驗證,它是通過隱式的錯誤性證明來完成的)。但什麼是去中心化共識協議呢?

去中心化共識協議包含以下幾個相互獨立的功能:

  • 分叉選擇規則(如何在兩條都遵守了共識規則而形成的鏈之間選擇出一條鏈)
  • 區塊有效性函數(狀態轉換函數)
  • 領導者選舉算法(通過該算法選舉出一位領導者來生成新的區塊,鏈接到區塊鏈的末端,從而增加區塊鏈的高度,或者說增加其長度)
  • 抗女巫機制(工作量證明、權益證明等)

上述功能保障了區塊鏈的經濟安全性:操縱歷史是要付出代價的。(注意:爲了簡單起見,這裏我忽略了一些事實,例如,一些去中心化共識協議是無領導者的)。

在 Optimistic Rollup 方案中,側鏈是不會出現分叉的,因此不需要分叉選擇規則。區塊有效性是在鏈下計算的,而且可以在鏈上用錯誤性證明來證明其不正確性。剩下還有領導者選舉和抗女巫攻擊的問題需要解決。

我所提出的規範提議採用 「先到先得」 機制,即在任一高度上,延長側鏈長度的首筆交易會被採納。領導者選舉是隱式的,而且事後纔會見出分曉,而抗女巫攻擊是通過主鏈實現的(即,交易費和 區塊大小 /Gas 上限)。如此簡單的領導者選舉規則爲何能起到作用?因爲以太坊區塊鏈已經提供了安全性。只有出現以下三種情況之時,才能將側鏈上的某個區塊變成孤塊:1)該區塊是無效的;2)該區塊的某個祖先區塊是無效的;3)以太坊區塊鏈發生重組。因此,有效的區塊也具備與以太坊同等程度的確定性和安全性!因此,我們不需要複雜的領導者選舉算法,或是成本高昂的抗女巫攻擊機制來保障安全性。側鏈無需付出額外的成本即可獲得安全性,因此我們可以極大地簡化系統參數的設置。

但是,如果我們想要一種能提前知道領導者的方案,該怎麼改造呢?一個建議是,可以在鏈上運行 PoS + RANDAO 來進行領導者選舉。這種情況下,並不需要納入另一種代幣,否則還會產生負面影響。正如比特幣白皮書中所言:

如果一個貪婪的攻擊者所擁有的 CPU 算力超過了所有誠實節點的算力之和,他就能選擇發動雙花攻擊,或是生成新的代幣。他理應發現遵守規則對自己最有利,因爲相比於破壞整個系統以及僞造個人資產來說,遵守規則能讓他獲得比其它礦工加起來都多的區塊獎勵。

正如中本聰所說,原生代幣的全部意義就是激勵 「誠實的大多數」 來保護整個系統。在 Optimistic Rollup 中沒有所謂 「誠實的大多數」,也沒有獨立於主鏈的安全性概念,因此完全沒必要再納入一種原生代幣,否則非但不會有任何助益,比起僅使用以太幣來說更不方便。

要注意的是,只要是完全在鏈上運行的領導者選舉機制都可以採用,不僅限於我在本文推薦的那些。例如,燒燬證明(Proof-of-Burn)就是其中之一。

Optimistic Rollup 雖然與延遲狀態執行(delayed state execution)和影子鏈(shadow chain)等提議有諸多類似之處,但是一大關鍵的區別在於合併共識的概念。Optimistic Rollup 的共識協議是完全在鏈上的智能合約之內運行的;因此,它不會影響到主鏈的共識規則,也不需要得到其支持。相較之下,延遲狀態執行和影子鏈實行的是鏈上自動狀態轉換,需要得到主鏈共識協議和協議內獎懲機制的明確支持。

可持續擴容

現在我們已經明白 Optimistic Rollup 是如何通過合併共識實現免許可性及其背後的原因了,那麼它是如何實現可持續擴容的呢?

在撰寫本文之時,未壓縮的以太坊狀態(用戶餘額和合約存儲)大小在 45GB 左右。不同於(交易和區塊之類的)歷史數據,狀態是不能夠被刪除的——必須由全節點完整地保存下來,以便驗證(即,執行)新區塊中的新交易。更糟糕的是,爲了驗證交易,必須對狀態進行很多次隨機訪問,因此需要將狀態存儲在 RAM —— 大多數消費級硬件都達不到這個條件 —— 或一個快速的 NVMe 固態硬盤上。狀態增長是以太坊遇到的最大的擴容瓶頸。

我們當然可以爲狀態大小設定一個硬性上限,這樣就可以不用擔心狀態增長問題了,真正的解決方案是實行狀態租賃機制,持續向狀態的使用者收取費用。然而,在以太坊上部署該機制比想象中更爲困難,已經被無限期推遲了(編者注:中譯本見文末超鏈接《論狀態租金和 Stateless Ethereum》)。

有一個很實用的解決方案,可以通過減緩狀態增長的速度來解決這一問題。那就是使用區塊鏈作爲數據可用性層。這種模式最初是由 ZK Rollup 推廣使用的:將側鏈交易數據作爲調用數據發佈到主鏈上,然後使用有效性證明或錯誤性證明來確保該數據的正確性。結果證明,存儲歷史數據的成本比存儲狀態要低得多(低幾個_數量級_)。之後,可以通過主鏈來確保數據可用性,追蹤 Rollup 鏈的區塊頭,處理存取款,並驗證 有效性證明 / 錯誤性證明,這些都不需要大量使用狀態。通過減緩狀態增長,擴容就可以實現長期可持續性。Vitalik 之前寫過一篇很好的文章,總結了如何將鏈上數據可用性運用到 ZK Rollup 和 Optimistic Rollup 上。

要注意的是,雖然有人指出影子鏈是完全等同於 Optimistic Rollup 的,這顯然是不對的。

現在,我的想法是創建一條完整的 「影子鏈」,把計算放到鏈下進行,但是會在生成 100 個區塊之後向主鏈提交狀態轉換的承諾。預言機可以將新的區塊添加到這條鏈的末端,其中每個區塊內都包含一個由交易組成的列表和一個由這些交易引發的狀態轉換_[[k1, v1], [k2, v2] ... ]_組成的列表。一個區塊生成之後,會有一個長達 100 個區塊的挑戰期,在此期間都沒有遭到挑戰的話,狀態轉換會被自動應用到主鏈上。

除了未被明確定義,影子鏈還會自動在鏈上執行狀態轉換,不會促進狀態增長。Optimistic Rollup 不會執行任何狀態轉換,除非有用戶爲此付費(即,取款)。

非交互性 FTW

對於 Optimistic Rollup 來說,非交互型錯誤性證明非常重要。爲什麼?

非交互型錯誤性證明之所以如此重要,是因爲要避免 Plasma Cash 存在的缺陷之一,即,針對無效歷史的交互型退出挑戰機制。這種交互型多步驟挑戰機制導致 Plasma Cash 對鏈擁堵攻擊的抵禦能力較低。所謂的鏈擁堵攻擊指的是攻擊者爲了竊取 Plasma 合約內的全部資金,向主鏈發送大量 「退出」 交易(不過,Plasma Cash 對這些攻擊抵禦能力比 Plasma M(ore)VP 更高)。只需要一個非交互型錯誤性證明就可以將(單條側鏈上)任意數量的無效 Optimistic Rollup 區塊變成孤塊,使系統更能抵禦鏈擁堵攻擊。注:由於 Optimistic Rollup 使用了錯誤性證明,如果主鏈不具備抗審查性的話,依然存在資金遭竊的風險。

在 Optimistic Rollup 中,提款也是通過非交互型的方式處理的:先是在側鏈上發起提款,然後針對主鏈上一個已得到最終確定的區塊生成非交互型包含證明,再利用這個證明來完成提款。然而,這就要求側鏈具有免許可性,因此需要的是合併共識,而非一個類似於 Plasma 的運營方。

相比交互型驗證遊戲來說,非交互型錯誤性證明更有優勢。交互型驗證遊戲所需的時間比較長。鑑於 Optimistic Rollup 是不會產生分叉的,攻擊者可以生成一個無效的區塊,利用驗證遊戲造成側鏈停擺,從而對系統發動 DoS 攻擊。有了非交互型錯誤性證明,就可以立即證實欺詐行爲(然而,需要注意的一點是,錯誤性證明的證明範圍比交互型驗證遊戲要窄——至於這種侷限性是否真的對區塊鏈應用有很大影響,這點尚待討論)。

交易延遲問題

Optimistic Rollup 並不會降低交易延遲。每一個側鏈區塊都需要被提交到主鏈上,因此出塊時間不會低於主鏈。除了使用足額質押的狀態通道之外,暫無其他安全且免信任的方式可以減低這種延遲。

不過,你不一定要等到側鏈區塊得到最終確定之後才接受它的交易。由於 Optimistic Rollup 不會產生分叉,成功上鍊的有效區塊必然會得到最終確認,而且該區塊的所有數據均可獲得(因爲所有有效區塊都發布在鏈上),用戶可以執行客戶端驗證,立即接受該區塊內的交易。

乍看之下,取款延遲似乎也是個問題,但事實並非如此。通常情況下,用戶不需要等待其提款得到最終確認。事實上,較長時間的挑戰期主要是爲了確保加密貨幣經濟安全性,一般來說都不會用得上。一種能夠立即取款的簡單方法是,在主鏈或另一條鏈上與流動性提供者(或其他想要在這條 Rollup 鏈上存款的用戶)進行原子交換 [參見鏈接中的 「快速提款:流動性提供者」 一節]。

科普 | Optimistic Rollup 爲什麼要這麼設計?Optimistic Rollup 可以讓你在無需支付 gas 費用的情況下實現即時交易!

數據可用性挑戰

我一開始的論文提出瞭解決數據可用性問題的三種方法:

  1. 始終將所有數據都發布到鏈上
  2. 利用數據可用性挑戰,只在必要之時將數據發佈到鏈上
  3. 利用數據可用性證明

數據可用性挑戰似乎是個比較簡單靠譜的解決方案。遺憾的是,如果是由被攻擊方來負擔挑戰費用的話,他們就會蒙受損失;如果是由攻擊方來負擔挑戰費用的話,整個系統就會每時每刻將所有數據都發布到鏈上。因此,在設計規範之時,Optimistic Rollup 的選擇是始終將所有數據都發布到鏈上,並以高效率低成本的方式來實現。不過後來,在 Optimistic Rollup 上使用數據可用性證明也變得可行了。

進一步改進

我已經基於最小規範的初始版本撰寫了性能改進方案,並總結如下。請注意,重點圍繞的是基於 UTXO 的支付,而非一般的智能合約執行。

以太坊 1.0 上的多線程數據可用性—— 數據驗證(即,進行哈希運算)和其它預處理步驟都是純函數,因爲它們根本不涉及任何狀態。因此,這些步驟都是可以並行的。按照這種方式來使用以太坊將極大減少狀態的使用和增長,如果使用的是四核計算機,那麼數據可用性吞吐量可以增加四倍。我的計劃是通過幾個 EIP 來實現這一點,第一個就是 EIP-2242:交易 Postdata 。

無需將中間狀態序列化的 UTXO 鏈緊湊型錯誤性證明—— 針對以太坊智能合約的通用型錯誤性證明成本很高。在 UTXO 數據模型內,每個 UTXO 最多隻能創建並消耗一次,每個交易都會完整描述狀態轉換。區塊生產者可以將元數據添加到每個輸入上,聲明這個輸入是由一個特定的輸出生成的。如果這種聲明有錯,則這種錯誤性是可以通過非交互的方式來證明的。我在另一篇文章中重新分析了 BIP-141 中提到的錯誤性證明機制。

使用默克爾累加器的無狀態查詢平行交易驗證(無狀態查詢的客戶端)—— 狀態查詢是非常昂貴的。無狀態客戶端就是通過消除對狀態的使用來降低成本。但我們可以搞簡單一點:只需免去狀態查詢即可。「見證數據(witness)」 是不會立即過期的,其有效性會持續幾個區塊。這些 「見證數據」 必須根據最新幾個區塊的狀態轉換進行比較,而狀態轉換可以在 UTXO 數據模型中通過無狀態計算得出。

鏈上非交互型數據可用性證明—— 如果自始至終都將數據上鍊的話,會帶來巨大的成本,還會導致 Optimistic Rollup 只能實現線性擴展(像 Plasma 這種完全位於鏈下的技術就不會有這個問題,而 Plasma Cash 的檢查點機制也是線性的)。我們可以將共識節點進行可用性檢查的能力通過一個 FFI 函數表示出來(例如,通過預編譯的方式),就可以在無需進行分片的情況下獲得二次方的可擴展性。這是 LazyLedger 等系統的核心思想,即,以低成本的方式大幅提高數據可用性。然而,不同於 LazyLedger ,在以太坊上實現這一思想並不會像前者那樣具備橫向擴展屬性。

通過停擺實現免信任型雙向橋側鏈—— 使用錯誤性證明的雙向橋側鏈必須一直保持在線,這點對用戶來說可能有些不便。雖然瞭望塔不適用於 Plasma Cash ,但它可以應用到 Optimistic Rollup 上。但是,我們可以做得更好:可以在側鏈運行一段時間後完全停擺,然後向用戶提供一個較長的窗口期(長達數月之久),以便用戶提交錯誤性證明來決定有效的區塊。這段用戶必須在線的窗口期是已知且有限的。等窗口期結束之後,才允許取款。如果用戶想要早一點取款的話,可以與流動性提供者進行原子交換。

構建 Optimistic Rollup 的團隊

自從幾個月之前第一版 Optimistic Rollup 最小化規範撰寫完成以來,我欣然發現很多開發團隊都開始構建 Optimistic Rollup 的實現了,其中經歷了很多波折和修改。下面是一張不完全列表,列舉了我們目前看到的正在構建 Optimistic Rollup 的開發團隊(排名不分先後)。

Fuel—— 聚焦於穩定幣支付的 UTXO 數據模型。可以用來進行任意的 ERC-20 代幣或 ETH 轉賬,或是進行原子交換,未來還可以用來進行 「斷言」 腳本撰寫。該模型即將上線長期公共測試網(編者注:Fuel 現已開啓公開測試網)。

Plasma Group—— 在 OVM (Optimistic Virtue Machine)環境下的通用型類 EVM 智能合約,已經在 Devcon 5 上宣佈與 Uniswap 達成合作。

Arbitrum—— 使用了交互型驗證遊戲機制的通用型智能合約。除此之外,新的 Arbitrum Rollup 設計與 Optimistic Rollup 大致相同。

Interstate Network—— 使用錯誤性證明的通用型類 EVM 智能合約。

SKALE—— 使用 BLS signature 聚合的 Optimistic Rollup 。

NutBerry—— 使用了交互型驗證遊戲機制的通用型類 EVM 智能合約。

IDEX—— 爲 IDEX 交易所構建了 「優化型 Optimistic Rollup」。

結論

隨着各種各樣的 Optimistic Rollup 實現項目上線,接下來的一年以太坊將發生巨大改變,其吞吐量將得到大幅提高,並在數據可用性方面進一步實現可持續擴容。 我在本文中沒有將 Optimistic Rollup 與 ZK Rollup (這一概念最初叫作 roll_up ,由 Barry Whitehat 提出,之後由 Vitalik 改進成 ZK Rollup )進行對比。如果你對此感興趣的話,可以看一下 Alex Gluchowski 寫的這篇文章(編者注:中譯本見文末超鏈接《Optimistic Rollup vs. ZK Rollup:一探究竟》)。

感謝 Mikerah Quintyne-CollinsJames PrestwichRobert Drost 和 Joseph Chow 的審校。

來源鏈接:medium.com