Paradigm:以太坊狀態成長的挑戰與解決方案
原文作者:Storm Slivkoff、Georgios Konstantopoulos
原文編譯:Luffy,Foresight News
以太坊狀態增長及其與Gas 限制的關係被廣泛誤解。人們普遍認為狀態成長是以太坊的主要擴展瓶頸。然而,關於狀態增長的討論常常因術語不精確和缺乏詳細的定量證據而受阻。
採用數據驅動的方法可以使狀態成長問題變得更加清晰。在本文中,我們利用高分辨率資料集來了解狀態增長的大小和形狀。在這個過程中,我們得出了令人驚訝的結論:現代消費硬體可以維持當前的狀態成長率至少十年。此外,考慮到軟件和硬件的不斷改進,這條跑道可能會無限期地延長。
我們相信,以太坊有一個明確的路線圖: 1)完全消除狀態增長作為擴容瓶頸;2)將Gas 限制提高到支持全球規模去中心化金融體系的水平。本文系列的目標是發展一種科學方法來理解和發展這一擴展路線圖。
本文是有關以太坊擴容系列文章的第1 部分,主要介紹狀態增長,第2 部分是關於歷史增長,第3 部分是關於狀態訪問,第4 部分是關於Gas 限制。
什麼是狀態成長?
「狀態增長」一詞通常用來概括任何以太坊擴展瓶頸,即數據大小超過以太坊節點硬件的容量。然而,狀態增長不應該以這種單一的方式來思考。以太坊資料有多種類型,每種類型都與節點的底層硬件元件有獨特的關係。因此,使用精確的術語來解釋每個不同的擴展瓶頸至關重要。
狀態是建立和驗證新以太坊區塊所需的一組資料。狀態由合約字節碼、合約儲存、帳戶餘額和帳戶隨機數組成。歷史是節點從創世區塊同步到最新區塊所需的資料集。歷史由區塊和交易組成。狀態和歷史是不重疊的資料集。從這些定義來看,至少有3 種不同的現像給節點的硬體帶來了巨大的壓力:
狀態成長:新帳戶、新合約字節碼、新合約儲存的累積。
歷史成長:新區塊和新交易的累積。
狀態存取:用於建立和驗證區塊的一組讀寫操作。
每個瓶頸都與節點的硬件限制有獨特的關係。四個相關性最高的硬件限制是:
網絡IO 是節點為了與對等節點達成穩定共識而必須維持的上傳下載速度量。
儲存大小是節點為了建構、驗證和分發區塊而必須在永久儲存中保存的資料量。
內存大小是節點必須在記憶體中緩存的資料量,以便與區塊鏈的末端保持同步。
儲存IO 是節點為了與區塊鏈末端保持同步而必須執行的每秒讀寫操作量。
這些瓶頸和硬件限制之間的關係如圖1 所示。

圖1 :以太坊擴容瓶頸
從圖的頂部開始,每次以太坊執行交易時,該交易使用的所有資源都以Gas 定價。因此,以太坊的Gas 限制是一個單維度量,它對所有形式的鏈上活動進行速率限制。 Gas 限制的下游是區塊大小和每個區塊的操作。每個區塊的字節越多,歷史記錄就成長得越快。每個區塊的IO 操作越多,狀態存取率越大,並且(通常)狀態成長率也越大。
因此,擴展瓶頸與節點的硬件約束有關,如下所示:
為了支援大量的狀態增長,節點必須有足夠的儲存和記憶空間。如果狀態變得太大,則要么無法容納在儲存中,要么狀態的頻繁存取部分將無法包含在記憶體中,從而使得效能降低。
為了支援大量的歷史成長,節點必須有足夠的網路帶寬來共享大量的區塊資料和足夠的儲存容量來儲存這些資料。
為了支援大量的狀態訪問,節點必須有大量的記憶體來高速緩存熱狀態,並且有大量的儲存IO 來支援足夠的讀寫操作。
特別是對於狀態成長而言,主要挑戰是確保狀態規模的成長速度不會超過消費者硬件的持續改善。節點記憶體和儲存是有限的資源,因此它們最終將達到瓶頸,除非狀態停止增長或硬件定期升級。幸運的是,內存和存儲硬件多年來一直在改進。即便如此,對這些改進的準確預測仍不確定,不應認為它們的快速成長將無限期地持續下去。
請注意,即將推出的EIP-4844 引入的資料blob 將為這些擴展關係帶來一些變化。在EIP-4844 之後,預計磁盤上累積的歷史記錄會少得多,傳輸大量Blob 資料時網絡IO 可能會顯著增加。
在本文中,我們將主要關注狀態大小和狀態成長率,而不是記憶體大小和狀態存取模式。我們將在未來的工作中研究其他主題。
以太坊狀態的組成
理解狀態成長的下一步是檢查狀態的總規模以及每個狀態貢獻的大小。目前,以太坊狀態資料量約245.5 GB。這個數字是使用reth 節點測量的,但每個節點客戶端的數字大致可以比較,如表格所示。賬戶、合約字節碼和合約儲存分別佔據狀態的14.1% 、 4.3% 和81.7% 。
圖2 顯示了各類智慧合約協定佔用了多少狀態規模。下圖中,每個合約類別的大小表示其儲存槽和字節碼所佔用的字節數。

圖2 :以太坊狀態分佈
圖2 中的數字表示節點客戶端必須在磁盤上儲存的總字節數。這包括索引使用的資料和其他類型的儲存開銷。每個帳戶和每個儲存槽的平均儲存大小分別為133.6 字節和191.3 字節。
以下是圖2 中一些最重要的資訊:
代幣是狀態的最大貢獻者。以太坊狀態的最大貢獻者是ERC-20 和ERC-721 代幣,分別佔狀態的27.2% 和21.6% 。代幣之所以佔用如此多的狀態,是因為每個代幣的每個用戶餘額必須單獨儲存在自己的32 位元組儲存槽中。因此,以太坊狀態規模的一半與以太坊用戶總數和每位用戶持有的代幣總數成比例。
以太坊至少7.4% 的狀態處於休眠中。以太坊狀態中的一些最大的合約不再活躍。這些協議發佈於區塊空間和狀態空間比現在便宜得多的時候,包括遊戲、賭博和詐騙類別中的大多數協議,還有許多不再活躍的DEX,包括IDEX、Etherdelta 和Oasis。這些協議總共構成了以太坊狀態的至少7.4% 。休眠狀態的真實水準較高,因為它還包括ERC-20、ERC-721 和其他類別中的長尾項目。
L2 跨鏈橋佔據以太坊狀態的不到2% 。通過利用壓縮、ZK 證明和改進的編碼等技術,L2 交易比主網更有效地利用狀態。儘管L2 僅佔主網狀態的2% ,但L2 每秒的總交易數量比主網多5 倍。
以太坊狀態成長有多快?
狀態成長最重要的面向是狀態成長率隨時間的變化。這個比率揭示了狀態問題的嚴重性及其變化趨勢。
圖3 顯示了自2015 年以太坊成立以來的狀態成長率。這些增長率是透過對每個合約類別中的合約字節碼和合約儲存求和來計算的。


圖3 :以太坊狀態隨時間的成長
以下是圖3 一些最重要的資訊:
目前,狀態每月成長約2.62 GB,低於每月5.99 GB 的高峰。透過這些數字預測5 年內狀態總規模將在396 GB 到606 GB 之間。儘管人們可能將當前的成長率描述為每年12.8% ,但在狀態持續成長的同時,絕對成長率一直在下降,因此簡單的指數成長可能不是一個合適的模型。
最近狀態成長的下降主要是因為NFT 活動的減少。儘管人們可能期望不同類型的網絡活動之間存在一定程度的相關性,但各個狀態貢獻者之間存在令人驚訝的獨立性。例如,儘管過去幾年總狀態成長率有所下降,但自2020 年以來,ERC-20 狀態成長率實際上每年都在增加。
狀態成長達到2021 年以來的最低水準。這種下降相當令人驚訝,但考慮到狀態主要與新代幣餘額的成正比,這是有道理的。如果狀態成長率一直在下降,人們可能會認為以太坊有能力支援更高的Gas 限制。這可能是事實,但重要的是要記住: 1)在當前的Gas 定價模型下,沒有什麼可以阻止增長率的新一輪飆升, 2)狀態並不是Gas 限制下游的唯一瓶頸。
可接受的狀態成長值是多少?
我們現在知道以太坊狀態的1) 規模、 2) 組成和3) 成長率。我們如何確定可接受的狀態增長值的範圍?這個問題很複雜,因為它既取決於不可預測的市場力量,也取決於以太坊應該做出哪些權衡的哲學選擇。
讓我們從最簡單的模型開始,假設未來硬件沒有改進,目前的狀態增長水平在普通消費硬件上可持續多久。如圖3 所示,近年來狀態的年增長一直在31 GB/ 年到72 GB/ 年之間。目前,常見的消費性硬體最高儲存容量約為4 TB ,記憶體容量約為64 GB。由此我們可以創造一個簡單的儲存和記憶體需求預測模型:
儲存:節點目前總共需要儲存約1 TB 的狀態資料。實際上,這意味著許多節點正在使用大小至少為2 TB 的磁盤。為簡單起見,讓我們忽略未來的歷史成長,就好像我們處於後EIP-4444 的世界。我們可以計算出未來運行時間為:(剩餘儲存容量)/(狀態成長率),如表格所示。因此,節點儲存硬體可以支援目前的狀態成長速度十多年,而不會耗盡2 TB 的空間。按照目前的狀態成長水平, 4 TB 足以支援運作近半個世紀。
內存:Ethereum-on-arm 用戶報告稱,運行以太坊節點的最小可行內存約為16 GB。如果我們假設內存需求與狀態大小成比例增長,那麼每年30 GB 到72 GB 的狀態增長將轉化為每年需要2 GB - 4.7 GB 的額外內存。因此,按照目前的Gas 率, 32 GB RAM 應該足夠使用3 年到8 年。 64 GB 的RAM 應該足夠使用10 年到23 年。
這是一個帶有許多假設條件的簡化模型。此模型可能的擴展條件包括1) 歷史成長, 2) 內存需求的非線性擴展,3) 降低硬件成本, 4) 增加Gas 限制,5) 操作碼Gas 重新定價,以及 6) 未來以太坊架構改進。這些因素中的每一個都可以非線性相互作用並隨著時間的推移而演變。我們將在未來的工作中探索這些模型擴展。
必須強調的是,長期可持續性是件好事。即使現代硬件可以支援多年的運行,也不應該掉以輕心地縮短可運行時間。任何加速狀態成長的計劃都應該包括一個重要的緩衝區,以應對硬件或軟件環境不可預測的變化。
如何解決狀態成長問題?
為了解決狀態增長問題,人們提出了許多不同的方案。以太坊架構的三項改進非常突出:Rollup、Verkle 嘗試和狀態過期。總而言之,這些構成了解決短期、中期和長期狀態成長問題的綜合路線圖。
短期:Rollup 無法解決狀態成長問題,但它們確實減輕了網路負擔。如圖2 和圖3 所示,Rollup 能夠比主網更有效地使用狀態。將活動轉移到L2 確實需要在主網上儲存一定量的狀態,以支援用戶退出。然而,L2 交易的狀態足跡遠低於主網上交易的足跡。因此,Rollup 可以更永續地增加生態系統中的總活動。隨著即將推出的EIP-4844 ,Rollup 的採用預計將會成長,blob 將使Rollup 變得更便宜。
中期:Verkle 嘗試解決驗證器節點的狀態成長問題,但不解決需要建立新交易的節點的問題。 Verkle 嘗試是以太坊狀態的新資料結構。它們支援更有效率的輕型客戶端和“無狀態”節點。這些節點將能夠在不了解現有狀態值的情況下驗證新區塊。這消除了驗證器節點的狀態成長問題。新交易的構建仍然需要儲存和訪問狀態,但這仍然比我們今天的情況更可持續,因為交易構建是一項可以輕鬆分佈在許多機器上的任務。就範圍而言,Verkle 嘗試代表了一項可能需要數年時間才能實施的重大工程。
長期:狀態過期解決了所有節點的狀態成長問題,但需要額外的基礎設施。狀態到期允許節點丟棄狀態的不活動部分,如圖2 。請注意,術語「狀態休眠」可能是一個更合適的名稱,因為大多數現有提案允許通過證明恢復「過期」狀態。關於過期狀態隨著時間的推移而丟失的擔憂,只要歷史記錄(區塊和交易資料)可用,就可以重建狀態。因此,無論為EIP-4444 的歷史保存問題開發什麼解決方案,也將解決狀態保存問題。但如果Verkle 嘗試成功實現其目標,狀態到期可能就不必要了。
狀態成長問題的解決方案還有更多,其他包括狀態租金和分片,但從歷史上看,這些可能對用戶體驗或健全性產生影響。為了在更遙遠的將來實現最終解決方案,可能需要將這些解決方案與其他解決方案結合。
總結
儘管狀態成長是擴展以太坊的關鍵挑戰,但我們相信這是一個可以解決的問題。透過我們對資料的解讀,以太坊可以維持當前的狀態成長水準多年,並為架構升級提供了舒適的緩衝。
我們相信,經驗方法對於設計以太坊的Gas 限制和引導以太坊走向最終的擴展解決方案至關重要。本文只是實現這一目標的一步。還有其他類型的超越狀態的數據,每種數據都對以太坊節點和以太坊Gas 限制施加了負擔。我們希望在未來的工作中探索這些其他瓶頸。


