編者按:本文來自以太坊愛好者(ID:ethfans)編者按:本文來自
以太坊愛好者(ID:ethfans)
以太坊愛好者(ID:ethfans)
以太坊愛好者(ID:ethfans)
,作者: Vitalik,翻譯&校對:Shengchao & 阿劍,Odaily經授權轉載。中文譯本)。譯者註:
背景知識:什麼是一層擴容,什麼是二層擴容?"第二種擴容的方式是改變使用區塊鏈的方法。用戶不需要直接把所有的活動都直接放在區塊鍊主鏈上,而是在主鏈外的“二層” 協議中執行大部分活動,並生成一個證明,證明鏈外發生的這一切活動都遵循規則。主鏈上部署一個智能合約,它只有兩個任務:處理存取款,以及對上述證明進行驗證。有多種方法實現證明和驗證,但它們都有一個共同的特性,那就是在鏈上驗證證明比在鏈下做原始計算的開銷要小得多。"中文譯本二層擴容主要有三種方案:狀態通道,Plasma 和rollup。三種方案代表了三種不同的範式,每種方案有自己的優缺點。所有的二層擴容大致都屬於這三類(對於一些折衷的方案如何分類存在爭議,例如“ validium ”)(編者註:
想像一下,Alice 向Bob 提供了網絡連接服務。作為交換,Bob 為上網產生的流量支付0.001 美元/MB 的費用給Alice。 Bob 不需要在一層主鏈支付每筆費用,雙方使用如下二層方案。"首先,Bob 將1 美元(穩定幣,或是等值的ETH)存入一個智能合約中。為了向Alice 支付第一筆款項,Bob簽署了一張"票據Rollup
狀態通道技術很強大:廣義的狀態通道可以支持雙向支付、實現智能合約(例如Alice 和Bob 在通道中籤訂金融合約),並具有可組合性(如果Alice 和Bob 之間有一個開放的通道,Bob和Charlie 之間也有一個開放的通道,那麼Alice 就可以和Charlie 進行免信任的交互)。但是通道的作用是有限制的:不能向還沒有加入通道的用戶在鏈下發送資金;不能用於沒有明確邏輯所有者的對象(比如Uniswap 智能合約)。此外,如果使用通道處理的事務比小額支付場景更複雜,需要鎖定大量的資金在通道中。另請參閱Plasma原始白皮書,Plasma Cash
要將資產從主鏈存入Plasma 鏈,用戶需要在主鏈將資產發送至管理Plasma 鏈的智能合約。 Plasma 鏈會給該資產分配一個新的唯一ID(例如537)。每條Plasma 鏈都有一個操作者(這可能是一個中心化的角色,或者由多簽控制,也可以是更複雜的東西,例如一條PoS 鍊或DPoS 鏈)。每隔一段時間(可以是15 秒,也可以是一小時,或者介於兩者之間的任何時長),操作者就會生成一個“批處理”(batch),包含這段時間內所收到的所有Plasma 鏈的交易。操作者生成一棵Merkle 樹,在索引為X 的葉子節點處,如果資產ID 為X 的資產在這一批次中發生了交易,則葉子節點上存有對應交易,否則該葉子節點為零。操作者將這棵樹的Merkle 根發佈到主鏈上。操作者還需要將每個索引X 的Merkle 分支發送給該資產的當前所有者。如果需要將資產從Plasma 鏈提取至主鏈上,用戶需要給主鏈的智能合約發送該資產最近一次交易對應的Merkle 分支。智能合約隨即開始了一個挑戰期(例如7天),在此期間,任何人都可以嘗試使用其他Merkle 分支來證明:(i)用戶在提取資產時並不擁有該資產,或者(ii)用戶在某個時間點將資產發送給了其他人,從而使退出申請無效。如果在7 天內沒有人證明退出是欺詐性的,用戶便可以成功取回資產。此外,Plasma 和狀態通道都有一個重要缺陷:其安全模型所對應的博弈論依賴於這樣的想法:兩個系統所控制的資產在邏輯層面都要有Optimistic rollups vs ZK rollups
。只要資產所有者在乎自己的資產,那麼當涉及該資產的狀態變更“無效” 時,資產所有者就會想辦法出示變更“無效” 的證明。這對一些應用來說無關緊要,但對不少其他應用來說這是個問題(例如Uniswap)(譯者註:對於Uniswap 這樣的DEX 交易應用來說,其智能合約不屬於任何人,與上述安全假設依賴的想法矛盾)。即使系統中一個對象的狀態可以在未經系統所有者同意的情況下被改變(例如在基於賬戶的系統中,可以在未經所有者同意的情況下增加其餘額),也不能很好地與Plasma 兼容。這意味著,在現實中部署plasma 或狀態通道時,都需要推演“特定應用” 的潛在邏輯設計定制化方案,不太可能做出一個能完整模擬以太坊運行環境(即“EVM”)的plasma或狀態通道系統。接下來讓我們看看rollup 是如何解決這個問題的。- 另請參閱:EthHub 關於optimistic rollup 的介紹,EthHub 關於ZK rollup 的介紹
- ZK Rollup,Plasma 和狀態通道方案都是“完全的” layer 2 方案,因為它們將數據和計算都轉移到鏈下(即自己的二層系統中)。然而,數據可得性的基本博弈論原理意味著這樣的系統不可能安全地實現所有應用。 Plasma 和狀態通道通過明確資產對象和所有者之間的關係來解決這個問題,但這使它們無法完全通用。 Rollup 則與前兩者不同,是一種具有“混合性質” 的二層方案。 Rollup 將計算(和完整的狀態存儲)轉移到鏈下,但在鏈上保存了每筆交易的部分數據信息。為了提高效率,Rollup 使用了一系列花哨的壓縮技巧,並儘可能地用計算替代數據。其結果是,這個系統的可擴展性仍然受限於底層區塊鏈的數據帶寬,但在此基礎上實現的擴容倍數非常可觀:在以太坊主鏈執行一筆ERC-20 代幣的轉賬大約消耗45000 gas,但在Rollup 中,每筆交易僅需要在主鏈上存儲16 字節數據,消耗的gas 小於300。
數據存儲在主鍊是Rollup 的關鍵因素(請注意:這同將數據存儲在“IPFS” 上不同,因為IPFS 不會對存儲的數據進行共識,Rollup 的數據則必須存儲在區塊鏈上)。將數據存儲在主鏈並進行共識,使得任何人可以在本地處理Rollup 中的所有操作,包括欺詐檢測,發起提款,生成批處理等。因為不存在數據可得性問題,所以運營者如果作惡或者離線所造成的損失相對更少(比如他們無法造成長達1 週的退出延遲),也在誰有權發布批處理這個問題上提供了更多的可能性,同時也使Rollup 更易於理解。更為重要的是,不存在數據可得性問題意味著,資產無需和所有者有明確的邏輯映射關係。相比其他二層擴容方案,這是以太坊社區對Rollup 感到更加激動的重要因素:Rollup 是具有通用性的,比如可以在Rollup 中運行EVM,從而使現有的以太坊應用可以在不寫新代碼的情況下遷移至Rollup。
在主鏈上有一個智能合約,存有一個狀態根—— 表徵Rollup 狀態的Merkle 根。 (狀態內容包括Rollup 中的賬戶餘額,合約代碼等)
任何人都可以在主鏈上對該智能合約發起一個批處理事務(transaction),這個批處理是對一批Rollup 內部事務的高度壓縮,還包括舊的狀態根和新的狀態根(在舊狀態根基礎上執行批處理交易之後生成的新狀態根)。主鏈合約會檢驗舊的狀態根與新的狀態根是否匹配(譯者註:即新的狀態根是否可以由這一批交易集觸發狀態轉換生成)。如果檢驗通過,主鏈上的舊狀態根會更新為新狀態根。為了支持存款(譯者註:將資產從主鏈的其他地方存入Rollup 合約)和取款(譯者註:解除Rollup 合約對自己資產的控制,使之返回到鏈上其他地方),批處理中的事務的輸入或輸出可以是Rollup “外部”(譯者註:即主鏈其他地方)的狀態。如果批處理中有交易的輸入來自Rollup 之外,那麼這個批處理操作會將主鏈其他地方的資產轉移至Rollup 合約中。如果批處理中有交易的輸出來自Rollup 之外,那麼這個批處理會觸發智能合約中的取款操作,將資產從Rollup 取回主鏈。整個過程就這麼簡單!不過還有一個細節。如何知道批處理執行完成之後的狀態根是正確的?如果有人可以提交一個偽造的狀態根,而不產生任何後果,他們就可以把所有的資產轉移給自己。這個問題很關鍵,因為這個問題有兩種截然不同的解決辦法,從而形成了兩種類型的Rollup。Rollup 的兩種類型包括:
Optimistic Rollup,使用欺詐證明解決上述問題:主鏈的Rollup 合約記錄了該Rollup 內部狀態根變更的完整記錄,以及每個(觸發狀態根變更的)批處理的哈希值。如果有人發現某個批處理對應的新狀態根是錯誤的,他們可以在主鏈上發布一個證明,證明該批處理生成的新狀態根是錯誤的。合約校驗該證明,如果校驗通過則對該批處理之後的所有批處理交易全部回滾。
使用有效性證明解決上述問題: 每個批處理中包含一個稱為ZK-SNARK 的密碼學證明(例如使用PLONK協議, 證明新狀態可以由舊狀態經此批處理操作後轉換而來(譯者註:在ZK Rollup 中,提交的密碼學證明只需要具有尺寸小,驗證快的特性即可,無需具有零知識性,所以只需要SNARK 即可實現ZK Rollup,不是一定需要ZK-SNARK。事實上,在ZK Rollup 中,因為批處理交易信息存儲在主鏈上,而這些信息恰是密碼學證明系統中所證明的內容,因此ZK Rollup 本身並不具有零知識性,具有零知識性的ZK Rollup 被稱為ZK ZK Rollup)。無論批處理的計算量多大,都可以在主鏈上高效對證明進行驗證。- 總的來說我自己的觀點是,短期內Optimisitc Rollup 很可能在實現具有通用性的EVM 中勝出,ZK Rollup 很可能在簡單的支付、轉賬和其他特定應用中勝出。但從中長期來看,隨著ZK-SNARK 技術的改進,ZK Rollup 將在所有應用場景中勝出。
- Optimistic Rollup 的安全性取決於這樣的想法:如果有人將一個無效的批處理髮佈到Rollup 中,任何同步了該鏈的人只要發現欺詐行為便可以向主鏈上的合約發布欺詐證明,證明該批處理是無效的,應該被回滾(譯者註:不清楚作者這裡的“該鏈(the chain)” 到底是指主鏈,還是指Rollup,雖然都是對的)。
- 一個斷言某個批處理無效的欺詐證明需要包括上圖中以綠色標識的數據:該批處理本身(可與存儲在鏈上的哈希值進行核對)以及證明該批處理讀取或修改了特定賬戶的默克爾樹路徑。黃色的節點可以通過綠色的節點重建,所以無需包含在證明中。這些數據足以執行批處理併計算新的狀態根(請注意,這與無狀態客戶端驗證單個區塊的方式完全相同)。如果計算出的新狀態根和批處理中提供的新狀態根不一樣,那麼就證明了該批處理是欺詐的。
- 可以確保的是,如果一個批處理中存在錯誤,而在此之前的所有批處理都是正確的,那麼就可以創建一個欺詐證明,證明該批處理的構造是錯誤的。注意如果在Rollup 中有多個無效的批處理,那麼最好盡量證明最早的那個批處理無效。當然可以確保的是,如果一個批處理是正確的,那麼永遠不可能創建一個欺詐證明,證明該批處理是無效的。
壓縮是如何實現的?"一筆最簡單的以太坊轉賬(發送ETH)大約需要110 字節,但是在Rollup 中實現ETH 轉賬只需要大約12 字節:"這其中的部分原因是Rollup 可以採用更簡單的高級編碼技巧,而目前以太坊的RLP 在每個值的長度上浪費了1個字節。同時Rollup 還運用了一些非常聰明的壓縮技巧。Nonce:這個參數的目的是為了防止重放。如果一個賬戶狀態當前的nonce 是5,那麼該賬戶的下一筆交易的nonce 參數必須是5,但是一旦交易被處理,賬戶狀態中的nonce 就會被遞增為6,這樣nonce 為5 的交易就不會再被打包。在Rollup 中,我們可以完全省略nonce,因為我們只需要從更新前狀態中恢復nonce;如果有人試圖用較早的nonce 重放交易,簽名將無法通過驗證,因為簽名校驗將使用nonce 更大的數據。Gas Price:我們可以允許用戶使用固定範圍的Gas 價格進行支付,例如範圍是0 - 2 的16 次冪。另外,我們也可以只為每個批處理收取固定的費用,甚至可以將gas 支付完全移到Rollup 之外,讓交易者通過特定渠道向批處理創建者支付費用。
Gas:我們同樣可以只是將Gas 總量範圍選擇為2 的冪。另外,我們也可以只在批處理層面設置Gas 限制。 (譯者註:這裡的Gas Price 和Gas,都是為了比較通過rollup 合約和以太坊網絡來轉賬所產生的數據量。並不代表一個rollup 協議一定要包含這些概念。比如Fuel 作為一種Optimistic Rollup協議,就是基於UTXO 的,完全不包含這些概念。)To:我們可以用索引代替20 字節的地址(例如,如果一個地址是添加到樹上的第4527 個地址,我們就用索引4527 來表示。我們會在狀態中添加一個子樹來存儲索引到地址的映射)。- Value:我們可以用科學計數法來存儲Value。在大多數情況下,轉賬只需要1-3 個有效位。
- Signature:我們可以使用BLS 聚合簽名,使許多簽名聚合成一個約32 - 96 字節(具體大小取決於所使用的協議)的簽名。然後,這個簽名可以一次性對整個消息集和發送者進行批處理的簽名校驗。表中的~0.5 表示在一個主鏈區塊中可以驗證的聚合簽名數量是有限的,因此如果批處理中的交易較多,需要約每100 筆交易生成一次聚合簽名。 (譯者註:大意是,驗證聚合簽名的計算量會隨被聚合的原始簽名的數量增加而增加,而以太坊主鏈區塊可以使用的Gas 數量是有上限的,因此聚合簽名不能一次性聚合太多原始簽名。)
- ZK Rollup 有一個特殊的重要壓縮技巧:如果交易的一部分只用於驗證,與計算狀態更新無關,那麼這部分數據可以不存儲在主鏈上。這在Optimisitc Rollup 中是做不到的,因為該數據仍然需要存儲在鏈上,以備後續欺詐證明校驗的不時之需,而在ZK Rollup 中,證明某批處理數據正確性的SNARK 證明,已經證明了相關方提供了所有驗證所需的數據。一個重要的例子是實現具有隱私保護性質的Rollup:在Optimisitc Rollup 中實現隱私保護,每筆交易中用於保護隱私的約500 字節的ZK-SNARK 需要上鍊,而在ZK Rollup 中實現隱私保護,覆蓋整個批處理的ZK-SNARK 已經可以證明
- 的ZK-SNARK 是有效的。 (譯者註:由於SNARK 可以嵌套,故在ZK Rollup 中實現隱私保護,只需將最終生成的最外層的SNARK 提交上鍊即可,在驗證外層SNARK 時,內層的SNARK 的有效性同時可以得到驗證。)
這些壓縮技巧是Rollup 實現擴容的關鍵,如果沒有這些技巧,Rollup 或許只能在主鏈的擴容基礎上實現大約10 倍的擴容(儘管在一些特定的大計算量的應用中,簡單的Rollup 實現的擴容已經很強大),但在使用了壓縮技巧之後,幾乎所有應用的擴容係數都可以超過100 倍。
誰可以提交批處理?"split batch"對於哪些人可以在Optimistic Rollup 或ZK Rollup 中提交批處理這個問題,已經存在許多流派。一般來說,大家都認為提交批處理的用戶必須質押一大筆押金,如果某用戶曾經提交過一個具有欺詐性的批處理(例如提交一個無效的狀態根),那麼這筆押金的一部分將被燃燒銷毀,另一部分獎勵給提交欺詐證明的用戶。但除此之外,還存在許多可能:- (譯者註,可以將批處理髮佈到主鏈上的用戶稱為sequencer(排序者),該術語得名原因是該角色需要對批處理中的交易進行排序)
- 完全無許可的排序者:任何人都可以在任何時候提交批處理。這個方法最簡單,但有一些嚴重的缺點,比如存在這樣的問題:多個參與者同時生成並試圖提交批處理,而其中僅有一個批處理可以成功被收錄。這將導致在生成證明的計算開銷或提交證明時的Gas 開銷有大量被浪費。
中心化的排序者:通過排序者這樣的角色提交批處理(提現操作除外:在提現操作中,首先由用戶自己提交提現請求,如果排序者在下一個批處理中沒有處理該筆提現交易,那麼用戶可以親自提交一個僅包含一筆提現交易的批處理申請)。這種方法“效率”最高,但需要依賴一個中心化的角色。排序者拍賣:通過拍賣(比如每天)來決定誰有權利成為第二天的排序者。這種方案的優點是可以籌集資金,而這些資金可以通過Rollup 的DAO 來分配(參考MEV 拍賣)。
從PoS 集合中隨機選擇:任何人都可以將ETH(或者Rollup 協議設定的代幣)存入Rollup 合約中,每一個批處理的排序者都會在這些存款人中隨機選取,被選中的概率與存款金額成正比。這種方案的主要缺點是需要鎖定大量資產。
目前正在開發的一些Rollup 採用的是“分割-批處理”(
你可以允許許多排序者並行發布批次,以提高抗審查能力,減輕對於某些批處理會因為其他一些批處理提前打包而無效的擔心。如果一個狀態根存在欺詐,無需回滾整個批處理,可以只回滾狀態根,並等待有人為同一批處理提供新的狀態根。這樣可以更好地確保交易發送者的交易不會被還回滾。
- 在現有的以太坊主鏈上,每個區塊的Gas 上線是1250 萬,而交易的每個字節存儲在鏈上花費16 Gas。這意味著,如果一個區塊中只包含一個批處理(這裡假設使用ZK Rollup,校驗證明花費50 萬Gas),那麼這個批處理可以包含1200 萬/ 16 = 75 萬字節的數據。而如上文所述,Rollup 中的每一筆ETH 轉賬只需要12 字節的存儲空間,這意味著每個批處理中可以包含62500 筆交易。目前以太坊主鏈的區塊間隔是13 秒,也就是說實現的TPS 約為4807(相比之下,以太坊主鏈上實現ETH 轉賬的TPS 約為1250000 / 21000 / 13 = 45)。
- 最大擴容倍數計算方法:以太坊主鏈對應操作的Gas 消耗/ (Rollup 中對應操作需上鍊的字節數* 16) * 1200萬/ 1250 萬
- 需要說明的是,出於某些原因,這些數字其實是過於樂觀的。最重要的原因是,一個區塊中幾乎不可能只包含一個批處理,因為到時會有多個不同的Rollup 系統。第二個原因是,存款和提現操作始終將會存在。第三個原因是,短期內Rollup 的使用量可能較低,因此固定成本的收費模式會佔據主導。不過即使考慮了這些因素,超過100 倍的擴容應該不難實現。
總結
雖然現在Rollup 的基本概念已經被人們所熟知,我們也很確定Rollup 從本質上說上是可行的、安全的,而且已經有多個Rollup 在以太坊主網部署,但Rollup 在設計層面仍有許多地方沒有被很好地探索,如果要將以太坊生態系統的大部分都完全引入Rollup 從而利用其擴容性,這方面仍存在不少挑戰。一些關鍵的挑戰包括:用戶和生態系統的入駐:目前使用Rollup 的應用不多,用戶對Rollup 不熟悉,很少有錢包開始整合Rollup。商家和慈善機構還不接受它們用於支付。