本文轉載自:區塊律動
原文標題:《 An Incomplete Guide to Rollups 》
原文作者:Vitalik Buterin(V神)
原文翻譯:0x33,律動BlockBeats
Rollup 在以太坊社區中非常流行,在可預見的未來,它將成為以太坊的關鍵可擴展性解決方案。但是這項技術到底是什麼,你能從它中期望什麼,你將如何使用它? 這篇文章將試圖回答其中的一些關鍵問題。
背景:什麼是 Layer1 和 Layer 2 擴展?有兩種方法可以擴展區塊鏈生態系統。首先,您可以使區塊鏈本身具有更高的事務容量。這種技術的主要挑戰是,具有「更大區塊」的區塊鏈本身會更難驗證,而且可能變得更加中心化。為了避免此類風險,開發人員可以提高客戶端軟體的效率,或者更可持續地使用分片等技術,將構建和驗證鏈的工作拆分到多個節點上;眾所周知,「ETH2.0」目前正在努力構建對以太坊的升級。
其次,您可以更改使用區塊鏈的方式。用戶不是把所有的活動都直接放到區塊鏈上,而是在「Layer 2」協議中執行鏈外的大部分活動。有一個鏈上的智能合約,它只有兩個任務:處理存取款,以及驗證鏈下發生的所有事情都遵守規則的證明。有多種方法可以實現這些證明,但它們都有一個共同的特性,即驗證鏈上的證明比在鏈下進行原始計算要便宜得多。
狀態通道(State channels)對比 Plasma 對比 RollupLayer 2 的可擴展方式主要有三種,State channels、Plasma、Rollup。它們是三種不同的方式,各有優缺點,在這一點上,我們相當有信心所有的 Layer 2 擴展大致都可以歸入這三種類別。(儘管在命名方面存在爭議,例如有叫「validium」)。
狀態通道(State channels)是如何運作的?假設 Alice 向 Bob 提供網際網路連接,作為交換,Bob 每兆支付她 0.001 美元。Alice 和 Bob 使用了下面的 Layer 2 方案,而不是每次付款都進行交易。
首先,Bob 將 1 美元 (或一些 ETH 或穩定幣等價物) 放入智能合約。為了向 Alice 支付他的第一次付款,Bob 籤署了一張「票(ticket)」(一條鏈外消息),上面只寫著「$0.001」,並將它發送給 Alice。為了進行第二次付款,Bob 會在另一張寫著「0.002 美元」的票據上簽字,然後把它寄給 Alice。以此類推,需要多少付款就支付多少。當 Alice 和 Bob 完成交易後,Alice 可以將價值最高的票據發布到鏈上,該票據包裹在來自她自己的另一個籤名中。
智能合約驗證 Alice 和 Bob 的籤名,向 Alice 支付 Bob 票據上的金額,並將其餘部分返回給 Bob。如果 Alice 不願意關閉通道 (由於惡意或技術故障),Bob 可以啟動一個退出期 (例如 7 天);如果 Alice 在這段時間內沒有提供新票據,那麼 Bob 就可以拿回他所有的錢。
這種技術是強大的:它可以被調整以處理雙向支付、智能合約關係 (例如。Alice 和 Bob 在通道內製定了一個金融合約),以及組合 (如果 Alice 和 Bob 有一個公開的通道,Bob 和 Charlie 也有,那麼 Alice 可以與 Charlie 進行無需信任的交互)。
但是通道的作用是有限的。通道不能用於將資金在鏈外發送給尚未參與的人。通道不能用於表示沒有明確邏輯所有者的對象 (例如。Uniswap)。通道在用於做比簡單的經常性支付更複雜的事情時,需要鎖定大量資金。
Plasma 是如何工作的?
為了存入資產,用戶將其發送到管理 Plasma 鏈的智能合約。
Plasma 鏈為該資產分配一個獨立的 ID(比如 537)。每一個 Plasma 鏈有一個操作員 (這可以是一個的中心化的角色,或一個多重籤名,或更複雜的東西,如 PoS 或 DPoS)。每隔一段時間 (可以是 15 秒,或 1 小時,或兩者之間的任何時間),操作員會生成一個「批次處理」,包含他們在鏈下收到的所有 Plasma 交易。
它們生成一個默克爾樹(Merkle tree),在樹中的每個指數 X 處,如有一個交易,那就存在一個轉移資產 ID X 的交易,否則則為零。他們把這個默爾克樹根發送到鏈上。他們還將每個指數 X 的默克爾分支發送給該資產的當前所有者。為了撤回資產,用戶發布發送資產給他們的最新交易的 Merkle 分支。律動註:Merkle tree,中文稱為默克爾樹或哈希樹。在密碼學及計算機科學中是一種樹形數據結構,每個葉節點均以數據塊的哈希作為標籤,而除了葉節點以外的節點則以其子節點標籤的加密哈希作為標籤。Merkle Tree 的明顯的一個好處是可以單獨拿出一個分支來(作為一個小樹)對部分數據進行校驗,這個很多使用場合就帶來了哈希列表所不能比擬的方便和高效。
合約開始是挑戰期,在此期間,任何人都可以嘗試使用其他 Merkle 分支來使退出無效,方式可以是通過證明 (1) 發送者在發送時並不擁有資產, 或 (2) 他們在之後的某個時間點把資產發給了其他人。如果在 (例如)7 天內沒有人證明此筆退出是不真實的,則用戶可以撤回資產。
Plasma 提供了比狀態通道更強大的屬性:您可以將資產發送給從未屬於系統的參與者,而且資本要求也低得多。但這是有代價的:通道在「正常運行」期間不需要任何數據在鏈上運行,而等 Plasma 需要每個鏈定期發布一個哈希值。此外,等 Plasma 轉帳不是立即的:您必須等待間隔結束和區塊被發布出來。
此外,Plasma 和狀態通道有一個共同的弱點:為什麼它們是安全的?這背後的博弈論依賴於這樣的想法:兩個系統控制的每個對象都有一些邏輯上的「所有者」。如果該所有者不關心他們的資產,那麼可能會導致涉及該資產的「無效」結果。這對於許多應用程式來說是可以接受的,但對於許多其他應用程式 (例如。Uniswap)。即使是發送資產對象的狀態可以在沒有所有者同意的情況下改變的系統,(如。基於帳戶的系統,在那裡你可以增加某人的餘額,而無需他們的同意) 也不能很好的通過 Plasma 進行處理。
這一切都意味著,在任何現實的 Plasma 或狀態通道部署中,都需要大量的「應用特定推理」,而且不可能製造一個 Plasma 或通道系統來模擬整個以太坊環境 (或「EVM」)。
為了解決這個問題,我們可以看下……rollup。
Rollup
Plasma 和狀態通道是完整的 Layer 2 計劃,他們試圖將數據和計算都移出鏈外。然而,圍繞數據可用性的基本博弈論問題意味著不可能對所有應用程式都安全地做到這一點。Plasma 和通道依靠明確的所有者概念來解決這個問題,但這阻礙了它們的通用性。另一方面呢,rollup 是一種「混合」Layer 2 方案。
Rollup 將計算 (和狀態存儲) 移到鏈外,但在鏈上保留每個事務的一些數據。為了提高效率,他們使用一大堆花哨的壓縮技巧,儘可能用計算代替數據。其結果是,系統的可擴展性仍然受到底層區塊鏈數據帶寬的限制,但以一個非常有利的比率:一個以太坊底層 ERC20 代幣轉移成本約為 45000 gas,而一個 ERC20 代幣在 rollup 中轉移佔用 16 字節的鏈上空間,成本低於 300 gas。
數據鏈上的事實是關鍵 (注意:將數據「放在 IPFS 上」是行不通的,因為 IPFS 沒有就是否有任何特定數據提供達成一致意見;數據必須放在區塊鏈上)將數據放到鏈上並就這一事實達成共識,允許任何人在本地處理匯總中的所有操作 (如果他們願意的話),從而允許他們檢測欺詐行為,開始提款,或親自開始生產交易批次。缺乏數據可用性的問題意味著惡意的或離線的運營商可以做更少的傷害 (例如。它們不會造成 1 周的延遲),從而為那些有權發布批次的人打開了一個更大的設計空間,並使匯總變得更容易進行推理。
最重要的是,缺乏數據可用性問題意味著不再需要將資產映射到所有者,這就是為什麼以太坊社區相比以前的 Layer 2 擴展形式,更熱衷於 rollup 的關鍵原因:rollup 是完全通用的,甚至可以在 rollup 中運行 EVM,允許現有的以太坊應用程式遷移到 Rollup,幾乎不需要編寫任何新代碼。
好的,那麼 rollup 的工作有多棒呢?鏈上有一個智能合約,它維護一個狀態根:rollup 狀態的 Merkle 根 (意思是,帳戶餘額、合約代碼等,位於 rollup「內部」)。
任何人都可以發布批次處理,這是一個高度壓縮形式的事務集合,以及以前的狀態根和新的狀態根 (處理事務後的 Merkle 根)。合約檢查批處理中的前一個狀態根是否與當前狀態根匹配;如果有,則將狀態根切換為新的狀態根。
為了支持存取款,我們添加了讓事務的輸入或輸出「超出」rollup 狀態的能力。如果批處理有來自外部的輸入,提交批處理的事務也需要將這些資產轉移到 rollup 合約。如果批處理有輸出到外部,那麼智能合約在處理批處理時就會啟動提取。
那麼,只是這就有一個主要的細節:如何知道批次處理中的後狀態根是正確的? 如果有人可以提交帶有任何後狀態根的批處理,而不會產生任何後果,那麼他們就可以將 rollup 中的所有代幣轉移給自己。
這個問題很關鍵,因為這個問題有兩組非常不同的解決方案,這兩組解決方案會導致兩種類型的 rollup。
Optimistic rollup 對比 ZK rollup這兩種 rollup 就是 Optimistic rollup 和 ZK rollup。
Optimistic rollup, 它們使用欺詐證明:rollup 合約跟蹤其狀態根的整個歷史和每個批的哈希。如果有人發現一個批次處理有一個不正確的後狀態根,他們可以向鏈上發布一個證明,證明批處理計算錯誤。合約將驗證證明,並恢復該批次和之後的所有批次。
ZK rollup, 使用有效性證明:每個批包含一個稱為 ZK-SNARK 的加密證明 (例如,使用 PLONK 協議),證明後狀態根是執行批次處理的正確結果。無論計算量有多大,證明都可以在鏈上快速驗證。
這兩種類型的 rollup 之間存在複雜的權衡:
總的來說,我的觀點是在短期內,Optimistic rollup 有機會贏得多用途的 EVM 計算,ZKrollup 則有望在簡單支付層面、交易平臺以及其他特定於應用程式的用例上更勝一籌。不過在中長期來看,ZK rollup 會隨著 ZK-SNARK 技術的改進,在所有用例中勝出。
剖析欺詐證明optimistic rollup 的安全性取決於是否有人將無效的批處理髮布到 rollup 中,任何跟蹤該鏈並發現欺詐的人都可以發布欺詐證明,向合同證明該批產品是無效的,應該恢復。
聲稱批次無效的欺詐證明將包含綠色的數據:批處理本身 (可以根據存儲在鏈上的哈希值進行檢查) 和 Merkle 樹的部分只需要證明批處理讀取和/或修改的特定帳戶。
黃色樹中的節點可以由綠色節點重構,因此不需要提供(數據)。這些數據足以執行批處理和計算後狀態根 (注意,這與無狀態客戶端驗證單個塊的方式完全相同)。如果在批處理中計算的後狀態根和提供的後狀態根不相同,則批次處理是欺詐的。
可以保證,如果一個批次被錯誤地構建,並且所有以前的批次都被正確地構建,然後,就有可能創建一個欺詐證明,顯示批次構造是不正確的。注意關於以前批次的聲明:如果有多個無效批次發布到 rollup 中,那麼最好嘗試證明最早的一個無效。當然,如果一個批次處理被正確地構建出來,那麼就永遠不可能創建一個證明該批次處理無效的欺詐證據。
壓縮是如何工作的?
一個簡單的以太坊交易 (發送 ETH) 需要大約 110 字節。然而,在 rollup 上的一次 ETH 傳輸只需要大約 12 個字節:
部分原因是更高級的編碼:以太坊的 RLP 在每個值的長度上浪費了 1 個字節。但也有一些非常聰明的壓縮技巧正在進行:
Nonce:防止重播。如果一個帳戶的當前 nonce 是 5,那麼該帳戶的下一個事務必須有 nonce 5,但是一旦事務被處理,帳戶中的 nonce 將增加到 6,因此該事務不能再次處理。在 rollup 中,我們可以完全忽略 nonce,因為我們只是從 pre-state 恢復 nonce;如果有人試圖用一個較早的 nonce 重放事務,籤名將無法驗證,因為籤名將根據包含新的更高 nonce 的數據進行檢查
gas 價格:我們可以允許用戶在固定的 gas 價格範圍內付款,例如,進行 2 的 16 次方。或者,我們可以在每個批次中設置一個固定的費用水平,或者甚至將 gas 支付完全轉移到 rollup 協議之外,讓事務處理人員通過一個通道向批次創建人員支付。
gas:類似地,我們可以把 gas 總量寫成 2 的次方。或者,我們可以只在批次設定 gas 限制。
To:我們可以用一個索引代替 20 字節的地址。如果一個地址是添加到樹中的 4527 地址,我們只需使用索引 4527 來引用它。我們將向狀態添加一個子樹來存儲索引到地址的映射)。
價值: 我們可以用科學計數法來儲存價值。在大多數情況下,傳輸只需要 1-3 位有效數字
Signature: 我們可以使用 BLS 聚合籤名,它允許將許多籤名聚合成一個單個~32-96 字節 (取決於協議) 的籤名。然後可以一次針對批處理中的整個消息集和發送者檢查此籤名。表中的~0.5 表示一個聚合中可以包含多少個籤名是有限制的,因為需要在單個欺詐證明中驗證籤名。
ZK rollup 特有的一個重要壓縮技巧是,如果事務的一部分僅用於驗證,而與計算狀態更新無關,那麼可以將該部分留在鏈外。這個 optimistic rollup 是不能達成的,因為這些數據仍然需要包含在鏈上,以備日後需要在欺詐證明中進行檢查,而在 ZK rollup 中,證明批次正確性的 SNARK 已經證明提供了任何驗證所需的數據。
一個重要的例子是保護隱私的 ollps 總:在 optimistic rollup 中,用於每個事務的隱私的約 500 字節的 ZK- snark 需要放在鏈上,而在 ZK rollup 中,覆蓋整個批處理的 ZK- snark 已經毫無疑問地表明「內部的」ZK- snark 是有效的。
這些壓縮技巧是 rollup 可擴展性的關鍵;如果沒有它們,rollup 可能只會在基本鏈的可擴展性上提高約 10 倍 (儘管有一些計算量很大的應用程式,其中甚至簡單的 rollup 也很強大),而使用壓縮技巧,幾乎所有應用程式的縮放係數都可以超過 100 倍。
誰可以提交批次交易審核?關於 optimistic 或者 ZK rollup 中誰可以提交批次交易的觀點有很多。一般來說,每個人都同意,為了能夠提交一批,用戶必須提交一大筆存款。如果用戶曾經提交了一個欺詐性的批次交易 (例如,無效的狀態根),那筆存款將一部分燒掉,一部分作為對欺詐證明者的獎勵。但除了這種方法之外,還有很多可能性:
完全無秩序方式:任何人都可以在任何時候提交批次交易。這是最簡單的方法,但它有一些很嚴重缺點。特別是,存在一種風險:即多個參與者將生成並嘗試一起提交批次交易,而這些批次交易中只有一個可以被成功處理。這導致大量的精力浪費在生成證明上,且也會因為需要將批次交易上鏈而導致浪費 gas。
中心化的排序者(Sequencer):有一個單獨的參與者:排序者。他可以提交批次交易 (提款除外:通常的技術是,用戶可以首先提交一個提款請求,然後如果排序者在下一批中不處理該提款請求,那麼用戶可以自己提交一個單操作批次處理)。這是最「有效」的,但它依賴於一個中心化的角色來維持運作。
排序者拍賣:舉行拍賣決定誰有權成為(比如第二天)的排序者,這種技術的優點是它籌集的資金可以由比如 rollup 控制的 DAO 分配 (參見:MEV 拍賣)
從 PoS 集中隨機選擇:任何人都可以將 ETH(或者 rollup 自己的協議代幣) 存入 rollup 合約,每個批的排序者都是從一個存款人中隨機選擇的,被選中的概率與存入的金額成比例。這種技術的主要缺點是它會導致大量不必要的資本鎖定。
DPoS 投票:有一個單獨的排序者通過拍賣被選中,但如果他們表現不佳,代幣持有者可以投票將他們踢出去,並舉行新的拍賣來取代他們
分攤批次處理和狀態根供應目前正在開發的一些 rollup 使用的是「分攤批次處理」方式,其中提交一批 Layer 2 事務的操作和提交狀態根的操作是分開進行的。這種方式有一些關鍵的優點:
您可以允許許多排序者並行發布批次交易,以提高審查阻力,而不用擔心一些批次會因為其他批次被先包含進去而失效。
如果一個狀態根是存在欺詐行為的,您不需要恢復整個批次,您可以只恢復狀態根就行了,並等待某人為同一個批次處理提供一個新的狀態根。這為事務發送方提供了更好的保證,確保他們的事務不會被還原。
因此,總而言之,有一個相當複雜的技術園,試圖在複雜的權衡之間取得平衡,包括效率、簡單性、抵制審查和其他目標。現在說哪種組合最有效還為時過早;時間會告訴我們。
rollup 能給你多大的可擴展性空間?在現有的以太坊鏈上,gas 的上限是 1250 萬,交易中的每字節數據花費 16 gas。這意味著,如果一個塊只包含單個批次 (我們說使用了 ZK rollup,在證明驗證上花費了 500k gas),那麼該批次 (1200 萬/ 16)= 750000 字節的數據。
如上所示,對於每個用戶操作來說,ETH 轉帳的匯總只需要 12 個字節,這意味著批次處理最多可以包含 62500 個事務。在平均區塊時間為 13 秒時,這意味著大約 4807 TPS(相比之下,直接在以太坊本身上進行 ETH 轉帳的 TPS 為 1250 萬/ 21000 / 13 ~= 45 TPS)。
下面是其他一些用例的圖表:
最大可擴展性增益計算為 (L1 gas cost) / (rollup 字節數* 16)* 1200 萬/ 1250 萬。
現在,值得記住的是這些數據過於樂觀,原因有幾個。最重要的是,一個區塊幾乎永遠不會只包含一個批次,至少會有多個 rollup。其次,存取款將繼續一直會發生。第三,短期內使用率會很低,因此固定成本將佔主導地位。但即使考慮到這些因素,超過 100 倍的可擴展性也有望成為標準。
現在,如果我們想要超過 1000-4000 TPS(取決於具體的用例),該怎麼辦? 這就是 eth2 數據分片的切入點。分片方案每 12 秒就會開放 16mb 的空間,可以填充任何數據,並且系統保證對數據的可用性達成一致。此數據空間可用於 rollup。這個約 1398k 字節/秒比現有以太坊鏈的約 60kb /秒提高了 23 倍,從長遠來看,數據容量預計還會進一步增長。因此,使用 eth2 分片數據的 rollup 最多可以處理 100k TPS,將來甚至更多。
在 rollup 中還有哪些尚未完全解決的挑戰?雖然 rollup 現在是可以易於理解的基本概念了, 我們非常確信他們本質上是可行和安全的, 多個 rollup 方案已經部署到主網,但 rollup 設計仍有許多地區還沒有很好地開發, 如果要完全把大部分以太坊生態系統遷移到 rollup 以利用他們的可擴展性,還是存在不小的挑戰的。
一些關鍵的挑戰包括:
用戶和生態系統的適應:很少有應用程式使用 rollup,用戶對 rollup 並不熟悉,很少有錢包開始集成 rollup。商戶和慈善機構還不接受這種方式的付款。
跨 Rollup 交易:有效地移動資產和數據 (例如通過預言機輸出) 從一個 rollup 到另一個 rollup,而不需要經過基礎層。
審計激勵機制:如何最大限度地提高至少一個誠實節點實際將完全驗證 optimistic rollup 的可能性,以便在出現問題時發布欺詐證明? 對於小規模的 rollup(多達幾百個 TPS),這不是一個重要的問題,人們可以簡單地依賴利他主義,但對於大規模 rollup,還是需要更明確的推理。
探索 Plasma 和 Rollup 之間的設計空間:有沒有技術可以把一些,但不是全部的與狀態更新相關的數據放到鏈上,從中能得出什麼有用的結論嗎?
最大化預確認的安全性:許多 rollup 為更快的用戶體驗提供了「預確認」的概念,其中排序者立即提供了一個承諾,即交易將包含在下一批中,而如果他們違背他們的諾言,排序者存款將被銷毀。但是這個計劃的經濟安全性是有限的,因為有可能在同一時間對很多參與者做出很多承諾。這種機制還能改進嗎?
提高對缺席的排序者的響應速度:如果一個 rollup 的排序者突然脫機,那麼遇到這種情況的時候,最大程度地快速和低價地恢復排序者作用是十分有價值的,方法要麼就是快速和廉價地大量退出到一個不同的 rollup,要麼就是趕緊換一個排序者。
高效的 zk:生成一個 ZK-SNARK 證明,證明通用 EVM 代碼 (或現有智能合約可以編譯到的某些不同 VM) 已正確執行,並具有給定的結果。
結論Rollup 是一個強大的新的 Layer 2 擴展範例,預計在短期和中期 (也可能是長期) 將成為以太坊擴展的基石。他們已經看到了以太坊社區對於這件事的巨大興趣,與之前的 Layer2 擴展嘗試不同,他們可以支持通用 EVM 代碼,允許現有的應用程式輕鬆遷移。為了做到這一點,他們做出了一個關鍵的妥協:不嘗試完全脫離鏈,而是把每個交易的少量數據留在鏈上。
有很多種 Rollup,在設計領域也有很多選擇:比如使用 optimistic rollup 的欺詐證明,或者使用 ZK rollup 的有效性證明 (也就是 ZK-SNARKs)。排序者 (可以向鏈發布交易批次的用戶) 可以是一個中心化的參與者,也可以是一個自由參與者,或者是介於兩者之間的許多其他選擇。Rollup 仍然是一項早期技術,開發仍在快速進行中,但它們確實有效,其中一些 (特別是 Loopring、ZKSync 和 DeversiFi) 已經運行了幾個月。在未來的幾年裡,Rollup 空間將會出現更多令人興奮的工作。