EIP-7610: 如果存储非空,则回滚创建操作
如果地址已经有非空存储,则回滚合约创建操作
Authors | Gary Rong (@rjl493456442), Martin Holst Swende (@holiman) |
---|---|
Created | 2024-02-02 |
Last Call Deadline | 2024-11-20 |
摘要
此 EIP 导致在尝试在具有预先存在的存储的地址上创建合约时抛出错误。
规范
本文档中的关键词 “MUST”、”MUST NOT”、”REQUIRED”、”SHALL”、”SHALL NOT”、”SHOULD”、”SHOULD NOT”、”RECOMMENDED”、”NOT RECOMMENDED”、”MAY” 和 “OPTIONAL” 按照 RFC 2119 和 RFC 8174 中的描述进行解释。
如果由于创建交易、CREATE
操作码、CREATE2
操作码或任何其他原因尝试创建合约,并且目标地址已经具有非零 nonce、非零代码长度或非空存储,则创建操作必须抛出错误,就像 init 代码中的第一个字节是无效操作码一样。此更改必须追溯适用于所有现有区块。
此 EIP 使用一个额外的条件来修改 EIP-684,要求合约部署具有空存储。
理由
EIP-684 定义了合约部署的两个条件:目标地址必须具有零 nonce 和零代码长度。不幸的是,这还不够。在应用 EIP-161 之前,新部署合约的 nonce 仍然设置为零。因此,完全有可能创建一个 nonce 为零且代码长度为零但存储非空的合约,如果 slot 在构造函数中设置了。目前以太坊主网上存在 28 个这样的合约。
由于智能合约的核心原则之一是其代码不会改变,即使代码长度为零。在这种情况下,必须拒绝合约创建。
向后兼容性
这是一个执行层升级,因此需要硬分叉。
测试用例
在 ethereum 测试仓库和执行规范测试中,存在相当多的测试,这些测试用于测试部署到具有非空存储的目标的场景。过去这些测试一直被认为是有问题的;Reth 和 EELS 都有意实现一个帐户重置版本,仅仅是为了通过测试。Py-evm 声明这种情况是不可能的,并且从未实现帐户重置。
重新填充现有测试将为此 EIP 提供足够的覆盖率。
安全注意事项
此 EIP 是一项安全升级:它强制执行已部署代码的不可变性。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Gary Rong (@rjl493456442), Martin Holst Swende (@holiman), "EIP-7610: 如果存储非空,则回滚创建操作 [DRAFT]," Ethereum Improvement Proposals, no. 7610, February 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7610.