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.