Alert Source Discuss
⚠️ Review Informational

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 的“安全范围”和“最大范围”。

动机

  1. 我们希望 chainId 在生态系统的不同组件(如智能合约、钱包、dApp 和 JSON-RPC 等)中都是安全的。
  2. 我们希望启用跨链函数调用
  3. 我们希望确保 EIP-712 域对如何打包 ChainID 有明确的定义。
  4. 实现链的可能扩展,例如增加以太坊主网的 L2、L3 或分片的数量。
  5. 启用基于哈希的临时链:有人建议使用基于哈希的标识符来代替 Chain ID,以便该值可以随着时间的推移适应不同的有争议的分叉和其他场景。本提案未描述此行为,但 ~63 位的熵应该足以确保对于此功能的合理(例如,非恶意)使用,不太可能发生冲突。

规范

我们声明了以下 chainID 范围

  1. (1, 2^31 - 1): “安全范围”,上限由 JavaScript 数字决定
  2. (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-712ERC-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.