Alert Source Discuss
Standards Track: Core

EIP-684: 冲突时回滚创建

如果地址已经有代码,则回滚合约创建

Authors Vitalik Buterin (@vbuterin), Renan Rodrigues de Souza (@RenanSouza2)
Created 2023-03-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 代码中的第一个字节是无效的操作码一样。此更改必须追溯适用于所有现有区块。

理由

智能合约的核心原则之一是其代码不会更改。但是,凭借足够的计算能力,攻击者可以将地址中存储的代码更改为任何其他代码,窃取资金或执行其他恶意活动。

向后兼容性

这是一个执行层升级,因此需要硬分叉。

测试用例

给定以下创世分配:

Address : 0xd0bBEc6D2c628b7e2E6D5556daA14a5181b604C5,
Balance : 1000000000000000000, // 1 ether
Nonce   : 0,
code    : "",

Address : 0x7658771dc6Af74a3d2F8499D349FF9c1a0DF8826,
Balance : 0,
Nonce   : 1,
Code    : "0xB0B0FACE",

从 EOA 0xd0bBEc6... (227bcc6959669226360814723ed739f1214201584b6a27409dfb8228b8be5f59) 的第一个交易中创建的、没有 salt 的合约应该回滚。

安全考虑

本 EIP 是一项安全升级:它强制执行已部署代码的不可变性。

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Vitalik Buterin (@vbuterin), Renan Rodrigues de Souza (@RenanSouza2), "EIP-684: 冲突时回滚创建," Ethereum Improvement Proposals, no. 684, March 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-684.