EIP-2677: 限制 `initcode` 的大小
Authors | Martin Holst Swende (@holiman), Paweł Bylica (@chfast), Alex Beregszaszi (@axic) |
---|---|
Created | 2020-05-18 |
Discussion Link | https://ethereum-magicians.org/t/eip-2677-limit-size-of-initcode/4550 |
简单总结
对 initcode
强制执行最大尺寸限制 (max_initcode_size
) 49152
(0xc000
)。
摘要
对 initcode
强制执行最大尺寸限制 (max_initcode_size
)。如果 initcode
的大小超过 max_initcode_size
,则合约创建将因 gas 不足错误而失败。
自从 EIP-170 实施以来,合约代码的大小限制为 24576
(0x6000
)。我们建议也将可执行代码的大小限制为上述限制的 2x
,即 49152
(0xc000
)。
这也带来了两个很好的特性:
- 代码中的指令偏移量适合 16 位值,
- 代码大小适合 16 位值。
动机
当客户端执行 initcode
时,客户端必须执行 jumpdest 分析。在某些情况下,客户端还会执行代码的 hash
操作:
- 用作包含 jumpdest 分析结果的映射中的键
- 用于
CREATE2
中的地址计算。
jumpdest 分析期间执行的工作与代码大小成线性比例。目前,一个交易可以扩展内存一次,并重复使用相同的内存段(进行少量修改),以强制客户端执行大量分析/哈希操作,从而导致区块处理缓慢。
历史上,这在 2017 年 6 月被利用,促成了 geth 的 1.6.5 版本补丁。
在 CREATE2
中的地址计算期间执行的工作与代码大小成比例收费。
规范
以下三种情况适用:
CREATE
,CREATE2
,- 使用空接收者的交易进行创建。
在所有这些(以及未来的)情况下,如果代码长度超过 max_initcode_size
,EVM 应该会因 Gas 不足错误而失败。
理由
待定
向后兼容性
此 EIP 需要“网络升级”,因为它修改了共识规则。
安全考虑
对于客户端实现,此 EIP 使基于 jumpdest 分析或代码哈希的攻击不再那么成问题,因此应该提高客户端的稳健性。
对于第 2 层,此 EIP 引入了以前不存在的故障模式。可能存在部署多级合约层次结构的工厂合约,使得多个合约的代码包含在第一个合约的 initcode 中。此 EIP 的作者不知道任何此类合约。
测试用例
测试用例应包括以下情况:
CREATE
/CREATE2
/tx create
,其中initcode_size
为max_initcode_size
CREATE
/CREATE2
/tx create
,其中initcode_size
为max_initcode_size+1
实现
待定
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
Martin Holst Swende (@holiman), Paweł Bylica (@chfast), Alex Beregszaszi (@axic), "EIP-2677: 限制 `initcode` 的大小 [DRAFT]," Ethereum Improvement Proposals, no. 2677, May 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2677.