EIP-2364: eth/64:扩展了 forkid 的协议握手
引入了在与对等节点握手时对 `forkid` 的验证。
Authors | Péter Szilágyi <peterke@gmail.com>, Péter Szilágyi (@karalabe), Tim Beiko (@timbeiko) |
---|---|
Created | 2019-11-08 |
Requires | EIP-2124 |
Table of Contents
摘要
本 EIP 指定包含最初在 (EIP-2124) 中定义的 forkid
,作为以太坊网络协议 (eth
) 握手中的一个新字段。此更改作为网络协议的新版本 eth/64
实现。
动机
forkid
(EIP-2124) 的设计目的是允许两个以太坊节点快速且廉价地决定它们是否兼容,不仅是在创世区块/网络级别,而且从当前通过的网络更新(即分叉)的角度来看也是如此。
EIP-2124 仅定义了如何计算和验证 forkid
,但未指定 forkid
应如何在对等节点之间交换。本 EIP 指定包含 forkid
作为以太坊网络协议 (eth
) 握手中的一个新字段(发布新版本 eth/64
)。
通过在握手期间交叉验证 forkid
,不兼容的节点可以在昂贵的区块交换和验证发生之前断开连接(PoW 检查、EVM 执行、状态重构)。这进一步防止了不兼容但尚未被检测到的节点占用对等节点插槽。
从微观角度来看,将不兼容的节点彼此隔离可确保节点仅将其资源用于对其真正有用的任务。我们越早确定远程对等节点无用,我们花费的时间和处理就越少。
从宏观角度来看,保持不兼容节点彼此隔离可确保不相交的集群保留更多资源来维护其自己的链,从而提高所有网络的全球服务质量。
规范
- 根据 EIP-2124 实现
forkid
的生成和验证。 - 以
eth/64
公布新的eth
协议功能(版本)。- 旧的
eth/63
协议应保持并行运行,直到eth/64
被实施者充分采用。
- 旧的
- 重新定义
eth/64
的Status (0x00)
以添加尾随forkid
字段:- 旧数据包:
[protocolVersion, networkId, td, bestHash, genesisHash]
- 新数据包:
[protocolVersion, networkId, td, bestHash, genesisHash, forkid]
, 其中forkid
是[forkHash: [4]byte, forkNext: uint64]
(根据 EIP-2124 的字段)。
- 旧数据包:
每当两个对等节点使用 eth/64
协议连接时,必须发送更新后的 Status
消息作为协议握手,并且每个对等节点必须验证远程 forkid
,并在检测到不兼容时断开连接。
理由
该规范很小,因为大部分内容已在 EIP-2124 中指定。 eth/63
未指定为 EIP,但在 ethereum/devp2p Github 存储库中维护。
EIP-2124 提到也在发现协议中公布 forkid
。这与在 eth
协议中公布相比如何?为什么需要冗余?
在发现协议中公布和验证 forkid
是一种更优化的解决方案,因为它可以帮助避免设置 TCP 连接和加密 RLPx 流的成本,如果 eth/64
拒绝它,则只能将其拆除。
但是,与 eth
协议相比,发现有点模糊。那里的目标是建议潜在的对等节点,而不是万无一失的。信息可能已过时,节点可能已更改或消失。发现可以进行粗略的过滤,但之后仍然需要更高的精度。
此外,通过发现协议进行 forkid
验证需要 ENR 实现 (EIP-778) 和 ENR 扩展支持 (EIP-868),而以太坊网络当前不需要这些支持。最后,发现协议只是一种查找对等节点的方式,但无法使用 UDP 或依赖其他机制(例如 DNS 发现)的系统仍然需要一种过滤连接的方式。
forkid
隐式包含校验和到 FORK_HASH
字段中的创世哈希。为什么此提案不从 eth
握手中删除 genesisHash
字段?
最初,此 EIP 确实将其删除作为冗余数据,因为基于 forkid
的过滤是基于创世哈希的过滤的超集。退出该决定的原因是创世哈希可能对其他事情也有用,而不仅仅是连接过滤(网络爬虫当前使用它来跨网络拆分节点)。
尽管 forkid
有望接管当前使用的创世哈希的所有角色,但没有理由在重复数据删除方面过于激进。现在将两者并排保留是可以的,并在第三方基础设施切换时在将来的版本中删除。
向后兼容性
此 EIP 以向后不兼容的方式扩展了 eth
协议握手,并且需要推出一个新版本 eth/64
。但是,devp2p
支持并行运行同一网络协议的多个版本,因此推出 eth/64
不需要客户端协调,因为未更新的客户端可以继续使用 eth/63
。
此 EIP 不会更改共识引擎,因此_不需要_硬分叉。
测试用例
有关计算和验证分叉 ID,请参见 EIP-2124 中的测试用例。
安全注意事项
没有。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Péter Szilágyi <peterke@gmail.com>, Péter Szilágyi (@karalabe), Tim Beiko (@timbeiko), "EIP-2364: eth/64:扩展了 forkid 的协议握手," Ethereum Improvement Proposals, no. 2364, November 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2364.