撰文:Georgios Konstantopoulos,加密風投公司 Paradigm 研究合伙人,
編譯:詹娟
Paradigm 授權鏈聞翻譯并發表該文章中文版本,
在以太坊生態系統中,最大的挑戰之一是在資源嚴重制約(如 CPU、帶寬、內存、磁盤空間)的情況下,如何實現低延遲和高吞吐量。
系統的去中心化是由網路中最弱的節點驗證系統規則的能力所決定的,可以在低資源硬件上運行的高性能協議,可以被稱為「可伸縮」,
在這篇文章中,我們將深入探討當前「2 層解決方案」的原理、它們對應的安全模型,以及它們如何解決以太坊的可伸縮性問題,
如果你有興趣了解更多關于前沿的以太坊的可伸縮技術,想要知道如何構建和架構此類系統,那么這篇文章或許對你有幫助。
在整個文章中,重要的關鍵詞或概念會用粗體突出顯示,這些都是你在學習加密貨幣知識的過程中會遇到的單詞 / 術語,這個話題很復雜。也許讀的過程中會感覺有點困惑,但只要堅持看完,相信將有所收獲,
區塊鏈資源需求
有三個因素會影響去中心化網路(如比特幣和以太坊)中運行節點的資源需求:
- 帶寬:下載和廣播任何與區塊鏈相關的數據的成本,
- 計算:在腳本或智能合約中運行計算的成本,
- 存儲:為編制索引而存儲事務數據的成本,以及為繼續處理新的事務塊而存儲「狀態」的成本。值得注意的是,存儲「狀態」(帳戶余額、合約字節碼、nonce 值)比存儲原始事務數據成本更高。
衡量性能的方法有 2 種:
- 吞吐量:系統每秒可以處理的事務數量,
- 延遲:事務處理所需的時間。
比特幣和以太坊這類新興加密網路的理想屬性是去中心化,但是使網路去中心化的構成要素是什么呢?
- 低信任度:這個屬性可以讓任何個人驗證比特幣的數量不會超過 2,100 萬,或者說他們的比特幣不會被偽造,獨立運行節點軟體的人員會計算最新的狀態,并驗證在此過程中是否遵循了所有規則。
- 低成本:如果節點軟體的操作成本很高,個人將依賴可信的第三方來驗證狀態。高成本意味著高信任需求,這是我們首先想要避免的,
另一個需要的屬性是可伸縮性:將吞吐量和延遲以超線性的方式擴展到運行系統的成本的能力,這個定義很好,但沒有包含「信任」,因此,我們明確了「去中心化的可伸縮性」:在不顯著增加系統信任假設的情況下實現可伸縮性,
放大來看,以太坊的運行時環境是以太坊虛擬機(EVM),通過 EVM 運行的事務以不同的成本執行各種操作,例如,存儲操作的成本高于添加操作的成本,事務中的計算單元稱為「gas」,系統的參數設置為每個區塊最多處理 12.5m gas,平均每 12.5 秒產生一個事務區塊,因此,以太坊的延遲為 12.5 秒,吞吐量為每秒 100 萬 gas。
你可能會問:每秒 100 萬 gas 能帶來何種效益?
- 每秒 ~47 筆「簡單轉賬」事務。這些事務消耗 21,000 gas, 負責將 ETH 從 A 轉移到 B,是最簡單的事務類型。
- 每秒 ~16 筆 ERC20 代幣轉賬。與 ETH 轉賬相比,這些方法涉及更多的存儲操作,因此每次的成本為 ~60k gas,
- 每秒 ~10 筆 Uniswap 資產交易。代幣對代幣交易的平均成本約為 102k gas,
- …隨便挑一個你喜歡的事務的 gas 成本,并將其除以 1m (12.5m / 12.5 /gas)
注意,隨著事務的執行復雜度增加,系統的吞吐量會降低到很低的數值。還有改進的空間!
解決方案 1:使用一種中介
我們可以使用一個可信的第三方來促成所有的事務,這樣一來,我們就能獲得非常高的吞吐量,而且延遲可能只會是亞秒級的,太好了 ! 這不會改變任何系統范圍內的參數,但我們將會選擇加入第三方單方面設定的信任模式。他們可能會選擇對我們進行審查,甚至沒收我們的資產。這是不可取的,
解決方案 2:讓區塊更大,更頻繁
我們可以通過減少兩個區塊之間的時間來減少延遲,也可以通過增加區塊 gas 限制來增加吞吐量,這一改變將使運營節點的成本更高,使得個人難以運行節點(這一點已經在 EOS、Solana、Ripple 等平臺出現了),
在解決方案 1 中,對信任的需求增加了,在方案 2 中,成本增加。這就消除了它們作為可伸縮性選項的可能性。
從第一原則出發,重新發現 Optimistic Rollup
在下一節中,我們假設讀者對哈希和默克爾樹已經有所了解,
根據我們到目前為止學到的知識,讓我們模擬一個蘇格拉底對話,目標是發現一種既能增加以太坊有效吞吐量,同時又不增加用戶和節點操作者負擔的協議。
問:我們想在不顯著改變信任和成本假設的情況下擴展以太坊。該怎么做呢?
答:我們想要降低現有操作對系統成本的要求(見上面的三種資源類型),為了理解為什么要做到這一點并不容易,我們需要先看看以太坊的架構:
以太坊的每個節點目前都存儲并執行用戶提交給它的每筆事務,在執行過程中,事務通過 EVM 運行,并與 EVM 的狀態(例如存儲、余額等)交互——這種操作非常昂貴。常見的智能合約優化技術以最小化與狀態的交互次數為核心,但它們只能提供較小的常量改進。
問:你是說有一種方法可以在不涉及狀態的情況下進行交易,從而保持較低的資源成本?
答:在極限情況下,我們是否可以把所有的執行都移出鏈外,同時保留一些數據在鏈上?我們可以通過引入一個被稱為「排序者」 (sequencer) 的第三方來實現這一點。他們負責本地存儲和執行用戶提交的事務,為了保持系統的活躍度,排序器需要定期提交他們接收到的事務的默克爾根以及以太坊上產生的狀態根。這是朝著正確方向邁出的一步,因為我們只在以太坊的狀態中存儲 O (1) 數據,用于 O (N) 鏈下交易,
問:所以我們通過讓排序者計算鏈下的一切,只發布默克爾根來實現伸縮?
答:是的,
問:好的,所以一旦你加入,排序器能保證你的轉賬費用很便宜,那么存款和提現會如何操作?
答:用戶將通過在以太坊上存錢的方式進入系統,然后排序者將相應的金額記入用戶的賬戶。用戶可以在以太坊上提出這樣的交易內容,比方說,「我想提現 3 個 ETH,我的賬戶目前有 >3 ETH,這是證明」,即使第 1 層沒有實際的用戶狀態,用戶也能拿出排序器發布的狀態根顯示相關的默克爾證明,表明他們在當前狀態下有足夠的資金,
問:現在我們知道了,用戶需要默克爾證明來提取他們的資金。用戶如何獲得構建默克爾證明的數據?
答:他們可以要求排序者給他們提供數據!
問:萬一排序者暫時或永久不可用,那該怎么辦?
答:排序者可能是惡意的,也可能只是因為技術問題而離線,這將導致性能下降(或者更糟,偷走你的資產!)。因此,我們還必須要求排序者在鏈上提交完整的事務數據來進行存儲,但不能執行。在這個問題上,目標是獲得數據可用性,假設所有數據都永久存儲在以太坊上,即使排序者消失了,新的排序者也可以從以太坊中檢索所有第 2 層相關的數據,重建最新的第 2 層狀態,并從他們的前任離開的地方繼續,
問:如果排序者在線,但拒絕向我提供默克爾證明數據,我可以從以太坊下載嗎?
答:沒錯,你可以自己同步一個以太坊節點,或者連接到眾多托管節點服務中的一個。
問:有一點我還是不明白,你怎么能在以太坊存儲東西而不執行它呢?不是每個事務都要通過 EVM 嗎?
答:假設你提交了 10 個事務,將 ETH 從 A 轉移到 B。執行每筆事務都將執行以下操作:增加 A 的 nonce,減少 A 的余額,增加 B 的余額。這得從以太坊的世界狀態里進行相當多的寫入和讀取。相反,你可以將所有事務的編碼發送到智能合約的 publish (bytes _transactions) public { } 函數中。注意,該函數的主體是空的!這意味著發布的交易數據不會被解釋、執行,也不會在任何地方進行狀態訪問,它只是存儲在區塊鏈的歷史日志中(寫入的成本很低)。
問:我們能信任排序者嗎?萬一他們發布了一個無效的狀態轉換怎么辦?
答:任何時候排序者在發布一批狀態轉換時,都會有一個「爭議期」,在這期間任何一方可以發布「欺詐證明」以表明其中某個狀態轉換無效。這可以通過在鏈上重放導致狀態轉換的事務,并將產生的狀態根與排序者發布的狀態根進行比較來證明,如果狀態根不匹配,則欺詐證明成功,并取消狀態轉換,如果在無效的狀態轉換之后還有更多的狀態轉換,它們也會被取消,但如果事務已經過了爭議期,就沒法再對其質疑了,它們會被視為最終交易,
問:等一下!你之前說過,如果 a)增加成本,或 b)引入新的信任假設,那么它就不屬于可伸縮性,在你描述的方案中,我們不是又另外假設總是會有人舉報欺詐嗎?
答:是的。我們假設存在一個被稱為「驗證器」的實體,他們負責監視欺詐行為,如果第 1 層和第 2 層狀態不匹配,他們就會發布欺詐證據。我們還假設驗證器能夠在爭議期限內可靠地獲得以太坊中包含的欺詐證據,我們認為驗證器的存在是一個「弱」假設。想象一下,如果有一個應用程式有成千上萬的用戶,你只需要一個人來運行一個驗證器,這聽起來不算太離譜!另一方面,改變以太坊的信任模式,或增加以太坊節點的運營成本是我們不想做的「強」假設改變。這就是我們在定義去中心化的可伸縮性時所說的「顯著改變底層系統的假設」。
問:我同意有人會運行一個驗證器,因為各方都能從這個新解決方案的成功中獲益。但當然這也取決于實際操作的成本,那么運行一個驗證器和一個排序器的資源需求是什么?
答:排序者和驗證者必須運行一個以太坊完整節點(不是存檔節點),一個完整的第 2 層節點,才能生成第 2 層狀態,驗證者運行的軟體負責創建欺詐證明,排序者運行的軟體負責捆綁用戶事務并予以發布。
問:就是這樣嗎?
答:是的!恭喜你!您已經重新發現了 Optimistic Rollup (Optimistic Rollup 是「Optimistic 合約」和「鏈上數據可用性」(又名「數據匯總」)的組合),這是 2019-2021 年最令人期待的伸縮解決方案,原因很好理解,因為它是以太坊社區多年研究過程的最終產物,你應該已經在上面這個簡短的對話中體會到了這一點。
Optimistic 的激勵
第 2 層的擴展基于這樣一個事實:我們試圖最小化執行的鏈上事務的數量,我們使用欺詐證明來取消任何可能發生的無效狀態轉換。由于欺詐證明是鏈上交易,我們還希望將以太坊上發布的欺詐證明的數量最小化,在理想的情況下,欺詐從未發生過,因此,欺詐的證明也從未被發出。
我們通過引入忠誠債券(fidelity bond)來抑制欺詐行為。為了讓用戶成為排序者,他們必須首先在以太坊上發布一個債券,如果被證明存在欺詐,他們將喪失該債券,為了激勵個人發現欺詐行為,排序者的債券在被削減后會分發給驗證者。
忠誠債券和爭議期
在設計欺詐證據的激勵機制時,有兩個參數需要調整:
- 忠誠債券規模:排序者必須公布分發給驗證者的數量,規模越大,成為驗證者的動機就越大,而作為排序者進行欺詐的動機就越小,
- 爭議期期限:可以發布欺詐證明的時間窗口,在此時間窗口之后,第 2 層交易在第 1 層上被認為是安全的。爭議期較長,可以為防止審查攻擊提供更好的安全保障。爭議期較短,則能為從第 2 層撤回到第 1 層的用戶創造良好的用戶體驗,因為他們不需要等待很長時間就可以在第 1 層上重新使用他們的資金,
在我們看來,對于這兩個參數都無法找到一個確切的靜態值。也許 10 個 ETH 債券和 1 天的爭議期足矣,但也許 1 個 ETH 和 7 天也夠。真正的答案是,這取決于成為驗證者的動機(這取決于運行成本),以及發布欺詐證明的難易程度(而這取決于第 1 層的擁塞程度),這兩者都應該是可調的,可以手動調,也可以自動調。
值得一提的是,EIP1559 向以太坊引入了一個新的 BASEFEE 操作碼,該操作碼可用于估計鏈上的擁塞,并因此以編程方式調整爭議期的持續時間,
如何正確實施這一懲罰機制至關重要,否則它將在實踐中被人濫用,我來舉個例子,說明什么是幼稚而沒有實操性的實現:
- Alice 貼出了一個 1 ETH 債券,她因此得以在系統中擔任排序者
- Alice 發布了一個欺詐狀態更新
- Bob 注意到了這一點,并發表了一項爭議。如果成功,這將能把 Alice 債券中的 1 個 ETH 授予 Bob,并取消欺詐狀態更新
- Alice 注意到了這個爭議 ,也發表了一個爭議 (挑戰她自己!)
- ALice 得到了她的 1 ETH,即使她試圖欺詐,實際上也沒有受到任何懲罰。
Alice 可以通過「搶跑」的方式來發動這種攻擊,即廣播與 Bob 相同的交易,但 gas 價格更高,從而導致 Alice 的交易在 Bob 之前執行,這意味著 Alice 可以持續嘗試以最小的成本(僅含以太坊交易費用)作弊,
解決這個問題很簡單:不是將全部債券授予爭論者,而是將 X% 的債券燒毀,在上面的例子中,如果我們燒掉 50%,那么 Alice 將只會得到 0.5 個 ETH,這就足以阻止其在步驟 2 中嘗試作弊,當然,銷毀債券減少了運行驗證器的動機(因為支付變得更少了),因此需要確保債券在燒掉部分后依然足以激勵用戶成為驗證者。
對 Optimistic Rollup 常見的批評和我們的回應
現在我們已經完成了 Optimistic Rollup 的構建模塊,讓我們探討并解決對該機制的最流行的批評,
長時間的提款 / 爭議期對于采用和可組合性是致命的
我們在上面提到過,長期的爭議期對安全有好處,這里似乎存在一種固有的取舍:爭議期過長對用戶來說不好,因為用戶如果想要提取資金的話需要等待很長時間,爭議期較短,當然能帶來流暢的用戶體驗,但這樣你就會冒欺詐發生的風險,
我們認為這不成其不問題。由于存在漫長的提現延遲可能性,我們預計做市商將迅速介入并提供更快的提現服務,這是可能的,因為驗證第 2 層狀態的人可以正確判斷一個提現是否存在欺詐的可能,從而會以較小的折扣來「購買」 他們的服務。舉個例子:
參與者:
- Alice:在第 2 層有 5 個 ETH,
- Bob:在「做市商」智能合約中,第 1 層上有 4.95 ETH,并且在第 2 層上運行一個驗證器
步驟:
- Alice 讓 Bob 知道她想要「快速」取款,并向他支付 0.05 ETH 的費用
- Alice 向 Bob 的「做市商」智能合約發出取現要求
- 此時可能會發生兩種情況:
- Bob 在他的第 2 層驗證器上檢查提款是否有效,并批準快速取款,這將立即將 4.95 ETH 轉移到 Alice 的第 1 層地址,在提款期結束后,鮑勃可以領取這 5 個 ETH,凈賺一筆。
- Bob 的驗證者提醒他該交易無效。Bob 對該交易引起的狀態轉換提出異議,取消交易,并因排序者允許惡意交易發生而賺取其債券。
愛麗絲要么是誠實的,立即把錢拿出來,要么是不誠實的,會受到懲罰。我們希望支付給做市商的費用會隨著時間的推移而壓縮,如果有對這項服務的需求的話,最終讓用戶完全看不到這個過程。
該特性最重要的含義是,它可以實現與第 1 層合約的可組合性,而不必等待完整的爭議期,
注意,這種技術最早在「Simple Fast Withdrawals」(簡單快速提現)一文中描述過。
礦工可以通過賄賂來審查提現,破壞 Optimistic Rollup 的安全
在「Optimistic Rollup 的近零成本攻擊場景」的帖子中,有人認為,礦工的激勵過大,這會導致排序者與以太坊礦工勾結,不愿去審查任何有爭議的交易。當然,考慮到系統安全對于解決爭議的依賴,這對任何 Optimistic 體系都是致命的,
我們不同意這篇文章的論點。我們假設,誠實的一方總是愿意賄賂礦工,而且能提供比惡意方更多的資金,此外,每當礦工們因為幫助惡意方獲勝而偏離「誠實」行為時,都會產生額外的成本。這種行為會破壞以太坊的價值,而這反過來會增加礦工從事這種行為的額外成本。
事實上,這種情況已經在學術文獻中得到了研究,證明了「這種反擊的威脅會誘導出一種不發生攻擊的子博弈完美均衡」,
我們要感謝 Hasu 讓我們注意到這篇論文的論證,
驗證者的困境對操作驗證器、破壞 Optimistic Rollup 產生了抑制
針對驗證者的困境,Ed Felten 撰寫了一個出色的 分析 和 解決方案,我們總結如下:
- 如果該體系的激勵機制如預期那樣發揮作用,就沒有人會作弊
- 如果沒有人作弊,那么運行一個驗證程式就沒有意義了,因為你從操作它中賺不到錢
- 因為沒有人運行驗證器,所以最終有機會讓排序者作弊
- 排序者作弊,系統不再按預期運行
這聽起來很重要,而且近乎自相矛盾的。在假設獎勵規模固定的情況下,更多的驗證者會減少單個驗證者的預期報酬,此外,驗證者多了,能分到的蛋糕似乎就會隨之減少,發生的欺詐行為更少,這進一步加劇了這個問題。在后續分析中,Felten 還提供了一種解決驗證者困境的方法,
我想在這里采取相反的立場,我認為驗證者的困境并不像批評者說的那么重要。在實踐中,作為一個驗證者是存在非金錢激勵的,比方說,你可能在一個匯總平臺上構建大型應用程式,也可能持有代幣,如果系統失敗,那么你的應用程式將無法運行,或者你持有的代幣將會貶值,除此之外,對快速提款的需求為做市商驗證者創造了存在的動力(正如我們在上一節所看到的那樣),這并不受欺詐行為的影響,說得更具體一點,比特幣沒有提供任何激勵措施來存儲整個區塊鏈歷史或向同行提供你的本地數據,但人們還是無私地這樣做。
即使在真空環境中運行驗證器并不符合激勵機制,它也能保證系統的安全,這對于那些投資于系統成功的實體來說是最重要的事情。因此,我們認為在 Optimistic 系統的第 2 層中,不需要設計機制來繞過驗證者的困境。
結論
我們分析了 2021 年對以太坊至關重要的技術之一: Optimistic Rollup。
總結其好處:Optimistic Rollup 是以太坊的擴展,它承載了以太坊的安全性、可組合性和開發人員護城河,同時提高了性能,不會對以太坊用戶的成本或信任需求造成實質性的影響。我們探索了使 Optimistic Rollup 發揮作用的激勵結構,并對常見的批評提出了回應。
我們想要強調的是,Optimistic Rollup 的性能上限是由第 1 層上發布的數據所決定的,因此,它的優點在于:1) 盡可能地壓縮你發布的數據(例如通過 BLS 簽名聚合),2) 擁有一個大而廉價的數據層(例如 ETH2),
作為補充閱讀,我們推薦 Buterin 的關于 Rollup 和 信任模型 的 不完整指南,我們還建議去研究 Optimistic Rollup 的近親 ZK Rollup,最后,還有其他方法可以獲得去中心化的可伸縮性,即分片和狀態通道,它們各有優缺點。
來源鏈接:research.paradigm.xyz
