Alert Source Discuss
Standards Track: Networking

EIP-7642: eth/69 - 历史过期和更简化的回执

添加历史服务窗口并移除回执中的 Bloom 过滤器

Authors Marius van der Wijden (@MariusVanDerWijden), Felix Lange <fjl@ethereum.org>, Ahmad Bitar (@smartprogrammer93) <smartprogrammer@windowslive.com>
Created 2024-02-29
Requires EIP-5793

摘要

本 EIP 修改了 ‘eth’ p2p 协议,以宣告节点所服务的历史区块范围。我们还简化了握手过程,移除了总难度信息,因为合并后不再使用该信息。此外,我们建议从通过协议传输的回执中移除 Bloom 字段。

动机

Status 消息中的区块范围

在历史过期工作组中,决定客户端可以在 2025 年 5 月 1 日之后从其存储中删除合并前的历史记录。对于希望通过 ‘eth’ 协议同步历史记录的客户端来说,必须知道对等节点是否仍在提供旧的历史记录。EIP-7542 中提出了类似的想法,但后来由于当时尚未就历史过期问题达成政治决定而撤回。

移除回执中的 Bloom

我们最近发现,没有客户端存储回执的 Bloom 字段,因为它可以在需要时重新计算。但是,网络规范要求通过网络发送 Bloom 字段。因此,同步节点将请求所有回执的 Bloom 过滤器。服务节点将重新生成大约 530GB 的 bloom 过滤器(23 亿个交易 * 256 字节)。这些 530GB 通过网络发送到同步对等节点,同步对等节点将验证它们并且也不存储它们。这为每次同步增加了额外的 530GB 不必要的带宽。

BlockRangeUpdate 消息

我们希望客户端了解其对等节点中可用的区块范围。新的通知消息可用于检测对等节点的同步状态,并相应地调整获取行为。

规范

Status 消息更改

按如下方式修改 Status (0x00) 消息:

  • (eth/68): [version: P, networkid: P, td: P, blockhash: B_32, genesis: B_32, forkid]

  • (eth/69): [version: P, networkid: P, genesis: B_32, forkid, earliestBlock: P, latestBlock: P, latestBlockHash: B_32]

请注意,blockhash 已移动到末尾以匹配 BlockRangeUpdate

Receipts 消息更改

按如下方式修改 Receipts (0x10) 消息中回执的编码:

  • (eth/68): receipt = {legacy-receipt, typed-receipt} with
typed-receipt = tx-type || rlp(legacy-receipt)

legacy-receipt = [
    post-state-or-status: {B_32, {0, 1}},
    cumulative-gas: P,
    bloom: B_256,
    logs: [log₁, log₂, ...]
]
  • (eth/69): receipt = [tx-type, post-state-or-status, cumulative-gas, logs]

BlockRangeUpdate 消息

添加一个新的 BlockRangeUpdate (0x11) 消息,具有以下编码

[earliestBlock: P, latestBlock: P, latestBlockHash: B_32]

每当此客户端可用的区块范围更新时,都应发送新消息。为了减少流量,不必为每个新区块发送更新。客户端应该最多每 epoch(32 个区块)发送一次更新。

原理

Status 更改

合并后,Status 消息的 TD 字段变得毫无意义,因为合并后区块的难度为 0。理论上,它可用于区分同步节点和未同步节点,但同样的事情也可以通过 forkid 来完成。

从技术上讲,新的 earliestBlock 字段不是历史过期所必需的,但添加它有几个原因可以提供帮助:

  • 它可以改进对等节点的查找,以便在商定的移除合并前历史记录之后,仍然希望从 p2p 同步历史记录的客户端。如果没有 earliestBlock,客户端将必须执行历史记录请求以检查较早的范围是否存在,并假设失败的请求意味着它不存在。
  • 新字段可用于专业爬虫中的普查。我们将能够看到有多少用户/节点启用了历史记录,以及在哪个实现中。
  • 它为我们将来历史过期窗口是动态的做准备。

Receipts 更改

Receipt 消息中删除 bloom 过滤器可显着降低服务节点的 CPU 负载和带宽。接收节点将需要重新计算 bloom 过滤器,以便完全验证回执哈希。重新计算的 CPU 密集度不高。带宽增益约为每个同步节点 530GiB,或(至少)95GiB snappy 压缩。

在 Ethereum 共识中,传统交易和类型交易的回执编码有所不同。类型交易回执是“不透明的”,并且数据包装在字节数组中。但是,所有回执类型最终都包含相同的四个字段。随着 bloom 过滤器的删除,网络协议现在偏离了共识使用的编码,并且没有必要复制那里使用的奇怪且昂贵的编码。建议的回执编码只是所需数据字段的平面列表。

向后兼容性

此 EIP 更改了 eth 协议,需要推出新版本 eth/69。支持有线协议的多个版本是可能的。推出新版本不会立即破坏旧客户端,因为它们可以继续使用协议版本 eth/68

此 EIP 不会更改 EVM 的共识规则,也不需要硬分叉。

安全注意事项

版权

通过 CC0 放弃版权及相关权利。

Citation

Please cite this document as:

Marius van der Wijden (@MariusVanDerWijden), Felix Lange <fjl@ethereum.org>, Ahmad Bitar (@smartprogrammer93) <smartprogrammer@windowslive.com>, "EIP-7642: eth/69 - 历史过期和更简化的回执," Ethereum Improvement Proposals, no. 7642, February 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7642.