EIP-4444能夠解決以太坊歷史增長問題,並為Gas上限增加留出空間。
歷史增長(History growth)是目前以太坊擴容的最大瓶頸。出乎意料的是,歷史增長已經成為比狀態增長更大的問題。幾年之內,歷史數據將超過許多以太坊節點的存儲容量。
好消息是:
歷史增長是一個比狀態增長更容易解決的問題。
解決方案已在積極開發中。
解決歷史增長將緩解狀態增長問題。
在這篇文章中,我們將繼續研究第1部分中的以太坊擴容問題,現在將注意力從狀態增長轉向歷史增長。使用精細的數據集,我們的目標是1)從技術上理解以太坊的擴展瓶頸,以及2)幫助圍繞以太坊Gas限制的最優解展開討論。
什麼是歷史增長?
歷史是以太坊在其整個生命周期內執行的所有區塊和交易的集合,它是從創世區塊到當前區塊的所有數據。歷史增長是隨著時間的推移新區塊和新交易的積累。
圖1顯示了歷史增長與各種協議指標和以太坊節點硬件約束之間的關係。與狀態增長相比,歷史增長受到一組不同的硬件約束限制。歷史增長給網絡IO帶來壓力,因為新的區塊和交易必須在整個網絡中傳輸。歷史增長還會給節點的存儲空間帶來壓力,因為每個以太坊節點都會存儲完整的歷史記錄副本。如果歷史增長速度足夠快以致於超出這些硬件限制,則節點將不再能夠與其對等節點達成穩定的共識。有關狀態增長和其他擴容瓶頸的概述,請參閱本系列文章的第1部分。
圖1:以太坊擴容瓶頸
直到最近,每個節點的大部分網絡吞吐量都用於傳輸歷史記錄(例如新區塊和交易)。隨著Dencun硬分叉中引入blob,這種情況發生了變化。blob現在佔據了節點網絡活動的很大一部分。但是,blob不被視為歷史記錄的一部分,因為1)它們只由節點存儲2周,然後被丟棄,2)它們不需要重複以太坊創世以來的數據。由於(1),blob不會顯著增加每個以太坊節點的存儲負擔。我們將在本文的後面部分討論blob。
在本文中,我們將重點討論歷史增長,並討論歷史與狀態之間的關係。由於狀態增長和歷史增長具有一些重疊的硬件約束,因此它們是相關的問題,解決一個問題可以幫助解決另一個問題。
歷史增長有多快?
圖2顯示了自以太坊創世以來的歷史增長率。每條垂直線代表一個月的增長。y軸表示該月歷史增長的千兆字節數。交易按其「目標地址」分類,並使用RLP(https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/)字節表示大小。無法輕易識別的合約被歸類為「未知」。「其他」類別包括基礎設施和遊戲等一系列小類別。
圖2:以太坊歷史增長率隨時間變化
上述圖表中的幾個關鍵要點:
歷史增長速度比狀態增長快6到8倍:歷史增長速度最近達到峰值36.0 GiB/月,目前為19.3 GiB/月。狀態增長速度峰值約6.0 GiB/月,目前為2.5 GiB/月。本文後面將介紹歷史與狀態在增長和累計大小方面的比較。
在Decun之前,歷史增長率一直在加速:雖然狀態多年來一直呈大致線性增長(參見第1部分),但歷史卻呈超線性增長。考慮到線性增長的增長率會導致整體規模呈二次方增長,因此超線性增長的增長率會導致整體規模超過二次方增長。這種加速在Dencun之後突然停止。這是以太坊首次經歷歷史增長率的大幅下降。
近期歷史增長的大部分來自Rollup:每個L2都會將其交易副本發布回主網。這生成了大量歷史記錄,並導致Rollup成為過去一年歷史增長的最重要貢獻者。然而,Dencun允許L2使用blob而不是歷史記錄發布其交易數據,因此Rollup不再生成大部分以太坊歷史記錄。我們將在本文後面更詳細地介紹Rollup。
以太坊歷史增長最大的貢獻者是誰?
不同合約類別生成的歷史數量揭示了以太坊的使用模式如何隨著時間的推移而演變。圖3顯示了各種合約類別的相對貢獻。這是與圖2相同的數據進行了標準化。
圖3:不同合約類別對歷史增長的貢獻
這些數據揭示了以太坊使用模式的四個不同時期:
早期(紫色):以太坊的最初幾年幾乎沒有鏈上活動。這些早期合約中,大多數現在都很難識別,在圖表中標記為「未知」。
ERC-20時代(綠色):ERC-20標準於2015年底最終確定,但直到2017年和2018年才獲得顯著發展。ERC-20合約在2019年成為最大的歷史增長來源。
DEX / DeFi時代(棕色):DEX和DeFi合約早在2016年就已出現在鏈上,並於2017年開始受到關注。但直到2020年DeFi夏季,它們才成為歷史增長的最大類別。DeFi和DEX合約在2021年和2022年的部分時間佔據了歷史增長的50%以上。
Rollup時代(灰色):2023年初,L2 Rollup開始執行比主網更多的交易。在Dencun之前的幾個月裡,它們生成了大約2/3的以太坊歷史記錄。
每個時代都代表著比之前更複雜的以太坊使用模式。隨著時間的推移,複雜性可以看作是以太坊擴展的一種形式,它無法通過每秒交易量等簡單指標來衡量。
在最近的數據月份(2024年4月)中,Rollup不再產生大部分歷史記錄。目前尚不清楚未來的歷史記錄是否源自DEX和DeFi,或者是否會出現一些新的使用模式。
那blob又如何呢?
Dencun硬分叉引入了blob,顯著改變了歷史增長動態,它允許Rollup使用廉價的blob而不是歷史記錄來發布數據。圖4放大了Dencun升級前後的歷史增長率。該圖表與圖2類似,只是每條垂直線代表一天而不是一個月。
圖4:Dencun對歷史增長的影響
從該圖表中我們可以得出幾個關鍵結論:
自Dencun以來,rollup的歷史增長下降了約2/3:大多數rollup已從call data轉換為blob,這大大減少了它們生成的歷史記錄量。但是,截至2024年4月,仍有一些rollup尚未從call data轉換為blob。
自Dencun以來,總歷史增長下降了約1/3:Dencun僅降低了rollup的歷史增長。其他合約類別的歷史增長稍有增加。即使在Dencun之後,歷史增長仍然是狀態增長的8倍(詳情請參閱下一節)。
儘管blob已經降低了歷史增長速度,但它們仍然是以太坊的一項新特性。目前尚不清楚在blob存在的情況下,歷史增長速度會穩定在什麼水平。
多快的歷史增長是可接受的?
提高Gas上限將增加歷史增長率。因此,提高Gas上限的提案(例如Pump the Gas)必須考慮歷史增長與每個節點硬件瓶頸之間的關係。
要確定可接受的歷史增長率,首先要了解當前節點硬件在網絡和存儲方面能夠維持多長時間。聯網硬件可能可以無限期地維持現狀,因為在增加Gas限制之前,歷史增長率不太可能回到Dencun之前的峰值。然而,歷史的存儲負擔會隨著時間的推移不斷增加。在當前的存儲策略下,每個節點的存儲硬盤最終都會被歷史記錄填滿,這是不可避免的。
圖5顯示了以太坊節點隨時間變化的存儲負擔,並預測了未來3年存儲負擔的增長情況。預測參照2024年4月的增長率。隨著未來使用模式或Gas限制的變化,該增長率可能會上升或下降。
圖5:歷史記錄、狀態和全節點存儲負擔的大小
從該圖中我們可以得出幾個關鍵結論:
歷史記錄佔用的存儲空間大約是狀態的3倍。這種差異還會隨著時間的推移而增大,因為歷史增長速度大約是狀態的8倍。
1.8 TiB是臨界閾值,許多節點將被迫升級其存儲硬盤。2TB是常見的存儲硬盤大小,僅提供1.8TiB的可用空間。請注意,TB(1萬億字節)與TiB(= 1024 ^ 4 字節)是不同的單位。對於許多節點運營商來說,「真正的」臨界閾值甚至更低,因為合並後驗證器必須與執行客戶端一起運行共識客戶端。
臨界閾值將在2到3年內達到。提高任何數量的Gas限制都會相應加快這一時間的到來。達到這一閾值將給節點運營商帶來不小的維護負擔,並需要購買更大容量的存儲硬盤。除了状态数据,历史数据是一种附加的数据,访问频率较低。因此,理论上可以将历史数据和状态数据分开存储在更便宜的存储介质上。一些客户端,如Geth,可以实现这一点。
除了存储容量外,网络IO是历史增长的另一个主要限制。与存储容量不同,网络IO限制不会在短期内给节点带来问题,但这些限制对于未来增加Gas限制将变得很重要。
要了解典型以太坊节点的网络容量可以支持多少历史增长,必须了解历史增长与各种网络健康指标之间的关系,例如重组率、时隙未命中、最终未命中、证明未命中、同步委员会未命中和区块提交延迟。这些指标的分析超出了本文的范围,但可以在先前对共识层健康状况的调查中找到更多信息。此外,以太坊基金会的Xatu项目一直在构建公共数据集,以加快此类分析。
如何解决历史增长问题?
历史增长是一个比状态增长更容易解决的问题。它几乎可以完全通过候选提案EIP-4444来解决。这个提案将每个节点从保存整个以太坊历史数据改为仅保存一年的历史数据。实施EIP-4444后,数据存储将不再是以太坊扩容的瓶颈,从长远来看,Gas限制增加也不再受限制。EIP-4444对于网络的长期可持续性是必要的,否则历史增长速度会很快,需要定期更新网络节点的硬件。
图6显示了EIP-4444在未来3年内对每个节点存储负担的影响。这与图4相同,但增加了较浅的线条,表示EIP-4444实施后的存储负担。
从该图中可以看出一些关键结论:
EIP-4444将使当前的存储负担减半。存储负担将从1.2 TiB降至633 GiB。
EIP-4444将稳定历史存储负担。假设历史增长率恒定,则历史数据将以生成的速率被丢弃。
在EIP-4444之后,节点存储负担需要很多年才能达到今天的水平。这是因为状态增长将是增加存储负担的唯一因素,而状态的增长速度比历史增长慢。
在实施EIP-4444后,历史增长仍将带来一定程度的存储负担,因为节点将存储一年的历史记录。但是,即使以太坊达到全球规模,这个负担也不难解决。一旦历史记录保存方法被证明是可靠的,EIP-4444的一年到期时间可能会缩短到几个月、几周甚至更短。
如何保存以太坊的历史记录?
EIP-4444提出了一个问题:如果历史记录不由以太坊节点自己保存,那么它应该如何保存呢?历史记录在以太坊的验证、核算和分析中起着核心作用,因此保存历史记录至关重要。幸运的是,保存历史记录是一个相对简单的问题,只需要1/n个诚实的数据提供者。这与需要1/3到2/3的参与者诚实的状态共识问题形成鲜明对比。节点操作员可以通过1)重放创世区块以来的所有交易和2)检查这些交易是否重现与当前区块链端具有相同的状态根来验证历史数据集的真实性。
有许多方法可以保存历史记录。
Torrents/P2P:Torrents是最简单、最可靠的方法。以太坊节点可以定期打包部分历史记录并将其作为公共Torrent文件共享。例如,一个节点可能每100,000个区块创建一个新的历史Torrent文件。像erigon这样的节点客户端已经在某种程度上以非标准化的方式执行了此过程。为了标准化此过程,所有节点客户端都必须使用相同的数据格式、相同的参数和相同的P2P网络。节点将能够根据其存储和带宽能力选择是否参与此网络。Torrents的优势在于使用已经得到大量数据工具支持的高lindy开放标准。
Portal Network:Portal Network是专为托管以太坊数据而设计的新网络。这是一种类似于Torrent的方法,同时还提供了一些额外的功能,使数据验证更加容易。Portal Network的优势在于,这些额外的验证层为轻客户端提供了实用程序,可以有效地验证和查询共享数据集。
云主机:AWS的S3或Cloudflare的R2等云存储服务为保存历史记录提供了一种廉价且高性能的选择。然而,这种方法带来了更多的法律风险和业务运营风险,因为不能保证这些云服务始终愿意并能够托管加密货币数据。
其余的实施挑战更多是社会挑战而非技术挑战。以太坊社区需要协调具体的实施细节,以便将它们直接集成到每个节点客户端中。特别是,从创世区块开始执行完全同步(而不是快照同步)将需要从历史记录提供商而不是以太坊节点检索历史记录。这些更改在技术上不需要硬分叉,因此它们可以比以太坊的下一个硬分叉Pectra更早实现。
所有这些历史保存方法也可以由L2用来保存他们发布到主网的blob数据。与历史保存相比,blob保存1)更困难,因为总数据量大得多;2)不太重要,因为blob对于重放主网历史不是必需的。但是,对于每个L2重放自己的历史来说,blob保存仍然是必要的。因此,某种形式的blob保存对整个以太坊生态系统都很重要。此外,如果L2开发出强大的blob存储基础设施,它们也可能能够轻松存储L1历史数据。
直接比较EIP-4444之前和之后各种节点配置存储的数据集会很有帮助。图7显示了不同以太坊节点类型的存储负担。状态数据是账户和合约,历史数据是区块和交易,存档数据是一组可选数据索引。
存档节点存储状态数据和历史数据以及存档数据。当有人希望能够轻松查询历史链状态时,可以使用存档节点。
全节点仅存储历史数据和状态数据。当今大多数节点都是全节点。全节点的存储负担大约是存档节点的一半。
EIP-4444之后的全节点仅存储状态数据和最近一年的历史数据。这将节点的存储负担从1.2 TiB减少到633 GiB,并使历史数据的存储空间达到稳定状态值。
无状态节点,又称”轻节点”,不存储任何数据集,能够立即在链的末端进行验证。一旦Verkle尝试或其他状态承诺方案添加到以太坊,这种节点类型就成为可能。
最后,还有一些额外的EIP可以限制历史增长率,而不仅仅是适应当前增长率。这在短期内有助于保持在网络IO约束内,在长期内有助于保持在存储约束之内。尽管EIP-4444对于网络的长期可持续性仍然是必要的,但这些其他EIP将有助于以太坊在未来更有效地扩展:
EIP-7623:重新定价call data,使某些call data过多的交易更加昂贵。使这些使用模式更加昂贵将迫使其中一些从call data转换为blob。这将降低历史增长率。
EIP-4488:对每个区块中可包含的call data总量施加限制。这将对历史记录的增长速度施加更严格的限制。
这些EIP比EIP-4444更容易实现,因此它们可能作为EIP-4444投入生产之前的短期权宜之计。
结束语
本文的目的是通过数据来理解1)历史增长的工作原理和2)解决该问题的方法。本文中的许多数据难以通过传统的方式获取,因此我们希望公开这些数据为历史增长问题提供一些新见解。
历史增长作为以太坊扩容的瓶颈尚未得到足够的重视。即使不增加Gas上限,以太坊当前保存历史记录的惯例也会迫使许多节点在几年内升级硬件。幸运的是,这不是一个难以解决的问题。EIP-4444中已经有一个明确的解决方案。我们认为应该加快实施此EIP,以便为未来的Gas上限增加留出空间。