EIP-6780: 仅在同一交易中的 SELFDESTRUCT
SELFDESTRUCT 会将所有资金恢复到目标,但不会删除帐户,除非在与创建合同的同一交易中调用
Authors | Guillaume Ballet (@gballet), Vitalik Buterin (@vitalik), Dankrad Feist (@dankrad) |
---|---|
Created | 2023-03-25 |
Requires | EIP-2681, EIP-2929, EIP-3529 |
摘要
本 EIP 更改了 SELFDESTRUCT
操作码的功能。 新功能将仅是将帐户中的所有 Ether 发送到目标,但当在创建合约的同一交易中调用 SELFDESTRUCT
时,将保留当前行为。
动机
SELFDESTRUCT
操作码需要对帐户状态进行很大的更改,特别是删除所有代码和存储。 未来使用 Verkle 树时,这将是不可能的:每个帐户将存储在许多不同的帐户密钥中,这些密钥不会明显地连接到根帐户。
本 EIP 实现了这一更改。 仅使用 SELFDESTRUCT
来检索资金的应用程序仍然可以工作。 仅在与创建合约的同一交易中使用 SELFDESTRUCT
的应用程序也可以继续工作,而无需进行任何更改。
规范
SELFDESTRUCT
的行为按以下方式更改:
-
当在与调用
SELFDESTRUCT
的合约创建的交易不同的交易中执行SELFDESTRUCT
时: -
当在与合约创建的同一交易中执行
SELFDESTRUCT
时:
合约被认为是在创建交易开始时或 CREATE 系列操作开始执行时创建的(CREATE、CREATE2 以及未来部署合约的其他操作)。 如果合约的新地址存在余额,则仍被视为合约创建。
SELFDESTRUCT
操作码仍然如 EIP-6049 中所指定的那样被弃用。 即使考虑到这种新行为,也强烈建议不要在新部署的合约中使用它,并且对 EVM 的未来更改可能会进一步降低操作码的功能。
理由
过去曾考虑过删除 SELFDESTRUCT
操作码,并且目前没有充分的理由使用它。 本 EIP 实施了一种行为,该行为将尝试使 SELFDESTRUCT
的一些常见用法保持工作状态,同时降低合约版本控制对 EVM 实施的更改的复杂性。
将帐户创建和合约创建作为两个不同的且可能独立的事件来处理,对于诸如反事实帐户之类的用例是必需的。 通过允许 SELFDESTRUCT
在合约创建时删除帐户,它不会导致反事实实例化的合约的存根,这些合约除了在合约创建之前具有余额之外,从未具有任何链上状态。 这些帐户将永远没有任何存储,因此删除帐户的 trie 更新将仅限于帐户节点,这与常规以太币转移的影响相同。
向后兼容性
本 EIP 需要硬分叉,因为它修改了共识规则。
如果创建的合约未在同一交易中调用 SELFDESTRUCT
,则依赖于使用 CREATE2
(在 SELFDESTRUCT
之后)在同一地址重新部署合约的合约将不再正常运行。
以前可以通过调用 SELFDESTRUCT
将执行合约作为受益人来销毁以太币。 如果合约在交易之前存在,则以太币将不会被销毁。 如果合约是在交易中新创建的,则以太币将像以前一样被销毁。
测试用例
可以在执行规范测试套件 eip6780_selfdestruct
中找到此 EIP 的测试用例。
安全注意事项
SELFDESTRUCT
的以下应用将被破坏,并且以这种方式使用它的应用程序不再安全:
-
其中
CREATE2
用于在同一位置重新部署合约,以使合约可升级。 这不再受支持,应改用 ERC-2535 或其他类型的代理合约。 -
其中一个合约依赖于通过
SELFDESTRUCT
销毁 Ether,并将该合约作为受益人,但该合约不是在同一交易中创建的。
版权
在 CC0 下放弃版权及相关权利。
Citation
Please cite this document as:
Guillaume Ballet (@gballet), Vitalik Buterin (@vitalik), Dankrad Feist (@dankrad), "EIP-6780: 仅在同一交易中的 SELFDESTRUCT," Ethereum Improvement Proposals, no. 6780, March 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6780.