Alert Source Discuss
Standards Track: Core

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 的行为按以下方式更改:

  1. 当在与调用 SELFDESTRUCT 的合约创建的交易不同的交易中执行 SELFDESTRUCT 时:

    • 当前执行帧停止。
    • SELFDESTRUCT 不会删除任何数据(包括存储密钥、代码或帐户本身)。
    • SELFDESTRUCT 将整个帐户余额转移到目标。
    • 请注意,如果目标与调用 SELFDESTRUCT 的合约相同,则余额不会发生净变化。 与之前的规范不同,在这种情况下,以太币不会被销毁。
    • 请注意,自EIP-3529 以来,没有退款。
    • 请注意,关于 SELFDESTRUCTEIP-2929 的规则保持不变。
  2. 当在与合约创建的同一交易中执行 SELFDESTRUCT 时:

    • SELFDESTRUCT 继续像在本 EIP 之前那样运行,这包括以下操作
      • 当前执行帧停止。
      • SELFDESTRUCT 按照之前的规定删除数据。
      • SELFDESTRUCT 将整个帐户余额转移到目标
      • 调用 SELFDESTRUCT 的合约的帐户余额设置为 0
    • 请注意,如果目标与调用 SELFDESTRUCT 的合约相同,则以太币将被销毁。
    • 请注意,自EIP-3529 以来,没有退款。
    • 请注意,关于 SELFDESTRUCTEIP-2929 的规则保持不变。

合约被认为是在创建交易开始时或 CREATE 系列操作开始执行时创建的(CREATE、CREATE2 以及未来部署合约的其他操作)。 如果合约的新地址存在余额,则仍被视为合约创建。

SELFDESTRUCT 操作码仍然如 EIP-6049 中所指定的那样被弃用。 即使考虑到这种新行为,也强烈建议不要在新部署的合约中使用它,并且对 EVM 的未来更改可能会进一步降低操作码的功能。

理由

过去曾考虑过删除 SELFDESTRUCT 操作码,并且目前没有充分的理由使用它。 本 EIP 实施了一种行为,该行为将尝试使 SELFDESTRUCT 的一些常见用法保持工作状态,同时降低合约版本控制对 EVM 实施的更改的复杂性。

将帐户创建和合约创建作为两个不同的且可能独立的事件来处理,对于诸如反事实帐户之类的用例是必需的。 通过允许 SELFDESTRUCT 在合约创建时删除帐户,它不会导致反事实实例化的合约的存根,这些合约除了在合约创建之前具有余额之外,从未具有任何链上状态。 这些帐户将永远没有任何存储,因此删除帐户的 trie 更新将仅限于帐户节点,这与常规以太币转移的影响相同。

向后兼容性

本 EIP 需要硬分叉,因为它修改了共识规则。

如果创建的合约未在同一交易中调用 SELFDESTRUCT,则依赖于使用 CREATE2(在 SELFDESTRUCT 之后)在同一地址重新部署合约的合约将不再正常运行。

以前可以通过调用 SELFDESTRUCT 将执行合约作为受益人来销毁以太币。 如果合约在交易之前存在,则以太币将不会被销毁。 如果合约是在交易中新创建的,则以太币将像以前一样被销毁。

测试用例

可以在执行规范测试套件 eip6780_selfdestruct 中找到此 EIP 的测试用例。

安全注意事项

SELFDESTRUCT 的以下应用将被破坏,并且以这种方式使用它的应用程序不再安全:

  1. 其中 CREATE2 用于在同一位置重新部署合约,以使合约可升级。 这不再受支持,应改用 ERC-2535 或其他类型的代理合约。

  2. 其中一个合约依赖于通过 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.