Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-4760: SELFDESTRUCT 炸弹

通过将 SELFDESTRUCT 更改为 SENDALL 来禁用它,并通过指数级增加 gas 成本的阶段来实现此目的。

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

摘要

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

为了让应用程序有更多的警告,即使他们的开发者完全不知道 EIP 流程,此版本将指数级地增加操作码的 gas 成本,因此任何开发者都有时间看到此更改并通过实施一个不依赖于 SELFDESTRUCT 的合约版本来做出反应。

动机

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

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

规范

常量

名称 评论
OLD_SELFDESTRUCT_COST 5000 SELFDESTRUCT 操作码的当前 gas 成本
HARD_FORK_BLOCK TBD (Shanghai HF 区块高度)
DOUBLING_SLOTS 2**16 (gas 价格翻倍的时间,约 9 天)
DOUBLINGS_BEFORE_SENDALL 13 SELFDESTRUCT 将在 HARD_FORK_BLOCK + DOUBLING_SLOTS * DOUBLINGS_BEFORE_SENDALL 处转换为 SENDALL
  • 如果 HARD_FORK_BLOCK <= slot < HARD_FORK_BLOCK + DOUBLING_SLOTS * DOUBLINGS_BEFORE_SENDALL
    • SELFDESTRUCT 功能保持不变
    • SELFDESTRUCT gas 成本现在是 OLD_SELFDESTRUCT_COST * 2 ** ((slot - HARD_FORK_BLOCK) // DOUBLING_SLOTS)
  • 对于 slot >= HARD_FORK_BLOCK + DOUBLING_SLOTS * DOUBLINGS_BEFORE_SENDALL
    • 成本恢复为 OLD_SELFDESTRUCT_COST
    • SELFDESTRUCT 操作码重命名为 SENDALL,现在仅立即将账户中的所有 ETH 转移到目标; 它不再销毁代码或存储或更改 nonce
    • 所有与 SELFDESTRUCT 相关的退款都将被移除

理由

此 EIP 背后的想法是以一种向 Dapp 开发者发出充分警告的方式禁用 SELFDESTRUCT。 许多开发者没有密切关注 EIP 流程,因此当操作码被禁用并且不再实现其原始目的时,可能会感到惊讶。 然而,至少如果智能合约有规律地使用,那么用户会注意到操作的价格大幅上涨。 发生这种情况的时期 (HARD_FORK_BLOCK + DOUBLING_SLOTS * DOUBLINGS_BEFORE_SENDALL) 被选择得足够长(约 4 个月),以便给开发者时间来对此更改做出反应并准备他们的应用程序。

向后兼容性

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

很少有应用程序受到此更改的影响。 唯一中断的用途是在同一地址使用 CREATE2 重新创建合约的情况(在 SELFDESTRUCT 之后)。 唯一受到重大影响的应用程序(并且可以分析代码)能够切换到不同的模型,并且应该有充足的时间这样做。

安全注意事项

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

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

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

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