精通以太坊

第 16 章以太坊擴容

第 16 章

以太坊擴容

約 44 分鐘閱讀 · 3 個小節

以太坊是最強大、使用最廣泛的區塊鏈平台之一,但正如我們一再看到的,成功總伴隨著成長的陣痛。以太坊已經熱門到基礎層難以負荷:gas 費用經常高到讓交易變得太過昂貴,系統也逐漸被它必須處理的龐大資料拖累。雖然以太坊開發者陸續推出了多項升級,例如 EIP-1559(見第 6 章)、合併(The Merge,2022 年把共識協議從工作量證明(PoW)改為權益證明(PoS)的硬分叉),以及 EIP-4844(proto-danksharding,本章稍後會介紹),但第一層(L1)的根本限制仍是大規模採用的瓶頸。這些改進有所幫助,卻無法免除對其他擴容方案的需求,例如第二層(L2)rollup。

備註

L2 rollup 是一種擴容方案:在鏈外處理交易,再把摘要(例如證明或一批資料)發布到以太坊的第一層。這樣能減少壅塞、降低手續費,同時仍仰賴以太坊提供安全性。rollup 主要有兩種:樂觀 rollup(假設交易有效,有錯再提出挑戰)與零知識 rollup(用密碼學證明執行正確)。以太坊實質上成了結算層(settlement layer),也就是說,它的主要角色轉向驗證證明、確保資料可用性(data availability,DA),並為 L2 交易提供最終的安全保證。我們會在本章的後半部詳細探討 rollup。

16.1. 以太坊第一層的問題

要完整理解以太坊在擴容上的挑戰,我們需要把問題拆成四大項:擴容三難(scalability trilemma)、gas 成本與網路壅塞、狀態成長與儲存,以及區塊傳播與最大可提取價值(MEV)。這些問題並不是以太坊獨有的——其他鏈也會以不同形式遇到同樣的問題——但以太坊的熱門程度把它們放大了。我們就逐一深入探討。

16.1.1. 擴容三難

以太坊就像任何無需許可的區塊鏈一樣,有三個基本目標:去中心化、安全性與可擴展性。但問題在於:改善其中一項,往往意味著犧牲另一項。這就是 Vitalik Buterin 所說的 擴容三難。

我們把它拆開來看:

去中心化

去中心化讓以太坊具備抗審查性,而且免信任。任何人都能執行節點、驗證交易並參與網路,不需要任何中央機構的許可。

安全性

安全性確保以太坊能抵禦攻擊。交易必須不可逆轉,智能合約必須不可變更,惡意行為者也不該有任何簡單的方法操縱系統。

可擴展性

可擴展性讓網路能處理每秒數千甚至數百萬筆交易(transactions per second,TPS),使它真正能在全球普及。

挑戰在於,像以太坊這樣的傳統區塊鏈,在設計上是以犧牲可擴展性為代價,換取完全的去中心化與安全性。每一筆交易都由所有節點處理,這確保了正確性,卻也造成瓶頸。

為什麼不能直接提高吞吐量?如果我們試著把區塊變大(好容納更多交易)來加快速度,能執行完整節點的人就會變少,因為硬體需求會變得太高。這可能把以太坊推向中心化,讓網路只由少數幾個實力雄厚的實體掌控——這正是我們想要避免的。

其他區塊鏈,例如 Solana,採取了不同的做法。它們針對速度與可擴展性做了最佳化,代價是犧牲去中心化,執行節點需要更強大的硬體。以太坊拒絕在去中心化上妥協,讓擴容的挑戰變得更加困難。

隨合併引進的權益證明,取代了耗能龐大的工作量證明系統。這不只大幅降低了以太坊的能源用量,也削弱了那些負擔得起大規模挖礦設備的大型參與者的主導地位。雖然質押帶來了新的中心化風險,但它仍是朝向更容易參與、更有效率的網路邁出的一步。不過,權益證明也帶來了新的挑戰,例如大型質押池造成的中心化風險。流動性質押方案讓質押的 ETH 保持可用,卻也把控制權集中在少數幾個平台手上。如何找到適當的平衡,仍在持續摸索中。

16.1.2. gas 成本與網路壅塞

對以太坊使用者來說,最令人沮喪的經驗之一就是高昂的 gas 費用:交易成本會隨著網路需求劇烈波動。這是怎麼發生的?為什麼尖峰時段的手續費會這麼貴?

以太坊交易需要 gas,這是一種衡量執行轉帳或與智能合約互動等操作所需運算量的單位。操作越複雜,需要的 gas 就越多。每個區塊能容納的 gas 有限,因此大家會競爭區塊空間(block space)。需求高的時候,使用者互相出價競爭,手續費就跟著被推高。

我們已經看過這種情況以戲劇化的方式上演:

CryptoKitties 熱潮(2017 年)

這是以太坊極限的第一次真正考驗。一款讓使用者繁殖、交易數位貓咪的簡單遊戲,把網路塞得水洩不通,交易時間慢如牛步,gas 費用飆漲。

DeFi Summer(2020 年)

Uniswap 與 Compound 這類去中心化金融(DeFi)應用的爆發,為以太坊帶來了龐大的活動量。交易者爭先恐後地送出交易,有時為了在記憶池中取得優先權,要付出數百美元的 gas 費用。

NFT 熱潮(2021 年)

非同質化代幣(NFT)的發售變成了 gas 競價戰(gas war),人們付出數千美元,只為了搶在別人之前鑄造一件新的數位收藏品。有些交易即使使用者在 gas 上花了驚人的金額,仍然失敗。

以太坊的第一層當初並不是設計來有效率地應付這種程度的需求。不過,2021 年引進的 EIP-1559 改變了手續費的運作方式:它引進了可變的區塊大小與新的 gas 定價機制,減少了網路活動頻繁時 gas 費用的暴漲。L2 方案日益普及,讓以太坊能把相當一部分的運算負擔卸載出去,進一步降低了 gas 費用。最近推出的 EIP-4844(proto-danksharding)則大幅降低了手續費,特別是 L2 rollup 的手續費,讓使用者更負擔得起以太坊交易。儘管有這些改進,以太坊的交易成本仍高於大多數其他區塊鏈(見圖 16-1)。

各區塊鏈的 gas 成本比較
圖 16-1. 各區塊鏈的 gas 成本比較

16.1.3. 狀態成長與儲存問題

以太坊不只是用來交易;它是一台全域狀態機,持續追蹤帳戶餘額、智能合約資料、DeFi 部位、NFT 以及其他鏈上活動。傳統資料庫可以封存或刪除舊紀錄,以太坊則不同,它在設計上就要保留完整的歷史,以確保透明度與可驗證性。問題在哪?隨著以太坊成長,它需要儲存的資料越來越多,儲存的負擔也越來越重。

目前,以太坊狀態的大小——基本上就是所有活躍帳戶、合約餘額與儲存槽(storage slot)的集合——正以驚人的速度成長。每個新的智能合約都會讓狀態增加,每一筆交易也都會修改它。完整節點在驗證網路完整性上扮演關鍵角色,必須儲存並持續更新這些資料。隨著狀態成長,個人要在沒有昂貴硬體的情況下執行完整節點會越來越困難,引發了對去中心化的擔憂。

封存節點面臨的挑戰更大。這些節點不只儲存目前的狀態,還儲存以太坊完整的歷史紀錄,包括過去的每一筆交易與每一次合約執行。這些資料的總量高達數 TB,需要可觀的儲存容量與頻寬。有能力執行這類節點的人越來越少,也讓人不禁要問:以後由誰來保存以太坊的長期歷史?

在以太坊的權益證明系統中負責提議區塊、對區塊進行見證投票(attestation)的驗證者,也感受到狀態成長的壓力。為了有效率地驗證交易,他們需要快速存取最新的區塊鏈狀態。但隨著狀態擴大,存取與處理這些資訊會變得更慢、更昂貴。如果放任這個趨勢不管,我們可能會造成只有擁有高階硬體的人才能參與驗證的環境,把以太坊推向中心化。

以太坊開發者已經探討過抑制狀態膨脹(state bloat)的方案,包括歷史過期(history expiry)與狀態租金(state rent),我們會在本章稍後的「擴容第一層」一節詳細討論。

客戶端多樣性(client diversity)也有幫助。雖然 Geth 一直是最主要的以太坊客戶端(見圖 16-2),但 Nethermind、Erigon 與 Besu 等替代客戶端都導入了提升儲存效率的最佳化。例如,Erigon 專精於更有效率地處理歷史資料,減輕完整節點的負擔。

以太坊客戶端的分布
圖 16-2. 以太坊客戶端的分布

16.1.4. 區塊傳播與 MEV

即使以太坊能處理更高的交易吞吐量,還有另一個根本的瓶頸:新區塊在網路中傳播所需的時間。驗證者一產生新區塊,這個區塊就必須廣播給全世界數以千計的其他節點。區塊越大,傳播所需的時間就越長;而時間拖得越長,網路出現分歧、甚至暫時分叉(網路的不同部分短暫地各走各的路)的機率就越高。

權益證明有助於降低這些風險,但區塊傳播的延遲仍會影響效能。各客戶端團隊一直在做網路最佳化來加快傳播速度,但隨著以太坊擴容,這仍是我們要持續改善的挑戰。

還有另一個潛伏在表面之下的問題:MEV。雖然以太坊已經轉換到權益證明,「礦工可提取價值」(miner extractable value)這個名稱卻沿用了下來。如今更精確的叫法是最大可提取價值(maximal extractable value),指的是驗證者與搜尋者(searcher)藉由策略性地重新排序、納入或排除區塊中的交易所能賺取的利潤。

MEV 之所以會出現,是因為交易不一定會按照送出的順序處理。驗證者可以依自己的獲利動機決定交易的優先順序。這讓手法老練的參與者有機會以損害一般使用者的方式提取價值。高頻交易機器人會掃描記憶池(以太坊中尚未被納入區塊的交易的等候室),尋找有利可圖的機會。例如,如果有人在 Uniswap 這類去中心化交易所(DEX)上送出一筆大額交易,機器人就能搶在他前面,先買進資產,再以更高的價格賣回給他。這就是所謂的三明治攻擊,它是搶先交易的一種形式,也是最惡名昭彰的 MEV 形式之一。

一種已經運作多年的緩解方案是 MEV-Boost,這是 Flashbots 開發的協議,讓 MEV 更民主、更透明。不過,長期的解決之道是更根本的重新設計:在協議中原生實作提議者與建構者分離(proposer-builder separation,PBS)。我們會在下一節更詳細地探討這些解決方案。

備註

大多數 L2 鏈上幾乎沒有 MEV,因為它們通常仰賴中心化的交易排序器。單一的中心化排序器通常會完全按照收到交易的順序處理交易,消除了重新排序交易或搶先交易的機會。雖然這種中心化的做法大幅減少了 MEV,卻也在去中心化與抗審查性上帶來潛在的取捨。L2 未來的發展目標是引進去中心化的排序機制,在這些取捨之間取得平衡。

16.2. 解決方案

為了克服以太坊在擴容上的挑戰,大家做了哪些努力?雖然沒有單一、簡單的解法,但開發者正積極推動各種改進,讓網路更快、更便宜,也更能應付大規模採用。我們來仔細看看他們正在探索的主要策略。

16.2.1. 擴容第一層

擴容以太坊的基礎層,也就是第一層,是我們從第一天起就面對的最艱難挑戰之一。現實是,沒有任何單一解法能解決所有問題;擴容並不是一個按下去就搞定的開關,而是一個長期的過程:結合各種最佳化,在不犧牲去中心化或安全性的前提下,逐步讓以太坊更有效率。雖然 L2 rollup 是處理大部分交易的最佳選擇,改善以太坊的基礎層仍然很重要。如果能在 L1 提高吞吐量與效率,rollup 就會變得更強大,gas 費用會下降,以太坊也能在不走向中心化的情況下保持競爭力。我們來逐一看看改善以太坊基礎層的幾種核心方法。

提高 gas 上限

以太坊的區塊並不是受限於能容納的交易筆數,而是受限於每個區塊能裝進多少 gas。這就是 gas 上限。我們可以把它想成預算。每筆交易依其複雜度消耗 gas,而區塊中可用的 gas 則由 EIP-1559 的機制決定。提高 gas 上限,代表每個區塊能裝進更多交易,實際上就是提高以太坊的吞吐量。

但事情沒有把 gas 上限調高那麼簡單。較大的區塊需要更長的時間在網路中傳播,讓以太坊更容易發生鏈分裂。它們也會提高完整節點的硬體需求,讓我們更接近中心化。因此,gas 上限的提高是逐步、謹慎地進行的,在提升吞吐量與維持網路健康之間取得平衡(見圖 16-3)。

gas 上限的歷史變化
圖 16-3. gas 上限的歷史變化

以太坊平行執行的未來

由於採用共享狀態模型,以太坊是依序處理交易的。這確保了安全性與一致性,卻也限制了可擴展性,因為交易無法平行執行。相較之下,Solana 與 Aptos 等一些較新的區塊鏈已經採用平行執行,但它們仰賴較中心化的架構,並要求驗證者使用高效能的硬體。

以太坊的挑戰在於,交易經常與相同的狀態互動——例如,兩筆 DeFi 交易修改同一個流動性池。如果沒有穩健的依賴關係管理系統就重新排序這些交易,可能會破壞智能合約的邏輯。另一個複雜之處在於,完整節點必須驗證所有交易,而引進平行執行需要在各個執行緒之間謹慎地同步。

以太坊研究人員正積極探索在維持去中心化的同時,引進部分平行執行的方案。其中一種做法是無狀態執行,它減少了對完整節點儲存空間的依賴,讓交易處理更有效率。另一種是 樂觀並行控制(optimistic concurrency),先假設交易彼此獨立,只有在發生衝突時才回復。我們會在本章的後半部詳細說明這些概念。

在相容 EVM 的鏈上,已經出現了幾種平行以太坊虛擬機(EVM)的實驗性實作,包括 Monad、Polygon PoS 與 Shardeum。例如,Monad 實作了樂觀的平行執行模型,能達到每秒超過 10,000 筆交易。Polygon PoS 則以 Block-STM 做法讓交易能部分平行化,使 gas 吞吐量提高為 1.6 倍。這些進展提供了寶貴的洞見,但以太坊必須在保持去中心化的前提下實作平行化,這個平衡仍是關鍵的挑戰。近期的研究指出,大約 64.85% 的以太坊交易可以平行化,顯示效能還有很大的提升空間。不過,截至 2025 年 3 月,還沒有把平行執行整合進以太坊主網的具體計畫。透過區塊末端的虛擬交易來平行化 EVM 的討論仍在進行,但以太坊執行模型的複雜性讓實作充滿挑戰。以太坊可擴展性的路線圖包括持續研究交易依賴關係的解析、替代的執行模型,以及逐步提升 EVM 的效率。

狀態成長與過期

以太坊的狀態,包括所有帳戶餘額、智能合約儲存空間以及其他鏈上資料的集合,只會不斷成長。每個新合約都會增加資料,而一旦有東西寫入以太坊的狀態,就會永遠留在那裡。這對去中心化與可驗證性很好,對可擴展性卻很糟。完整節點必須儲存並處理所有這些資料,而狀態越大,執行節點的成本就越高。

目前,完整節點的以太坊狀態大小約為 1.2 TB,但儲存完整歷史狀態與交易資料的封存節點則需要超過 21 TB 的儲存空間。如此龐大的資料量讓個人越來越難執行封存節點,使這個角色集中在少數資金雄厚的實體手上。值得一提的是,Erigon 與 Reth 這兩個執行層客戶端經過最佳化,需要的儲存空間較少,兩者的封存節點都只需要大約 2 TB。

狀態過期與歷史過期經常被混為一談,但它們處理的是不同的問題。狀態過期的目標是縮小以太坊需要持續維護的狀態,做法是要求智能合約定期為它們占用的儲存空間支付租金。如果合約不付租金,它就會變得無法存取,直到有人明確付費讓它復活為止。這能大幅減緩狀態成長,讓完整節點更容易運作。

另一方面,歷史過期 處理的是過去交易資料的龐大規模。以太坊可以不再強迫每個節點儲存所有的歷史交易,而是修剪較舊的資料,把它卸載到外部的儲存方案。這不會影響當前的狀態,但查詢歷史資料時會更依賴第三方資料供應商。兩種做法都有取捨,相關研究仍在進行,以找出效率與可存取性之間的最佳平衡。

如果想進一步探索這個主題,我們推薦研究涵蓋歷史過期的 EIP-4444。至於狀態過期,它仍在研究階段,所以還沒有明確的策略,但你可以在以太坊的路線圖中找到更多資訊。

提議者與建構者分離

即使在轉換到權益證明之後,MEV 一直是以太坊揮之不去的問題。驗證者與專門的搜尋者會重新排序交易、搶先交易,並運用其他策略,犧牲一般使用者來賺取利潤。這不只是經濟問題,也會影響網路的健康:它會加劇壅塞,讓 gas 費用變得難以預測。

PBS 是緩解 MEV 最有希望的解決方案之一。目前,驗證者既提議區塊也建構區塊,代表他們完全掌控交易的排序。PBS 把這兩個角色分開,藉此改變這種情況:驗證者仍然提議區塊,但實際的區塊建構則透過競爭性的拍賣,外包給專門的建構者。這消除了驗證者從事 MEV 提取的直接誘因,也讓交易的收錄更加透明。

PBS 已經以 MEV-Boost 的形式經過實際測試,MEV-Boost 讓驗證者能把區塊建構外包給出價最高的人。不過,重要的是要了解,MEV-Boost 與 PBS 並不會消除 MEV;它們只會讓 MEV 更透明、更公平。MEV 仍會存在,因為驅動套利、搶先交易與三明治攻擊的根本誘因不會消失。PBS 的作用是確保 MEV 的取得過程更開放、公平且具競爭性,而不是讓少數內部人士從不透明的 MEV 策略中獲益。長期來說,還需要在 PBS 之外整合其他解決方案,例如訂單流拍賣(order-flow auction)、加密記憶池(encrypted mempool),以及其他 MEV 緩解技術,才能進一步減少它的負面影響。

16.2.2. Rollup

以太坊在可擴展性、交易吞吐量(以 TPS 衡量)與高昂手續費上一直面臨挑戰。為了解決這些問題,rollup 的概念應運而生。

rollup 是一種機制:在專屬的 L2 上「鏈外」執行交易,再把彙總(「捲起來」的)資料或證明發布回 L1 區塊鏈。由於繁重的運算與狀態更新都在 L1 之外進行,區塊鏈得以避開它慣有的吞吐量瓶頸,進而加快交易速度、降低手續費。實際上,rollup 自己的執行環境更有效率地處理了簽章檢查、合約執行與狀態轉換,而 L1 仍是具有權威性的「結算層」。

rollup 的目標是盡可能保留 L1 的安全性。它的安全目標包括確保資料可用性、驗證狀態轉換的正確性,以及提供抗審查性。資料可用性要求所有交易與狀態資訊都可以取得,這樣一旦發生爭議,參與者就能依靠發布到 L1(或由 L1 保證)的資料,獨立驗證鏈的狀態,或安全地提領資金。狀態轉換的完整性確保 L2 上的變更符合網路規則,通常是透過有效性證明(例如零知識證明(zero-knowledge proof))或詐欺證明來達成。最後,抗審查性保證沒有任何單一實體或一小群參與者能無限期地阻擋或扣住使用者的交易。

備註

資料可用性與有效性是安全的 rollup 實作不可或缺的要素,確保惡意行為者無法偽造交易、竊取資金或憑空灌高餘額。資料的有效性通常仰賴兩種主要做法之一。第一種做法使用零知識證明:每一批 L2 交易都附有一個密碼學證明,證實執行正確。這個證明提交到 L1 時,會由智能合約先驗證它的正確性,再接受新的狀態根。第二種做法則是在樂觀的假設下使用詐欺證明:L2 的營運者(operator)把新的狀態發布到 L1,任何人都可以提出不當行為的證據,對這些提交提出挑戰。如果詐欺證明成立,無效的那一批交易就會被撤銷,惡意行為者也會受到懲罰。

除了有效性之外,資料可用性確保即使 L2 的營運者消失或行為不誠實,使用者也永遠能重建這條鏈。達成這一點的方法有好幾種。有些系統把所有交易資料直接存放在 L1 上,通常是以以太坊 calldata 的形式,或是現在更常見的 blob,讓資料透明地記錄在區塊鏈的日誌中。其他設計則仰賴鏈外的資料可用性層、專門的網路,或提供密碼經濟(cryptoeconomic)誘因來維護與提供資料的外部儲存方案。混合式的做法可能結合兩者:關鍵資訊放在鏈上,較不重要的資料則存放在鏈外。

rollup 仰賴部署在 L1 上的一個專門智能合約,由它維護所有 L2 帳戶的主鏈狀態(canonical state)。這個合約儲存代表目前 L2 狀態的根(通常是默克爾根),接受由指定參與者(有時稱為排序器、聚合者(aggregator)或營運者)提交的新交易批次,並驗證這些批次的有效性。依 rollup 的類型不同,它可能會檢查零知識證明或處理詐欺證明,以確保狀態更新是合法的。一旦偵測到違規(例如詐欺證明成功),合約就能回復無效的批次。

任何符合 rollup 要求的人(例如質押了保證金(bond)),都可以向智能合約提交 L2 交易的狀態更新。但實際情況並非總是如此。事實上,到目前為止,交易量與總鎖倉價值(total value locked)最高的 rollup,大多在排序器這一層是中心化的。雖然有些 rollup 已經達成去中心化,但對大多數 rollup 來說,那仍是最終目標。每次狀態更新都包含前一個狀態根(以表明連續性)、新提議的狀態根(反映所提交交易的結果),以及壓縮過的交易資料或指向這些資料的參照。如果符合 rollup 的規則(對樂觀 rollup 來說,還要沒有出現有效的挑戰),合約就會把它儲存的狀態根更新為新的狀態根,使其成為 L2 的主鏈狀態。

不同的 rollup 以不同的方式處理詐欺或無效的狀態更新。樂觀 rollup 預設新的狀態更新是正確的,但會提供一段挑戰期(challenge window)(通常長達數天),讓任何人都能提交詐欺證明。如果證明經過驗證,無效的狀態更新就會被撤銷,惡意提交者的質押也會被罰沒(slashing)。另一方面,零知識 rollup 要求每個新的狀態根都要附上零知識證明。由於這個證明是在鏈上驗證的,鏈能立即知道更新是否有效;只要證明正確,就不需要漫長的 challenge period。

rollup 的發展階段

在早期階段,大多數 rollup 都保留了部分中心化的控制權,通常稱為 輔助輪(training wheels),讓營運者能在出現 bug 或需要關鍵更新時迅速介入。雖然這對新系統來說很實際,但真正的去中心化要求逐步拆掉這些輔助輪。

為了描繪這個轉變,有人以 Vitalik Buterin 最初提出的里程碑為基礎,提出了一套把 rollup 分成三個成熟階段的框架。每個階段都顯示還有多少權力掌握在中心化的一方手中,以及這個 rollup 距離繼承以太坊基礎層的安全性還有多遠。

在 stage 0(第 0 階段),rollup 自稱是 rollup,但仍大量受到營運者控制。它把狀態根發布到 L1,並在 L1 上提供資料可用性,萬一出了問題,就能重建 L2 的狀態。不過,在這個階段,系統的「證明機制」(詐欺證明或有效性證明)可能還沒有完全由鏈上的智能合約強制執行;發生錯誤時,主要的後備手段是營運者的介入。基本上,stage 0 確保 rollup 的基本要素——鏈上資料、狀態根,以及供使用者使用的節點軟體——都已到位,但治理仍是中心化的。

備註

這套三階段框架的要求可能會改變。例如,在本文撰寫時(2025 年 2 月),Arbitrum 是 stage 1 的 rollup,但在新的要求下,如果它沒有及時升級網路,可能會變成 stage 0 的 rollup。

stage 1(第 1 階段)的 rollup 需要有一套完善的證明系統(樂觀 rollup 用詐欺證明,零知識 rollup 用有效性證明),而且至少要有五個能提交這些證明的外部參與者。使用者也應該能在不需要營運者配合的情況下提領資金、「退出」系統,保護他們不受審查。另一項標準是,如果使用者不同意某項提議的系統升級,至少要有七天的退出期(exit window),不過一旦出現嚴重的 bug,「安全委員會」(Security Council)仍可以更快地介入。這個委員會必須以多重簽章組成,需要八名以上簽署者中至少 50% 的同意,[46]而且其中一半必須來自 rollup 主要組織之外。雖然這個委員會能修正 bug 或回復惡意交易,但仍存在潛在的單點故障。

stage 2(第 2 階段)代表 rollup 已經真正去中心化,仰賴無需許可的證明與完善的使用者保護。[47]詐欺證明或有效性證明系統必須對任何人開放——不能有允許清單(allowlist)。如果有治理提案或升級要推行,使用者必須至少有 30 天的時間可以退出,確保他們不會被迫接受變更。安全委員會的角色嚴格限於鏈上、與可靠性(soundness)相關的錯誤,例如有人提交了互相矛盾的證明,而不是廣泛的治理或自由裁量權。因此,在這個最終階段,人為介入的範圍被嚴格限縮,rollup 主要由智能合約與社群共識來治理,與以太坊「信任最小化」的精神十分貼近。

我們想向所有參與制定與更新這套框架的人,以及所有參與分析、公開 rollup 各階段資訊的人致謝;你們的付出非常寶貴,也非常必要。

樂觀 rollup

樂觀 rollup 仰賴詐欺證明。營運者在假設狀態根有效的前提下,把它們發布到 L1。不過,觀察者保有對他們認為有詐欺的批次提出挑戰的權利。如果挑戰證實成立,無效的批次就會被回復,營運者也會受到懲罰。由於有效性不會立即得到確認,使用者通常必須等過挑戰期(有時長達一週以上),才能放心地提領資金或達到最終性。這種設計導致提領時間較長,但能輕鬆相容 EVM,證明的複雜度也較低。營運者不需要建構零知識電路,這讓系統運作的某些方面變得簡單。儘管如此,延遲的提領時間可能影響使用者體驗,而且如果營運者的保證金少於鎖定的總價值,就有可能遭受經濟攻擊。樂觀 rollup 的例子包括 Arbitrum、Optimism、Base,以及其他幾個受到「Optimistic Ethereum」模型啟發的專案。

零知識 rollup

ZK rollup 以有效性證明為基礎運作。供應者在 L2 上把交易打包時,會產生密碼學證明(通常是 SNARK 或 STARK),證實狀態轉換的正確性。這些證明在鏈上驗證,由於不需要漫長的挑戰期,能提供近乎即時的最終性。使用者也能享有快速提領的好處,因為不需要等待一段時間來確認合法性。高度的安全性來自直接驗證證明,降低了對監看者(watcher)或大額營運者質押的依賴。在鏈上驗證一個證明,通常比逐筆處理每筆交易更有效率。不過,為通用的 EVM 運算實作零知識證明,運算成本很高,可能需要專門的硬體。

零知識證明的風險

現實是,最前沿的密碼學是有風險的。我們以 Zcash 為例。Zcash 採用了論文〈Succinct Non-Interactive Zero Knowledge for a von Neumann Architecture〉中提出的部分實作,這篇論文描述了 Zcash 最初上線時所使用的 zk-SNARK 建構方式。

2018 年,在這篇論文發表多年、經過數十次同儕審查之後,當時受雇於 Zcash 的密碼學家 Ariel Gabizon 發現了一個細微的密碼學缺陷,它會造成偽造漏洞——本質上就是一種雙重支付(double spend)攻擊。這個漏洞在 Zcash 的 Sapling 升級中修正了,而且似乎沒有被任何人利用過,但它在一篇非常公開、廣受引用的論文中潛伏了好幾年,才終於有人注意到。

在本章中,我們把零知識證明描述為高度安全、值得信賴的。一般來說確實如此,但如果從不質疑這個假設,它就會變得很危險。

某些零知識系統還需要可信設定[48](在 SNARK 中很常見)來產生初始參數,而可信設定本身也有安全上的考量。領先的 ZK rollup 專案包括 ZKsync、Starknet、Scroll 與 Aztec。其中 Aztec 還以「ZK-ZK-rollup」為名,加入了隱私功能。

ZK rollup 原本很適合代幣轉帳或兌換(swap)這類簡單的工作,但在更複雜的功能上就顯得吃力。隨著 zk-EVM 的出現,情況改變了;zk-EVM 的目標是在鏈外複製整個 EVM。藉由為圖靈完備的運算(包括 EVM 位元組碼的執行)產生證明,zk-EVM 擴大了 ZK rollup 的適用範圍,讓各式各樣的去中心化應用(DApp)都能同時享有可擴展性與零知識等級的安全性。

各專案以不同的途徑實現 zk-EVM 的功能。一種方法是使用轉譯器(transpiler),把 Solidity(或其他 EVM 高階語言)轉換成適合電路的語言,例如 Cairo(StarkWare 所使用的語言)。另一種做法是逐一操作碼地直接解讀標準的 EVM 位元組碼,為每一道指令建構對應的電路。混合式或多類型的方案則會調整 EVM 的部分內容(例如資料結構或雜湊演算法),讓它們更容易產生證明,同時盡量維持近乎完全的以太坊相容性。本章不會進一步介紹 zk-EVM,這部分會在第 17 章說明。

16.2.3. 其他類型的擴容方案

樂觀 rollup 與 ZK rollup 並不是僅有的擴容方案;它們只是目前被採用的兩種主要方案,未來情況可能會改變。我們會分析其他的擴容方案:對於那些較舊、現在已不太可能再受到重視的方案,只會簡要介紹;對於那些即將登場、前景看好的方案,則會更深入地探討。

Validium

validium 不把交易資料存放在以太坊上,而是把驗證 L2 鏈狀態的證明發布到以太坊,如圖 16-4 所示。基本上,validium 就是一種使用替代資料可用性方案(例如 Celestia、Avail 或 EigenLayer)的 rollup。

validium 的架構
圖 16-4. validium 的架構

作為 L2,validium 不必支付在以太坊上儲存資料所需的高昂 gas 費用。這種做法比 rollup 更符合成本效益,代表使用者付的 gas 費用低得多。不過,validium 通常被認為不如其他 rollup 安全,因為它們使用資料可用性委員會(data availability committee)或其他替代的資料可用性方案,把交易資料存放在以太坊之外。

側鏈

側鏈是一個與另一條區塊鏈(稱為主鏈)平行運作的區塊鏈網路。側鏈通常透過雙向的跨鏈橋與主鏈連接,讓兩個網路之間能轉移資產,或許還能傳遞任意資料,例如合約狀態、默克爾證明,以及特定交易的結果。

大多數側鏈都有獨立於主鏈之外的共識機制與驗證者集合。這讓側鏈不必依賴另一條區塊鏈,就能結算交易並使其達到最終性。但這也表示,跨鏈轉入側鏈的資金是否安全,取決於是否存在強大的密碼經濟誘因來遏止驗證者的惡意行為。

Based Rollup

based rollup 仰賴 L1 區塊鏈原生的排序能力。這種設計能無縫整合,善用 L1 的去中心化、活性(liveness)與安全特性。

與傳統的 rollup 相比,based rollup 採用更簡單的排序方式。大多數 rollup 都自己實作排序器,based rollup 則直接利用底層第一層的排序器。基本上,主要的差別在於 L1 的驗證者就是這個 rollup 的排序器,而不是像樂觀 rollup 那樣使用外部的排序器。

共識層(consensus layer)、資料可用性層與結算層全都是以太坊本身。rollup 自己唯一需要建構的元件是執行層(execution layer),它負責執行交易並更新狀態。這種設計讓 L1 的區塊提議者能直接與 L2 的區塊建構者與搜尋者合作,把下一個 rollup 區塊納入 L1 區塊中。由於 based sequencing 完全仰賴以太坊現有的驗證方式,它不依賴任何外部的共識。

備註

based rollup 可能是最有前景的方案,在使用量上甚至可能超越樂觀 rollup。主要原因是,based rollup 的最終性與以太坊本身相同,因此 based rollup 之間可以進行原子交易,不需要經過挑戰期。例如,DeFi 的流動性就能在各個 based rollup 之間彙集。以前,這只有在 ZK rollup 上才做得到。

Booster Rollup

booster rollup 處理交易的方式,就好像這些交易是直接在 L1 上執行的一樣,讓它們能完整存取 L1 的狀態。同時,它們也維護自己獨立的儲存空間。如此一來,執行與儲存都在 L2 的層級擴展,而 L1 的框架則作為共享的基礎。另一種看法是,每個 L2 都映照著 L1,藉由把交易的執行與儲存分片,實際上為所有部署在 L1 上的應用增加了新的區塊空間。

如果以太坊的未來需要動用數百、甚至數千個 rollup 來應付龐大的擴容需求,讓每個 rollup 都像一條孤立的鏈,各自擁有一套規則與合約,可能並不理想。開發者會發現自己得把程式碼重複部署到每一個 rollup 上。

booster rollup 則是直接為任何在 L1 上執行的 DApp 增加額外的區塊空間。推出一個 booster rollup,可以想成是為電腦加裝更多 CPU 核心或更多硬碟空間。只要應用程式懂得利用多執行緒(以區塊鏈的說法就是多 rollup),它就能自動使用這些擴充的容量。開發者只需要思考如何善用這個額外的環境即可。

原生 rollup(Native Rollup)

原生 rollup 提案引進了 EXECUTE 預編譯合約,作為 rollup 狀態轉換的驗證方;它免除了詐欺證明賽局、SNARK 電路與安全委員會這類複雜基礎設施的需求,大幅簡化了與 EVM 等價的 rollup 的開發。有了 EXECUTE,只要幾行 Solidity 程式碼,就能部署精簡的原生 rollup 與 based rollup。

由於這個新的預編譯合約與「EVM 中的 EVM」構想十分相近,它將透過以太坊一般的硬分叉流程升級,由社會共識來治理。這種一致性保證了 EVM 的更新也會套用到這個預編譯合約上,讓 rollup 不需要安全委員會或多重簽章這類治理結構,就能繼承以太坊的驗證規則,最終讓它們對終端使用者來說更加安全。

EXECUTE 預編譯合約會驗證 EVM 的狀態轉換,讓 rollup 能在應用層利用以太坊的原生基礎設施。它使用 pre_state_root、post_state_root、trace 與 gas_used 等輸入來檢查 EVM 的狀態轉換,並採用類似 EIP-1559 的機制來為 gas 定價。為了確保正確性,驗證者可以依靠重新執行或 SNARK 證明,取決於各個 rollup 如何在規模與複雜度之間取得平衡。這種設計結合了 based rollup 的做法(排序與證明系統都直接在以太坊之下運作),簡化了「免信任 rollup」的建立。

16.2.4. Danksharding

Danksharding 是以太坊最新的分片做法,比早期的設計簡化了許多。

備註

既然這是我們第一次提到分片,簡單介紹一下這個概念是合理的。請記住,這是一個還可以深入研究許多的主題。它超出了本書的範圍,但仍然是個有趣的主題。

分片的基本概念是把網路分成不同的部分,讓每個分片處理一部分的交易,藉此提升效能、降低成本。

其他鏈已經以各種不同的形式實作了分片。在以太坊上,我們永遠不會真正實現多年前構想出來的那種最初、純粹的分片,因為已經不再需要了。路線圖已經轉向以 L2 為中心的方式來擴容 L1。

以太坊近期的分片提案(包括 danksharding 與 proto-danksharding)與大多數其他分片方案的一個關鍵差異,在於以太坊以 rollup 為中心的策略。以太坊的分片並不是直接擴大交易容量,而是著重於為核心協議不加以解讀的大型資料「blob」提供更多空間。(至於這些 blob,我們會在後面的一節更詳細地探討。)驗證這些資料 blob 的一項重要條件,是檢查它們是否仍然可以取得——也就是能否從網路上取回。L2 rollup 協議接著就會利用這些資料 blob 來實現高吞吐量的交易,如圖 16-5 所示。

Danksharding 的架構
圖 16-5. Danksharding 的架構

rollup 把已執行的交易存放在資料 blob 中,並產生一個密碼學的「承諾」[49]以供驗證。為了建立這個承諾,它們會用多項式函數來編碼資料。接著就可以在特定的點上對這個多項式求值。

舉例來說,考慮一個簡單的多項式函數,例如 f(x) = 2x − 1。在 x = 1, 2, 3 這幾個點對這個函數求值,會得到 1、3、5 這幾個值。證明方獨立地把同一個多項式套用到原始資料上,並檢查它在這些點上的值。只要底層資料有一點點改變,多項式——以及它求出的值——就不會再相符,提醒參與者資料有不一致之處。

rollup 把資料發布到 blob 時,也會提供一個在鏈上公開的承諾。這個承諾的建立方式,是用一個多項式擬合資料,再在特定的點上對這個多項式求值,而這些點是由 KZG 儀式(見第 4 章)中產生的隨機數決定的。證明方會獨立地在這些相同的點上對多項式求值。如果他們求出的值與承諾的值相符,資料就確認是正確的。實務上,這些承諾與它們的證明更加複雜,因為它們是用密碼學方法來保護、確保完整性的。

Danksharding 主要的進展是引進了合併的手續費市場(fee market),它的用意是把 gas 的手續費市場與 blob 的手續費市場結合起來。danksharding 不採用多個各自擁有區塊與提議者的分片,而是在每個 slot 指定單一的提議者,來選擇所有的交易與資料。

為了避免這種做法對驗證者造成很高的硬體需求,這裡使用了 PBS。在 PBS 中,專門的「區塊建構者」以出價競爭組裝該 slot 內容的權利,而提議者只需要挑出出價最高的有效區塊頭。只有區塊建構者需要處理完整的區塊,甚至連這一步都可以透過專門的預言機協議進一步去中心化。同時,驗證者與使用者可以依靠資料可用性抽樣(DAS)來驗證區塊——別忘了,區塊中很大一部分只是資料。

備註

danksharding 與 proto-danksharding 這兩個名稱,取自協助塑造這種分片的兩位以太坊基金會主要人物。Dank 指的是 Dankrad Feist,proto 指的是 Protolambda,也就是 Diederik Loerakker。兩人都是研究人員:在本文撰寫時,Feist 任職於以太坊基金會,Loerakker 則任職於 OP Labs。

16.2.5. Proto-Danksharding

proto-danksharding(也就是 EIP-4844)提議實作完整 danksharding 所需的大部分基礎邏輯與基礎設施,例如交易格式與驗證規則,但不包含真正的 DAS。[50]在 proto-danksharding 之下,驗證者與使用者仍然要直接驗證所有資料 blob 的完整可用性。

proto-danksharding 引進的主要創新是一種新的交易類型,稱為攜帶 blob 的交易(blob-carrying transaction)。這些交易(我們已經在第 6 章分析過)的運作方式與一般交易類似,但多了一個稱為 blob 的額外資料元件。blob 相對較大(約 125 KB),而且可以比同樣數量的 calldata 便宜得多。[51]不過,EVM 無法直接存取 blob 資料;EVM 只能存取 blob 的密碼學承諾。這些 blob 中的資料也會在一段固定時間後自動刪除(在本文撰寫時設定為 4,096 個 epoch,大約 18 天)。

由於驗證者與客戶端仍然必須下載每個 blob 的完整內容,proto-danksharding 把資料頻寬限制在每個 slot 約 1 MB。儘管有這項限制,proto-danksharding 仍能帶來可觀的可擴展性效益,因為 blob 資料不會直接與一般以太坊交易競爭 gas 成本。

讀到這裡,你可能會產生幾個疑問。

為什麼可以在 18 天後刪除 blob 資料?使用者要怎麼存取較舊的 blob?

rollup 會在鏈上發布對其交易資料的密碼學承諾,同時透過資料 blob 提供底層的交易資料。這種安排讓獨立的證明方能驗證承諾的正確性,必要時也能對不正確的資料提出挑戰。在網路層面,共識層客戶端會暫時儲存這些資料 blob,並以見證投票確認這些資料已經在以太坊網路中傳播、可供取得。為了避免節點隨著時間變得過於龐大、耗費過多資源,這些資料會在 18 天後自動修剪掉。共識層客戶端提供的見證投票保證了證明方在這段期間內有足夠的時間與管道來驗證資料或提出挑戰。修剪之後,實際的資料仍可以由 rollup 的營運者、使用者或其他第三方繼續存放在鏈外。

有幾種實用的方法可以長期儲存歷史資料,並讓它容易取得。例如,特定應用的協議(例如個別的 rollup)可以要求自己的節點保留與其應用特別相關的歷史資料。由於歷史資料的遺失不會對以太坊本身造成風險,只會影響個別的應用,因此讓每個應用各自管理自己的資料儲存是合理的。其他可能的方案包括使用 BitTorrent 這類去中心化系統——例如,定期產生並散布 blob 資料的每日快照——或是利用以太坊的 Portal Network,它可以擴充成支援歷史資料的儲存。此外,區塊瀏覽器、API 供應商,或 The Graph 這類第三方索引平台等服務,很可能也會維護完整的封存資料。最後,進行資料分析的個別研究人員、愛好者或學術機構,也可以在本地保留完整的歷史紀錄,享受直接存取資料的便利與效能提升。

與其讓每個 slot 撥出 1 MB 的頻寬給 blob,降低一般交易 calldata 的成本不是更好嗎?

這裡的問題涉及以太坊網路的平均負載與最壞情況(尖峰)負載之間的差異。目前,以太坊區塊的平均大小約為 90 KB,不過理論上的最大區塊大小——如果區塊中全部 3,600 萬 gas 都用在 calldata 上時[52]——約為 2 MB。以太坊偶爾會處理接近這個最大大小的區塊,並沒有出現重大問題。然而,如果我們在平均區塊大小仍可控的情況下,單純把 calldata 的 gas 成本降低為十分之一,潛在的最壞情況區塊大小就會暴增到約 20 MB,讓以太坊網路不堪負荷。

以太坊目前的 gas 定價模型,很難把平均負載與最壞情況分開管理,因為兩者之間的比例取決於使用者如何在 calldata 與其他資源之間分配 gas 支出。因此,以太坊必須以最壞情況為基準來為 gas 定價,人為地把平均負載限制在網路能輕鬆支撐的水準之下。藉由引進多維的手續費市場,讓 gas 定價明確區分不同的資源類型,我們就能讓網路的平均使用量更貼近它實際的容量,安全地在每個區塊中容納更多資料。proto-danksharding 與 EIP-4488 就是兩個專門為了解決這個問題、改善以太坊 gas 定價模型而設計的提案。

警告

不要把 EIP-4488 和 EIP-4844 搞混(感謝這些 EIP 一點都不令人困惑的編號)。EIP-4488 是更早、更簡單的嘗試,想解決同樣的平均負載與最壞情況負載不相稱的問題。它目前處於停滯狀態,所以大概永遠不會實作。另一方面,EIP-4844 已經上線了。

另一個隱藏的動機是,最終目標是讓節點不必下載所有的資料 blob。用 blob 可以做到這一點,用 calldata 則做不到。

提示

你可能還有更多疑問。答案請參閱本章最後完整的延伸閱讀清單。

16.2.6. 無狀態以太坊

能在普通的硬體上執行以太坊節點,對實現真正的去中心化至關重要。這是因為執行節點讓使用者能透過密碼學檢查,獨立驗證區塊鏈的資訊,而不必仰賴第三方。執行節點也讓使用者不必透過中間人,就能把交易直接提交到以太坊的點對點(P2P)網路。如果這些好處只有擁有昂貴設備的使用者才能享有,就不可能實現真正的去中心化。因此,以太坊節點對處理能力與記憶體的需求必須降到最低,最好能在手機、微型電腦這類日常硬體上執行,或是在家用電腦上不著痕跡地執行。

如今,龐大的磁碟空間需求是阻礙更多人執行以太坊節點的主要障礙。主要原因在於必須儲存以太坊龐大的狀態資料,而這些資料對正確處理新的區塊與交易很重要。

雖然較便宜的硬碟可以存放較舊的資料,但它們通常太慢,無法有效率地處理新進的區塊。單純讓儲存變得更便宜或更有效率,只能暫時緩解問題,因為以太坊狀態資料的成長實際上沒有上限;儲存需求會持續增加,迫使技術改進不斷跟上腳步。更具永續性的做法,是為客戶端開發新的區塊與交易驗證方法,不必依賴從本地儲存空間擷取資料。

無狀態性這個詞可能有點誤導,因為它並沒有真正完全消除狀態的概念,而是改變了以太坊節點管理狀態資料的方式。無狀態性主要有兩種:弱無狀態性與強無狀態性。弱無狀態性把儲存狀態資料的責任轉移給少數專門的節點,讓大多數節點不必儲存狀態資料就能運作。相較之下,強無狀態性則完全取消了任何節點儲存完整狀態資料的要求。

提示

在接下來的小節中,我們會說明弱無狀態性與強無狀態性。另外值得一提的是,正如我們剛才所說,這些並不是實現「無狀態以太坊」的唯一途徑;這裡的無狀態性,基本上指的是改變以太坊節點管理狀態資料的方式。另一種做法是使用 Helios 這類輕客戶端。Helios 能把一個不受信任、中心化的 RPC 端點,轉換成供使用者使用、安全且無法被操縱的本地 RPC。它輕巧到能在行動裝置上執行,只需要非常少的儲存空間。

弱無狀態性

弱無狀態性在第 14 章曾經簡單提過,它改變了以太坊節點驗證狀態更新的方式,但並沒有完全消除整個網路對狀態儲存的需求,而是把儲存完整狀態資料的責任交給稱為區塊提議者或建構者的專門節點。網路上的其他所有節點,就能在不必於本地維護完整狀態資料的情況下驗證區塊。在弱無狀態性之下,建立(提議)新區塊需要完整存取以太坊的狀態資料,而驗證這些區塊則完全不需要儲存任何狀態資料。

實作弱無狀態性,取決於以太坊客戶端是否採用一種稱為 Verkle 樹的新資料結構(下一節會更詳細地介紹)。Verkle 樹取代了以太坊目前的狀態儲存結構,能產生小型、大小固定的見證,[53]節點交換這些見證,就能在不查詢本地資料庫的情況下驗證區塊。此外,PBS 也是必要的,因為它讓區塊建構者——擁有更強硬體的專門節點——負責維護完整狀態資料這項繁重的工作,一般節點則以無狀態的方式運作。

Verkle 樹

Verkle 樹這個名稱結合了「向量承諾」(vector commitment)與「默克爾樹」(Merkle tree,第 14 章已經說明過)。Verkle 樹對實現無狀態的以太坊客戶端不可或缺,這種客戶端不必在本地儲存整個以太坊狀態,就能驗證區塊。它們仰賴的是見證,[54]並附上確認見證有效的密碼學證明。見證的大小必須很小,這一點至關重要,因為節點必須在以太坊 12 秒的 slot 內有效率地散布並處理見證。目前以默克爾樹為基礎的狀態資料結構產生的見證太大,不適合用於無狀態驗證。Verkle 樹大幅縮小了見證的大小,解決了這個問題。

正如名稱所示,Verkle 樹使用 向量承諾:具體來說就是 KZG 多項式承諾,這是一種密碼學承諾,能有效率地證明大型資料集中特定位置的資料值,而不必揭露整個資料集。它們的擴展性比默克爾樹目前使用的雜湊好得多,計算速度也更快,如圖 16-6 所示。在默克爾樹中,我們只有默克爾根(雜湊值);而在 Verkle 樹中,我們還有向量承諾。

默克爾樹與 Verkle 樹的比較
圖 16-6. 默克爾樹與 Verkle 樹的比較

只有雜湊值的話,我們無法證明某個元素出現在某個值向量中的特定位置;你必須傳遞整個向量。但有了向量承諾與一個開啟證明(opening)——也就是整個值向量中的一小部分——就能證明某個元素存在於那個特定位置。

默克爾樹讓以太坊節點不必下載整條區塊鏈,就能驗證一小部分的資料。然而,當默克爾樹變得非常大時,證明(驗證資料所需的資訊)的大小也會大幅成長。這些龐大的證明會拖慢網路,隨著以太坊持續擴容,也會讓效率難以維持,如圖 16-7 所示。

默克爾樹的證明大小
圖 16-7. 默克爾樹的證明大小

要證明某個特定的葉節點 X 存在於這棵默克爾樹中,就必須傳遞路徑上每個節點的所有兄弟節點(sibling);這是因為少了這些資料,雜湊值就沒有意義。

Verkle 樹大幅縮小了這些證明的大小,解決了這個問題。Verkle 樹使用一種稱為向量承諾的密碼學方法,證明的大小不會隨著資料量增加而變大。向量承諾讓你能用非常短小、精簡的證明來證明大量的資料。這表示即使以太坊的區塊鏈變得更大,證明仍然維持小巧、有效率,如圖 16-8 所示。

Verkle 樹的證明大小
圖 16-8. Verkle 樹的證明大小

利用前面分析過的向量承諾,我們就能避免不必要的資料,大幅縮小 Verkle 樹的證明大小。

默克爾樹的證明大小如下(注意,這些證明大小是根據圖 16-5 與圖 16-6 計算的[55]):

  • 葉節點資料加上 15 個兄弟節點(每一層深度都要傳送的不必要資料,每個兄弟節點 32 個位元組),乘以七層深度 = 一千個葉節點 3.58 MB

Verkle 樹的證明大小則小得多:

  • 葉節點資料加上一個承諾(32 個位元組)、一個值(32 個位元組)與一個索引(1 個位元組),乘以四層深度,再加上一些大小固定的少量資料 = 一千個葉節點 150 KB

看完這段說明,你可能會有個小疑問:為什麼默克爾樹算了七層深度,Verkle 樹卻只算四層?答案很簡單:默克爾樹的節點只有 15 個兄弟節點,而 Verkle 樹的節點有 255 個。由於在相同深度下,每一層的寬度大得多,Verkle 樹能存放的資料也多得多。

Verkle 樹把資料組織成(鍵,值)配對,其中每個鍵是 32 個位元組,由 31 個位元組的「主幹」(stem)與 1 個位元組的「後綴」(suffix)組成,如圖 16-9 所示。鍵的格式之所以這樣設計,是為了讓位置相近的儲存位置擁有相同的主幹與不同的後綴,讓存取「相鄰」儲存位置的成本更低。

Verkle 樹的鍵結構
圖 16-9. Verkle 樹的鍵結構

這些鍵被組織成三種類型的節點:

  • 延伸節點(extension node)(或葉節點),代表一個主幹,最多有 256 個不同的後綴

  • 內部節點(inner node),最多包含 256 個子節點,其中可能包括其他延伸節點

  • 空節點

要建構一棵完整的 Verkle 樹,要從葉節點開始,逐步往上(由下而上)計算多項式承諾,直到抵達最上層,也就是根承諾為止。這個根承諾簡潔地代表了整棵樹的資料,讓節點只要參照這單一的根承諾,就能快速驗證區塊鏈資料。當節點需要驗證特定的區塊鏈資料(例如使用者的帳戶餘額或交易的有效性)時,它會取得這個已知的根承諾,以及一個非常小的密碼學證明,通常只有幾百個位元組。

強無狀態性

強無狀態性取消了節點儲存任何狀態資料的要求。在這個模型中,交易會附上小型的見證,再由區塊生產者加以聚合。這些生產者只需要儲存最少量的狀態,足以為經常被存取的帳戶產生見證即可。這把狀態管理的大部分責任轉移到使用者自己身上,因為使用者必須提供這些見證,並透過存取清單精確指定他們的交易會與哪些帳戶與儲存鍵互動。雖然這種做法能讓節點變得極為輕量,卻也帶來一些取捨,特別是與智能合約互動時的複雜度與難度都會增加。

強無狀態性已經有人研究過,但目前並沒有列入以太坊近期的路線圖。以太坊比較可能採用弱無狀態性,因為在可預見的未來,它看來已足以達成網路的擴容目標。

16.3. 結論

以太坊的擴容之道不只是讓事情變得更快,而是在不犧牲讓它值得信賴的特質——去中心化與安全性——的前提下,升級整個系統。以太坊不追求速成的解法,而是運用 rollup 與 danksharding,並以無狀態性為目標,打造一個分層的系統,同時持續改善第一層。在這樣的架構下,L2 網路負責大部分的執行工作,但安全性與最終結算仍仰賴以太坊的基礎層。這是一條深思熟慮、模組化的前進道路,既保有核心價值,也為長期的成長與創新奠定基礎。

更多內容請參閱以下延伸閱讀:

  • Danksharding 提案

  • Proto-danksharding 提案

  • EIP-4844

  • Danksharding(任何人都能輕鬆理解)

  • EIP-4488

  • 實現無狀態性的 Verkle 樹

  • Verkle 證明

  • Verkle 樹的 EIP

  • Verkle 樹的結構

  • 有助於深入了解 BLS12-318 曲線的基於配對的密碼學(pairing-based cryptography)報告

  • 「簡單」解說 BLS12-318[56]

註腳

  1. 這項規定最近有所修改,要求也稍有變動。本章不會分析這些變動;更多資訊請參閱 Luca Donno 在 Medium 上的文章。 ↩
  2. stage 2 並不代表更好的使用者體驗(UX)或更高的採用率,只代表更去中心化。 ↩
  3. 如第 4 章所討論的。 ↩
  4. 多項式承諾就像是一個多項式(例如 f(x) = 2x − 1 這樣的數學式)簡短而安全的「摘要」,讓你不必揭露整個多項式,就能證明其中特定的值。想像你寫下一個祕密公式,鎖進保險箱裡。之後,有人可以問:「如果設 x = 10,結果是多少?」你不必打開保險箱,也不必讓對方看到完整的公式,就能快速、輕鬆地提供證明,證實正確答案是某個數字。多項式承諾做的正是這件事,只是用數學的方式:它讓你能在不暴露所有細節的情況下,安全而有效率地證明一個較大的數學資料集中特定點(例如 x = 10)的正確性。多項式承諾更詳細的說明請見第 4 章。 ↩
  5. 資料可用性抽樣是一種不必下載區塊的全部資料,就能驗證資料可用性的機制。 ↩
  6. 在 EVM 中,用來存放外部呼叫時所傳遞的函式引數的原始資料。 ↩
  7. calldata 指的是交易中包含資料的部分,這些資料不會被直接執行,而是發布到鏈上,主要用於記錄與驗證。 ↩
  8. 驗證一個區塊,意思是重新執行區塊中的交易、更新以太坊的狀態,並確認計算出的狀態根與區塊提議者提供的狀態根相符。以太坊客戶端目前需要儲存在本地的完整狀態前綴樹(state trie)才能驗證區塊。見證只包含執行區塊中的交易所需的那部分狀態資料。然而,使用傳統的默克爾樹時,這些見證會變得太大,讓節點很難在以太坊 12 秒的 slot 時間內快速下載並處理它們。這項限制對網路連線速度快的節點較為有利,進而導致中心化。Verkle 樹大幅縮小了見證的大小,解決了這個問題,讓節點不必在本地儲存狀態,就能進行無狀態驗證。 ↩
  9. 見證是執行區塊中的交易所需的狀態資料的精簡集合。 ↩
  10. 譯註:本章的圖 16-5 是 Danksharding 的架構圖,圖 16-6 是默克爾樹與 Verkle 樹的比較圖;標示「7x depth」與「4x depth」、與這裡的計算相對應的,是圖 16-7(默克爾樹的證明大小)與圖 16-8(Verkle 樹的證明大小)。原文的圖號應為圖 16-7 與圖 16-8。 ↩
  11. 譯註:以太坊使用的曲線是 BLS12-381(見第 4 章的 BLS 簽章一節),原文此處與上一項的「BLS12-318」應為 BLS12-381 之誤。 ↩