🚧 Stagnant
Standards Track: Core
EIP-4758: 停用 SELFDESTRUCT
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
的应用程序将被破坏,以这种方式使用它的应用程序不再安全:
- 任何使用
SELFDESTRUCT
销毁合约内的非 ETH token 余额的情况,例如 EIP-20)。 我们不知道有任何这样的用法(因为通过发送到销毁地址可以很容易地做到这一点,这似乎不太可能使用SELFDESTRUCT
) - 在使用
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.