最近,以太坊創始人Vitalik Buterin在一篇題為“混合式二層協議的曙光” 的文章裡對Rollup方案大加讚賞,認為它為智能合約的可擴展性打開了大門。
那麼什麼是Rollup?它包括哪些主流方案?這些方案各自有什麼優缺點?它們未來發展的前景如何?
Rollup的出現
最近幾年,以太坊二層(Layer-2)擴容技術得到了迅猛發展。
所謂二層,就是將一部分資金存儲在主鏈智能合約裡,在保證足夠安全的前提下,把一部分交易放到主鏈之外進行,就好像鏈下多出來了一層網絡。
在二層方案裡表現比較突出的就是狀態通道和Plasma側鏈。雖然這兩種方案誕生時間很早,但是發展的卻比較緩慢。其背後的原因歸根結底是數據的可用性問題。
就在二層擴容技術舉步維艱的時候,一種名叫Rollup的新方案被提了出來。
但是與狀態通道和Plasma不同的是,它可以“打包”交易,並將“打包”後的交易數據連同一個SNARK零知識證明發佈到鏈上。
打包的正確性可以通過零知識證明來見證,負責“打包”的操作者不可能發布惡意或無效的交易。這就是後來被Vitalik Buterin稱之為ZK Rollup 的二層擴容方案。
ZK Rollup並非萬能,它遇到的最大問題就是通用性。除非要證明的交易非常簡單,否則創建SNARK證明的成本會非常高。
因此,一種名叫Optimistic Rollup的折中方案被提了出來。
Optimistic Rollup同樣也是把交易數據都放到鏈上,但不是用SNARK做見證,而是採用“加密經濟學有效性博弈”來實現有效性驗證。
作為一種提高區塊鏈吞吐量的技術,Rollup可以在有效提高網絡吞吐量的同時,避免對協議層進行大量的更改,部署Rollup也不需要對網絡發起硬分叉升級。
目前已經有許多以太坊上的項目(如Celer,ANON等)採用了Rollup協議來提高Dapp的吞吐量和用戶體驗。
Rollup是如何工作的?
鏈上有一個智能合約,它維護狀態根:rollup狀態的Merkle根(意思是,“餘額”內的帳戶餘額,合同代碼等)。
任何人都能夠以高度壓縮的形式發布批處理,交易集合以及先前的狀態根和新的狀態根(處理交易後的Merkle根)。
合同檢查批處理中的先前狀態根是否與其當前狀態根相匹配;如果是這樣,它將狀態根切換到新的狀態根。
為了支持存款和提款,我們增加了使輸入或輸出處於rollup狀態“之外”的交易的功能。
如果批次具有來自外部的輸入,則提交該批次的事務也需要將這些資產轉移到rollup合同中。
如果某個批次有外部輸出,則在處理該批次時,智能合約會啟動這些提款。
就是這樣!除了一個主要細節:如何知道批次中的狀態後根是正確的?
如果某人可以提交具有任何後期狀態根源的批次而沒有任何後果,那麼他們可以將rollup中的所有Token轉移給自己。
這個問題很關鍵,因為有兩個非常不同的解決方案系列,而這兩個解決方案系列就導致了兩種rollup方式。
樂觀匯總與 ZK 匯總
Rollup的兩種類型分別是Optimistic rollup和ZK Rollup。
樂觀匯總
Optimistic rollup,使用欺詐證明—rollup合同會跟踪其整個狀態根歷史以及每個批次的哈希值。
如果有人發現某個批次的狀態後根不正確,則發布需要鏈的證明,以證明該批次的計算不正確。合同將驗證證明,並還原該批次及其之後的所有批次。
零知識匯總
ZK rollup,使用有效性證明—每個批次都包含一個稱為ZK-SNARK的加密證明(例如,使用PLONK協議),這證明後狀態根是執行批次的正確結果。
無論計算量有多大,都可以在鏈上非常迅速地驗證證明。
總的來說,我個人認為,在短期內,對於通用EVM計算而言,樂觀可能會勝出;而對於簡單付款,交易和其他特定於應用的用例,ZK可能會勝出。
隨著ZK-SNARK技術的改進,中長期ZK將在所有用例中勝出。
Rollup工作細節
在Optimistic Rollup中,首先我們需要設立一個可信任的節點,這個節點負責收集所有的交易信息、驗證然後打包.
打包後的信息集合將帶上該節點的簽名發送到區塊鍊網絡中。
當一個可信節點設置成功後,該節點將成為Rollup節點,這個節點需要同全節點一樣,下載整個區塊數據並實時更新區塊狀態。
我們仍舊以之前那個公司為例,假設目前有2000筆交易正在等待執行,公司的員工會將2000筆交易發給Rollup節點。
之後,Rollup節點需要根據已有的狀態和區塊數據,對交易進行驗證,並保存以下數據集(交易內容,交易前狀態,交易後狀態)。
當Rollup節點對所有交易完成了驗證與執行並生成數據集後,節點需要對這個數據集進行簽名,即Sig Rollup節點(交易內容,交易前狀態,交易後狀態)。
最後將簽名與數據集整合到一筆交易中,這個交易被稱作斷言Assertion,發送到區塊鍊網絡等待其他節點驗證即可。
需要注意的是,網絡中的其他節點並不會驗證Rollup節點發來的數據集,僅僅只驗證其簽名,驗證完畢後將根據數據集更新區塊鍊網絡狀態。
正如它的名稱“Optimistic Rollup”,實際上所有的Rollup協議由於將交易驗證從鏈上轉移到了鏈下,因此都是一種基於“樂觀”的假設—假設大多數情況下Rollup節點不會作惡。
但光有樂觀假設是不足的,節點總會因為各種各樣的原因出現問題。
為了避免這些節點惡意行為,提高作惡成本,Optimistic Rollup中還有如下機制:
一方面,Rollup節點需要向網絡質押一定額度的Token,這些Token有一定的解鎖時間,並會在Rollup節點做出惡意行為時被罰沒。
另一方面,Rollup節點所提交斷言不會被網絡立即認可,所以存在一定時間的窗口期(一般是1週)。
如果其他節點認為該Rollup節點提交的斷言存在惡意行為,節點可以質押一定押金並對該斷言發起挑戰。
並且區塊鏈中的出塊/驗證節點會對該斷言中的所有內容(包括數據集)進行重新驗證、執行,比對交易狀態的差距。
如果的確存在惡意行為,那麼Rollup節點的押金會被罰沒,則發起挑戰的節點則會獲得一定獎勵。如果不存在惡意行為,則發起挑戰節點的押金會被罰沒。
另外,在窗口期結束時沒有其他節點對斷言發起挑戰的話,斷言中的狀態信息將會被係數更新至區塊鏈狀態中。
Optimistic Rollup可以將多個交易信息經可信第三方聚合為單筆信息,由於交易中的狀態變更情況是由鏈下節點驗證而非鏈上節點驗證。
因此降低了區塊鏈上節點的驗證難度(僅需要驗證Rollup節點所提交的簽名,並更新由該節點提交的狀態信息即可)。
數據集雖然看起來並沒有較單個交易的疊加更小,但數據集因為不會受鏈上節點的驗證,故不需要為其支付高昂的手續費。
依靠這種Layer2處理方案,可以很容易的提高區塊鏈的有效吞吐量。
ZK rollup是如何工作的?
一個簡單的以太坊交易(發送ETH)需要約110個字節。但是,Rollup上的ETH傳輸僅佔用約12個字節。
ZK特有的一個重要壓縮技巧是,如果事務的一部分僅用於驗證,而與計算狀態更新無關,則可以將該部分留在鏈下。
這不會完全在樂觀的狀態下完成,因為如果以後需要在欺詐證明中檢查數據,則仍需要將數據包含在鏈上。
而在ZK中,SNARK證明批次的正確性已證明任何數據提供了驗證所需的信息。
還有一個重要的例子是隱私保護,在樂觀的狀態下,每筆交易中用於隱私的約500字節需要進行保留,而在ZK中,覆蓋整個批次的ZK-SNARK已經沒有了。
這些壓縮技巧是Rollup可伸縮性的關鍵。沒有它們,Rollup可能只會使基礎鏈的可伸縮性提高約10倍,而採用壓縮技巧時,縮放係數幾乎可以超過100倍所有應用程序。
鏈金分析
Rollup的基本概念現在已經得到了很好的理解,但我們可以肯定它們在根本上是可行且安全的,並且已經將多個Rollup部署到了主網上。
但仍有很多Rollup設計領域尚未得到很好的探索,充分利用以太坊的可伸縮性,將以太坊生態系統的大部分完全整合到Rollup中還將面臨很多挑戰。
Rollup是一種強大的新的2層伸縮範例,在短期和中期的未來(以及可能也是長期的)中,有望成為以太坊伸縮的基石。