Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-4758: 停用 SELFDESTRUCT

通过将 SELFDESTRUCT 更改为 SENDALL 来停用它,SENDALL 会将所有资金返还给调用者,但不会删除任何代码或存储。

Authors Guillaume Ballet (@gballet), Vitalik Buterin (@vbuterin), Dankrad Feist (@dankrad)
Created 2022-02-03
Discussion Link https://ethereum-magicians.org/t/eip-4758-deactivate-selfdestruct/8710

摘要

此 EIP 将 SELFDESTRUCT 操作码重命名为 SENDALL,并替换其功能。 新的功能将仅仅是将帐户中的所有 Ether 发送到调用者。

动机

SELFDESTRUCT 操作码需要对帐户的状态进行很大的更改,特别是删除所有代码和存储。 未来使用 Verkle 树时,这将是不可能的:每个帐户将存储在许多不同的帐户密钥中,这些密钥不会明显地连接到根帐户。

此 EIP 实现了此更改。 仅使用 SELFDESTRUCT 来检索资金的应用程序仍然可以工作。

规范

  • SELFDESTRUCT 操作码已重命名为 SENDALL,现在仅立即将帐户中的所有 ETH 转移到目标; 它不再销毁代码或存储或更改 nonce
  • 所有与 SELFDESTRUCT 相关的退款都将被删除

理由

过去曾考虑过取消 SELFDESTRUCT 操作码,并且目前没有充分的理由使用它。 禁用它将是无状态的要求。

向后兼容性

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

很少有应用程序受到此更改的影响。 唯一中断的用法是使用 CREATE2 在同一地址重新创建合约(在 SELFDESTRUCT 之后)。

安全注意事项

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

  1. 任何使用 SELFDESTRUCT 销毁合约内的非 ETH token 余额的情况,例如 EIP-20)。 我们不知道有任何这样的用法(因为通过发送到销毁地址可以很容易地做到这一点,这似乎不太可能使用 SELFDESTRUCT
  2. 在使用 CREATE2 在同一位置重新部署合约的地方。 这有两种可能失败的情况:
    • 销毁操作阻止合约在特定上下文之外使用。 例如,合约允许任何人提取资金,但在操作结束时使用 SELFDESTRUCT 以防止其他人这样做。 这种类型的操作可以很容易地修改为不依赖于 SELFDESTRUCT
    • SELFDESTRUCT 操作用于使合约可升级。 这不再支持,应使用代理。

版权

通过 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Guillaume Ballet (@gballet), Vitalik Buterin (@vbuterin), Dankrad Feist (@dankrad), "EIP-4758: 停用 SELFDESTRUCT [DRAFT]," Ethereum Improvement Proposals, no. 4758, February 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4758.