EIP-4444 能够解决以太坊历史增长问题,并为 Gas 上限增加留出空间。
相关阅读:《Paradigm:以太坊状态增长的挑战与解决方案

撰文:Storm Slivkoff、Georgios Konstantopoulos

编译:Luffy,Foresight News

历史增长(History growth)是目前以太坊扩容的最大瓶颈。出乎意料的是,历史增长已经成为比状态增长更大的问题。几年之内,历史数据将超过许多以太坊节点的存储容量。

好消息是:

  • 历史增长是一个比状态增长更容易解决的问题。
  • 解决方案已在积极开发中。
  • 解决历史增长将缓解状态增长问题。

在这篇文章中,我们将继续研究第 1 部分中的以太坊扩容问题,现在将注意力从状态增长转向历史增长。使用精细的数据集,我们的目标是 1) 从技术上理解以太坊的扩展瓶颈,以及 2) 帮助围绕以太坊 Gas 限制的最优解展开讨论。

什么是历史增长?

历史是以太坊在其整个生命周期内执行的所有区块和交易的集合,它是从创世区块到当前区块的所有数据。历史增长是随着时间的推移新区块和新交易的积累。

图 1 显示了历史增长与各种协议指标和以太坊节点硬件约束之间的关系。与状态增长相比,历史增长受到一组不同的硬件约束限制。历史增长给网络 IO 带来压力,因为新的区块和交易必须在整个网络中传输。历史增长还会给节点的存储空间带来压力,因为每个以太坊节点都会存储完整的历史记录副本。如果历史增长速度足够快以致于超出这些硬件限制,则节点将不再能够与其对等节点达成稳定的共识。有关状态增长和其他扩容瓶颈的概述,请参阅本系列文章的第 1 部分

Paradigm:详解以太坊历史增长问题及其解决方案

图 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/)字节表示大小。无法轻易识别的合约被归类为「未知」。 「其他」类别包括基础设施和游戏等一系列小类别。

Paradigm:详解以太坊历史增长问题及其解决方案

图 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 相同的数据进行了标准化。

Paradigm:详解以太坊历史增长问题及其解决方案

图 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 类似,只是每条垂直线代表一天而不是一个月。

Paradigm:详解以太坊历史增长问题及其解决方案

图 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 限制的变化,该增长率可能会上升或下降。

Paradigm:详解以太坊历史增长问题及其解决方案

图 5:历史记录、状态和全节点存储负担的大小

从该图中我们可以得出几个关键结论:

  • 历史记录占用的存储空间大约是状态的 3 倍。这种差异还会随着时间的推移而增大,因为历史增长速度大约是状态的 8 倍。
  • 1.8 TiB 是临界阈值,许多节点将被迫升级其存储硬盘。2TB 是常见的存储硬盘大小,仅提供 1.8TiB 的可用空间。请注意,TB(1 万亿字节)与 TiB(= 1024 ^ 4 字节)是不同的单位。对于许多节点运营商来说,「真正的」临界阈值甚至更低,因为合并后验证器必须与执行客户端一起运行共识客户端。
  • 临界阈值将在 2 到 3 年内达到。提高任何数量的 Gas 限制都会相应加快这一时间的到来。达到这一阈值将给节点运营商带来不小的维护负担,并需要购买额外的硬件(例如 300 美元的 NVME 驱动器)。

与状态数据不同,历史数据是仅附加的,访问频率要低得多。因此,理论上可以将历史数据与状态数据分开存储在更便宜的存储介质上。这可以通过 Geth 等一些客户端来实现。

除了存储容量之外,网络 IO 是历史增长的另一个主要限制。与存储容量不同,网络 IO 限制不会在短期内给节点带来问题,但这些限制对于未来增加 Gas 限制将变得很重要。

要了解典型以太坊节点的网络容量可以支持多少历史增长,必须知道历史增长与各种网络健康指标之间的关系,例如重组率、时隙未命中、最终未命中、证明未命中、同步委员会未命中和区块提交延迟。这些指标的分析超出了本文的范围,但可以在先前对共识层健康状况的调查中找到更多信息。此外,以太坊基金会的 Xatu 项目一直在构建公共数据集,以加快此类分析。

如何解决历史增长问题?

历史增长是一个比状态增长更容易解决的问题。它几乎可以完全由候选提案 EIP-4444 解决。这项 EIP 将每个节点从保存整个以太坊历史数据更改为仅保存一年的历史数据。实施 EIP-4444 后,数据存储将不再是以太坊扩容的瓶颈,从长远来看 Gas 限制增加也不在被约束。EIP -4444 对于网络的长期可持续性是必要的,否则历史增长速度会很快,需要定期更新网络节点的硬件。

图 6 显示了 EIP-4444 在未来 3 年内对每个节点的存储负担的影响。这与图 4 相同,但增加了较浅的线条,表示 EIP-4444 实施后的存储负担。

Paradigm:详解以太坊历史增长问题及其解决方案

图 6: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 显示了不同以太坊节点类型的存储负担。状态数据是账户和合约,历史数据是区块和交易,存档数据是一组可选数据索引。此表中的字节数基于最近的 reth 快照,但其他节点客户端的数字应该大致相当。

Paradigm:详解以太坊历史增长问题及其解决方案

图 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 上限增加留出空间。