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
的应用将被破坏,并且以这种方式使用它的应用程序不再安全:
- 任何使用
SELFDESTRUCT
来销毁合约内的非 ETH 代币余额(例如 ERC20)的情况。 我们不知道有任何此类用途(因为它可以很容易地通过发送到销毁地址来完成,这似乎不太可能使用SELFDESTRUCT
) - 在使用
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.