EIP-4444是以太坊历史增长问题的解决方案,也为Gas上限增加留出了空间。历史增长是目前以太坊扩容的最大瓶颈,但它比状态增长问题更容易解决。解决历史增长问题将有助于缓解状态增长问题。本文将继续讨论以太坊扩容问题,但将重点放在历史增长方面。我们使用详细的数据集来从技术上理解以太坊的扩展瓶颈,并讨论Gas限制的最优解。历史是以太坊在其整个生命周期内执行的所有区块和交易的集合,是从创世区块到当前区块的所有数据。历史增长是随着时间的推移新区块和新交易的累积。历史增长与各种协议指标和以太坊节点硬件约束之间存在关系。与状态增长相比,历史增长受到一组不同的硬件约束限制。历史增长给网络IO带来压力,因为新的区块和交易必须在整个网络中传输。历史增长还会给节点的存储空间带来压力,因为每个以太坊节点都存储完整的历史记录副本。在过去几年中,历史增长速度超过了许多以太坊节点的存储容量。直到最近,每个节点的大部分网络吞吐量都用于传输历史记录。然而,Dencun硬分叉引入了blob,这改变了历史增长的动态。blob占据了节点网络活动的很大一部分,但不被视为历史记录的一部分,因为它们只在节点存储2周,然后被丢弃,而且不需要重复以太坊创世以来的数据。历史增长速度最近达到了峰值,但Dencun后,历史增长率大幅下降。近期历史增长的大部分来自Rollup,但Dencun允许L2使用blob而不是历史记录来发布交易数据,因此Rollup不再生成大部分以太坊历史记录。Dencun之后,rollup的历史增长下降了约2/3,总历史增长下降了约1/3。虽然blob已经降低了历史增长速度,但它们仍然是以太坊的一项新特性。提高Gas上限将增加历史增长率。要确定可接受的历史增长率,首先要了解当前节点硬件在网络和存储方面能够维持多长时间。联网硬件可能可以无限期地维持现状,但历史的存储负担会随着时间的推移不断增加。预测显示,未来3年存储负担将不断增长。历史记录占用的存储空间大约是状态的3倍,而历史增长速度大约是状态增长的8倍。达到临界阈值将给节点运营商带来不小的维护负担,并需要购买更大的存储硬盘。提高Gas限制将加快到达临界阈值的时间。额外的硬件(例如300美元的NVME驱动器)只是一种选择。与状态数据不同,历史数据是附加的,并且访问频率要低得多。因此,理论上可以将历史数据与状态数据分开存储在更便宜的存储介质上。一些客户端,如Geth,已经实现了这一点。
除了存储容量之外,网络IO也是历史增长的主要限制之一。与存储容量不同,网络IO限制不会立即对节点造成问题,但对于未来增加Gas限制将变得非常重要。
要了解典型以太坊节点的网络容量可以支持多少历史增长,需要了解历史增长与各种网络健康指标之间的关系,例如重组率、时隙未命中、最终未命中、证明未命中、同步委员会未命中和区块提交延迟。这些指标的分析超出了本文的范围,但可以在先前对共识层健康状况的调查中找到更多信息。此外,以太坊基金会的Xatu项目一直在构建公共数据集,以加快此类分析。
如何解决历史增长问题?
历史增长是一个比状态增长更容易解决的问题。它几乎可以完全由候选提案EIP-4444解决。这项EIP将每个节点从保存整个以太坊历史数据更改为仅保存一年的历史数据。实施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显示了不同以太坊节点类型的存储负担。状态数据是账户和合约,历史数据是区块和交易,存档数据是一组可选数据索引。此表中的字节数基于最近的reth快照,但其他节点客户端的数字应该大致相当。
存档节点存储状态数据和历史数据以及存档数据。当有人希望能够轻松查询历史链状态时,可以使用存档节点。
全节点仅存储历史数据和状态数据。如今,大多数节点都是全节点。全节点的存储负担大约是存档节点的一半。
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投入生产之前的短期解决方案。
结束语
本文的目的是通过数据来理解历史增长的工作原理以及解决该问题的方法。本文中的许多数据难以通过传统的方式获取,因此我们希望通过公开这些数据为历史增长问题提供一些新见解。
历史增长作为以太坊扩容的瓶颈尚未得到足够的重视。即使不增加Gas上限,以太坊当前保存历史记录的惯例也会迫使许多节点在几年内升级硬件。幸运的是,这不是一个难以解决的问题。EIP-4444中已经有一个明确的解决方案。我们认为应该加快实施此EIP,以便为未来的Gas上限增加留出空间。