以太坊客户端支持部分历史数据过期 - 公告

以太坊执行客户端现在支持部分历史过期,允许用户通过移除合并前的区块数据来减少磁盘空间占用,大约可以减少300-500GB。文章还介绍了历史数据的使用场景、权益证明中区块验证的变化、历史数据的可用性保障以及各个客户端的具体命令。

Partial history expiry announcement

截至今日,所有以太坊执行客户端均根据 支持部分历史过期。虽然关于完整、滚动历史过期仍在进行中,但用户可以通过移除 Merge 之前的区块数据来减少以太坊节点所需的磁盘空间 300-500 GB。这将允许节点舒适地容纳在 2 TB 的磁盘上。请参阅下文,了解有关每个特定客户端的信息。

链历史

根据定义,区块链是从特定创世点开始的区块链。对于以太坊,这种情况发生在 。每个块都包含有关协议本身的信息,即当前 gas 限制、用户交易列表以及由收据封装的这些交易的结果。此数据有很多用途:

  • 链的完整验证需要执行每个历史区块,以确保不仅当前头部状态正确,而且从创世到今天的所有历史状态都正确。
  • 构建链历史上的索引,例如跟踪某个帐户随时间的余额变化或某个应用程序的状态如何变化。
  • 对于使用 calldata 发布交易的 L2,他们将需要链历史来完全验证其链或构建索引。
  • 一般的过去操作证明,例如证明某个交易在某个时间点已发送。
  • 在极少数情况下,包括非同质化代币 (NFT) 数据。但目前在链上托管 NFT 的主要方法是将 NFT 数据存储在合约存储中或引用外部来源,例如 IPFS。

这种历史数据不会被以太坊用户经常使用,而是为更高级的用户和开发者服务。访问当前余额、执行交易、借入资产等不会因历史过期而中断。自创世以来一直处于休眠状态的帐户也不会受到影响,因为每个帐户的状态都会继续维护。但是,只会维护当前状态。因此,仅从历史记录中无法轻易确定用户过去某个特定时间点的余额。此类查询需要带有专门索引的 ,能够确定过去的状态值。

权益证明中的区块验证

当以太坊通过工作量证明启动时,从创世开始的完整验证是默认设置。后来,客户端实现了快照同步和其他类似的同步方式,客户端根据最重的链规则跳转到链的头部,然后继续下载所有合约和帐户状态。对于那些认为最重的链规则不足以验证链的完整性的人,保留了完整同步。

随着权益证明和 Merge 的出现,同步策略发生了变化。因为签名可以以基本无成本生成,所以客户端需要锚定到最近的可信检查点,也称为 。这允许新用户引导到链,而不会受到来自很久以前退出验证器集的验证器的假设性远程攻击的欺骗。

主观性的引入进一步消除了用户完全验证链中每个区块的需要,因此出于许多其他原因,客户端采用了一种新的反向同步策略,他们向后遍历链朝向创世以下载历史记录。现在大多数客户端不完全执行链,因此没有理由强迫每个以太坊节点从 p2p 网络下载超过 1 TB 的未使用数据。通过历史过期,我们维护一个类似于其他网络的 1-of-N 信任假设,即如果至少一个实体提供历史区块,节点将能够通过协议外方式检索历史记录。

历史过期的默认安全模型与当前现状没有改变。客户端已经超过 5 年没有从创世开始完全验证链。执行层将继续提供所有标头,这允许从创世开始对链进行加密验证。这有助于避免客户端接受无效的历史数据。

可用性,有保证

直到今天,以太坊网络上的每个节点都存储了从创世到头部的每个区块。这提供了极高的保证,即任何人都可以随时下载历史记录。我们相信,可以减少存储所有历史记录的节点数量,同时仍然确保高可用性。我们通过以下分发渠道实现这一目标:

  • 机构提供商 - 愿意在自己的服务器上托管历史档案的组织。
  • Torrent - 存档历史记录的可选择加入的无需许可和去中心化托管。
  • 对等网络 - 与以前相同的检索机制,只是选择不存储历史记录的对等方会在一定程度上稀释整体可用性。

有关镜像和 torrent 文件列表,请访问社区维护的文档 。


客户端特定命令

虽然此信息在发布时是最新的,但与特定客户端关联的命令和标志可能会发生变化。最新信息始终是每个客户端各自的文档。

每个以全节点为中心的客户端都支持在没有 pre-merge 数据的情况下运行,但是确切的过程取决于客户端。以下是在每个执行客户端上运行修剪节点的说明。请注意,只有 Mainnet 和 Sepolia 具有非 Merge 链前缀,因此只能在这些链上进行修剪。此外,Sepolia 中的非 Merge 链前缀很小,因此修剪可能对每个客户端所需的总磁盘大小影响很小。

Go-ethereum

从 版本开始可用。 完整文档可用 。

对于现有节点:

  1. 正常关闭 geth。
  2. 运行离线修剪命令 geth prune-history --datadir=</path/to/data>
  3. 再次启动 geth。

对于新节点:

  1. 使用标志 --history.chain postmerge 跳过下载 pre-merge 区块。

Nethermind

默认情况下从版本 . 开始激活。

历史记录仅在新同步的节点上删除。自动修剪将在未来的版本中添加。 完整文档可用 。

为了禁用 history-expiry 特性:

  1. 使用标志 --Sync.AncientBodiesBarrier 0 --Sync.AncientReceiptsBarrier 0。

Besu

从 版本开始可用。 完整文档可用 。

对于现有节点,可以:

离线修剪

  1. 正常关闭 Besu。
  2. 运行离线修剪命令:besu --data-path=</path/to/data> storage prune-pre-merge-blocks
  3. 使用 --history-expiry-prune 启动 Besu
  4. 等待直到所有空间都被回收,大约 24-48 小时。
  5. 删除 --history-expiry-prune 并重新启动 Besu。

在线修剪

  1. 启动客户端时使用标志 --history-expiry-prune。

对于新节点:

  1. 使用标志 --sync-mode=SNAP

Erigon

从 版本开始可用

对于新节点和现有节点:

  1. 启动客户端时使用标志 --history-expiry

Reth

对于新节点和现有节点:

  1. 对于 Mainnet 使用标志 --prune.bodies.pre-merge --prune.receipts.before 15537394,对于 Sepolia 使用标志 --prune.bodies.pre-merge --prune.receipts.before 1450409。
  • 原文链接: blog.ethereum.org/2025/0...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
以太坊中文
以太坊中文
以太坊中文, 用中文传播以太坊的最新进展