EIP-2294: 显式限定 Chain ID 的大小
增加了 Chain ID 参数的最大值,以避免在使用该参数的较大值时可能发生的潜在编码问题。
Authors | Zainan Victor Zhou (@xinbenlv), Alex Beregszaszi (@axic), Bryant Eisenbach (@fubuloubu) |
---|---|
Created | 2019-09-19 |
Requires | EIP-155 |
摘要
本 EIP 根据一些已知的限制,如 EIP-155 以及 ChainId 的主要钱包和 JSON-RPC 表示,信息性地定义了 ChainId 的“安全范围”和“最大范围”。
动机
- 我们希望 chainId 在生态系统的不同组件(如智能合约、钱包、dApp 和 JSON-RPC 等)中都是安全的。
- 我们希望启用跨链函数调用
- 我们希望确保 EIP-712 域对如何打包 ChainID 有明确的定义。
- 实现链的可能扩展,例如增加以太坊主网的 L2、L3 或分片的数量。
- 启用基于哈希的临时链:有人建议使用基于哈希的标识符来代替 Chain ID,以便该值可以随着时间的推移适应不同的有争议的分叉和其他场景。本提案未描述此行为,但 ~63 位的熵应该足以确保对于此功能的合理(例如,非恶意)使用,不太可能发生冲突。
规范
我们声明了以下 chainID 范围
- (1, 2^31 - 1): “安全范围”,上限由 JavaScript 数字决定
- (1, MAX_CHAIN_ID); “最大范围”,其中
MAX_CHAIN_ID := floor(MAX_UINT64 / 2) - 36 = 9,223,372,036,854,775,771
:
理由
超过 “最大范围”,EIP-155 将溢出,如下所述
计算 MAX_CHAIN_ID
是为了避免在执行 uint64 数学运算时发生溢出。作为参考,也不允许值为 0 或更小。
由于执行链 ID 计算的方式,算术运算期间看到的最大值为 CHAIN_ID * 2 + 36
,因此客户端必须测试以确保在使用最高值时不会遇到任何溢出情况。不可能发生下溢。
EIP-155 引入了 Chain ID 参数,该参数是用于以太坊协议签名消息的域分离(重放保护)的重要参数。但是,它没有指定此参数的大小应采取的任何属性。允许其为 256 位宽意味着事务的 RLP 编码必须使用 >256 位算术来计算 v 字段。
并建议一个合理的强制最大大小,以确保在编码此参数时不会出现任何问题。这将允许此参数有足够数量的不同值,该参数通常由社区共识选择作为给定链的创世参数,因此不会经常更改。
如果没有一个精心选择的 Chain ID 值,在客户端代码库和外部工具中,EIP-155(以及 EIP-1344 的派生版本)的实现中可能会存在差异,这可能会导致将共识关键漏洞引入网络。通过明确此限制,我们可以避免以太坊和任何使用以太坊代码库的项目出现这种情况。
此外,字段 chainID
的使用和依赖性已逐渐增加,因为越来越多的合约依赖 EIP-1344 在智能合约执行中公开 CHAIN ID。例如,当与 EIP-712、ERC-1271 一起用于链上合约签名验证时,chainId 已越来越多地用于防止重放攻击。确保客户端依赖于密码学中的 chainId 计算在所有情况下都能产生相同的验证结果至关重要。
向后兼容性
这个 EIP 引入了一个更改,它会影响此功能的先前实现。但是,截至撰写本文时(2022-10-18),没有已知的链使用超出建议范围的值,因此在此参数的大小上采用此限制不应出现问题,因此影响应该是不存在的。
如果任何其他链以不兼容的 chainId
运行,我们建议他们在采用此 EIP 时做出适当的安排。
安全考虑
需要讨论。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Zainan Victor Zhou (@xinbenlv), Alex Beregszaszi (@axic), Bryant Eisenbach (@fubuloubu), "EIP-2294: 显式限定 Chain ID 的大小 [DRAFT]," Ethereum Improvement Proposals, no. 2294, September 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2294.