撰文:Storm Slivkoff、Georgios Konstantopoulos
编译:Luffy,Foresight News
历史增长(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:以太坊历史增长率随时间变化上述图表中的几个关键要点:
不同合约类别生成的历史数量揭示了以太坊的使用模式如何随着时间的推移而演变。图 3 显示了各种合约类别的相对贡献。这是与图 2 相同的数据进行了标准化。
图 3:不同合约类别对历史增长的贡献这些数据揭示了以太坊使用模式的四个不同时期:
每个时代都代表着比之前更复杂的以太坊使用模式。随着时间的推移,复杂性可以看作是以太坊扩展的一种形式,它无法通过每秒交易量等简单指标来衡量。
在最近的数据月份(2024 年 4 月)中,Rollup 不再产生大部分历史记录。目前尚不清楚未来的历史记录是否源自 DEX 和 DeFi,或者是否会出现一些新的使用模式。
Dencun 硬分叉引入了 blob,显著改变了历史增长动态,它允许 Rollup 使用廉价的 blob 而不是历史记录来发布数据。图 4 放大了 Dencun 升级前后的历史增长率。该图表与图 2 类似,只是每条垂直线代表一天而不是一个月。
图 4:Dencun 对历史增长的影响从该图表中我们可以得出几个关键结论:
尽管 blob 已经降低了历史增长速度,但它们仍然是以太坊的一项新特性。目前尚不清楚在 blob 存在的情况下,历史增长速度会稳定在什么水平。
提高 Gas 上限将增加历史增长率。因此,提高 Gas 上限的提案(例如 Pump the Gas)必须考虑历史增长与每个节点硬件瓶颈之间的关系。
要确定可接受的历史增长率,首先要了解当前节点硬件在网络和存储方面能够维持多长时间。联网硬件可能可以无限期地维持现状,因为在增加 Gas 限制之前,历史增长率不太可能回到 Dencun 之前的峰值。然而,历史的存储负担会随着时间的推移不断增加。在当前的存储策略下,每个节点的存储硬盘最终都会被历史记录填满,这是不可避免的。
图 5 显示了以太坊节点随时间变化的存储负担,并预测了未来 3 年存储负担的增长情况。预测参照 2024 年 4 月的增长率。随着未来使用模式或 Gas 限制的变化,该增长率可能会上升或下降。
图 5:历史记录、状态和全节点存储负担的大小从该图中我们可以得出几个关键结论:
与状态数据不同,历史数据是仅附加的,访问频率要低得多。因此,理论上可以将历史数据与状态数据分开存储在更便宜的存储介质上。这可以通过 Geth 等一些客户端来实现。
除了存储容量之外,网络 IO 是历史增长的另一个主要限制。与存储容量不同,网络 IO 限制不会在短期内给节点带来问题,但这些限制对于未来增加 Gas 限制将变得很重要。
要了解典型以太坊节点的网络容量可以支持多少历史增长,必须知道历史增长与各种网络健康指标之间的关系,例如重组率、时隙未命中、最终未命中、证明未命中、同步委员会未命中和区块提交延迟。这些指标的分析超出了本文的范围,但可以在先前对共识层健康状况的调查中找到更多信息。此外,以太坊基金会的 Xatu 项目一直在构建公共数据集,以加快此类分析。
历史增长是一个比状态增长更容易解决的问题。它几乎可以完全由候选提案 EIP-4444 解决。这项 EIP 将每个节点从保存整个以太坊历史数据更改为仅保存一年的历史数据。实施 EIP-4444 后,数据存储将不再是以太坊扩容的瓶颈,从长远来看 Gas 限制增加也不在被约束。EIP -4444 对于网络的长期可持续性是必要的,否则历史增长速度会很快,需要定期更新网络节点的硬件。
图 6 显示了 EIP-4444 在未来 3 年内对每个节点的存储负担的影响。这与图 4 相同,但增加了较浅的线条,表示 EIP-4444 实施后的存储负担。
图 6:EIP-4444 对以太坊节点存储负担的影响从该图中可以看出一些关键结论:
在实施 EIP-4444 后,历史增长仍将带来一定程度的存储负担,因为节点将存储一年的历史记录。但是,即使以太坊达到全球规模,这个负担也不难解决。一旦历史记录保存方法被证明是可靠的,EIP-4444 的一年到期时间可能会缩短到几个月、几周甚至更短。
EIP-4444 提出了一个问题:如果历史记录不由以太坊节点自己保存,那么它应该如何保存呢?历史记录在以太坊的验证、核算和分析中起着核心作用,因此保存历史记录至关重要。幸运的是,历史记录保存是一个简单的问题,只需要 1/n 诚实的数据提供者。这与需要 1/3 到 2/3 的参与者诚实的状态共识问题形成鲜明对比。节点操作员可以通过 1) 重放创世区块以来的所有交易和 2) 检查这些交易是否重现与当前区块链端具有相同的状态根来验证历史数据集的真实性。
保存历史记录的方法有很多种。
其余的实施挑战更多是社会挑战而非技术挑战。以太坊社区需要协调具体的实施细节,以便将它们直接集成到每个节点客户端中。特别是,从创世区块开始执行完全同步(而不是快照同步)将需要从历史记录提供商而不是以太坊节点检索历史记录。这些更改在技术上不需要硬分叉,因此它们可以比以太坊的下一个硬分叉 Pectra 更早实现。
所有这些历史保存方法也可以由 L2 用来保存他们发布到主网的 blob 数据。与历史保存相比,blob 保存 1) 更困难,因为总数据量大得多;2) 不太重要,因为 blob 对于重放主网历史不是必需的。但是,对于每个 L2 重放自己的历史来说,blob 保存仍然是必要的。因此,某种形式的 blob 保存对整个以太坊生态系统都很重要。此外,如果 L2 开发出强大的 blob 存储基础设施,它们也可能能够轻松存储 L1 历史数据。
直接比较 EIP-4444 之前和之后各种节点配置存储的数据集会很有帮助。图 7 显示了不同以太坊节点类型的存储负担。状态数据是账户和合约,历史数据是区块和交易,存档数据是一组可选数据索引。此表中的字节数基于最近的 reth 快照,但其他节点客户端的数字应该大致相当。
图 7:不同以太坊节点类型的存储负担换句话说,
最后,还有一些额外的 EIP 可以限制历史增长率,而不仅仅是适应当前增长率。这在短期内有助于保持在网络 IO 约束内,在长期内有助于保持在存储约束之内。尽管 EIP-4444 对于网络的长期可持续性仍然是必要的,但这些其他 EIP 将有助于以太坊在未来更有效地扩展:
这些 EIP 比 EIP-4444 更容易实现,因此它们可能作为 EIP-4444 投入生产之前的短期权宜之计。
本文的目的是通过数据来理解 1) 历史增长的工作原理和 2) 解决该问题的方法。本文中的许多数据难以通过传统的方式获取,因此我们希望公开这些数据为历史增长问题提供一些新见解。
历史增长作为以太坊扩容的瓶颈尚未得到足够的重视。即使不增加 Gas 上限,以太坊当前保存历史记录的惯例也会迫使许多节点在几年内升级硬件。幸运的是,这不是一个难以解决的问题。EIP-4444 中已经有一个明确的解决方案。我们认为应该加快实施此 EIP,以便为未来的 Gas 上限增加留出空间。