news 2026/9/16 13:19:33

EIP-8246 深度解析:从 EVM 中彻底移除 SELFDESTRUCT 的 ETH 销毁语义

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EIP-8246 深度解析:从 EVM 中彻底移除 SELFDESTRUCT 的 ETH 销毁语义

EIP-8246 深度解析:从 EVM 中彻底移除 SELFDESTRUCT 的 ETH 销毁语义

【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs

导读

本文以以太坊改进提案 EIP-8246(Remove SELFDESTRUCT Burn) 为唯一主题,全面拆解该提案如何在 EIP-6780 的基础上,清除SELFDESTRUCT指令残存的最后一类 ETH 销毁路径,使 ETH 不再存在任何离开总供应量的 EVM 机制。读完本文,你将理解同交易内自销毁(selfdestruct-to-self)与交易终结时余额保留的精确状态变更规则、主网回放数据支撑的动机论证、完整的规范与测试矩阵,以及CREATE2重部署、空账户清理(EIP-161)与地址碰撞(EIP-684)等周边共识规则之间的相互作用。

提案背景:SELFDESTRUCT 的两次语义收缩

SELFDESTRUCT(操作码0xff)是 EVM 中历史最悠久、语义最重的指令之一。它一次性地执行"转走全部余额 + 清除代码与存储 + 重置 nonce + 删除账户"的复合操作,因此也是 EVM 实现、共识规范和测试套件中长期需要特判处理的来源。

该指令的收敛经历了三个阶段,EIP-8246 正是这条演进路径的终点:

  1. EIP-6049(弃用声明):在 eip-6049.md 中,社区正式弃用该操作码,明确警告其行为可能在未来发生破坏性变更,任何新部署合约都强烈不建议使用。
  2. EIP-6780(同交易限定):eip-6780.md(Final)规定:只有当合约在创建它的同一笔交易内执行SELFDESTRUCT时,才保留"删除账户"的旧行为;其他情况下指令只负责把余额转给受益人,不再删除任何数据。同时,由于 EIP-3529 已移除SELFDESTRUCT的 gas 返还,EIP-2929 则规定受益人不在accessed_addresses集合中时需额外收取COLD_ACCOUNT_ACCESS_COST,其冷/热地址计价规则保持适用。
  3. EIP-8246(移除销毁):即本文主角。它把 EIP-6780 残留的"同交易创建 + 自销毁"场景下的 ETH 销毁行为一并移除,让SELFDESTRUCT从此不再销毁任何 ETH。

动机:残留销毁行为几乎无人使用,却持续带来特判成本

EIP-6780 落地后,ETH 仍能被销毁的场景被压缩到极窄的两类,且都要求合约在创建它的同一笔交易内执行SELFDESTRUCT

  • 受益人就是执行账户自身(selfdestruct-to-self,自销毁);
  • 合约执行SELFDESTRUCT后,在同一笔交易内又通过CALL(或再次SELFDESTRUCT,可多次)收到额外 ETH,在交易终结时这部分余额被销毁。

提案作者给出的主网全量回放数据极具说服力(来源:eip-8246.md):

区间自销毁/销毁事件数
创世 ~ 约 25M 区块(全量回放)通过同交易路径的销毁仅2 次(Cancun 之后),交易终结时销毁余额0 次
Cancun(EIP-6780 生效)之前的历史自销毁合计54 次

也就是说,这次要移除的残留行为,比 EIP-6780 已经移除的行为还要罕见。既然连"部分移除"都只影响了极少数交易,这里提出的"完整移除"所影响的交易只会更少。与此同时,保留这一残存特例却迫使 EVM 实现、规范和测试持续为其维护特殊分支,EIP-8246 主张直接从源头删掉它。

一个具有象征意义的推论随之而来:ETH 从此失去最后一个可离开总供应量的 EVM 机制——销毁只可能发生在协议层以外的场景(如地址误用),EVM 内不再有"烧币"指令。

规范:余额保留 + 状态清空的两段式设计

EIP-8246 对SELFDESTRUCT的行为修改精确分为两条:

1. 同交易自销毁不再销毁余额。SELFDESTRUCT在合约创建的同笔交易内执行,且受益人地址就是执行账户自身时,该账户的余额保持不变。

2. 交易终结时,被标记自销毁的账户不再被删除,而是被改写为:

  1. nonce 重置为 0;
  2. 余额保持不变
  3. 代码被清除;
  4. 全部存储被清除。

两条关键注释约束了边界:

  • 其余行为一律不变:所有未被本条覆盖的SELFDESTRUCT行为(如受益人转账、gas 规则、EIP-2929 的冷地址附加费)维持现状。
  • 空账户自动回收:若改写后余额恰好为 0,则该账户符合 EIP-161 定义的empty条件(无代码、零 nonce、零余额),会在交易终结时被从状态中删除。

与 EIP-161 空账户规则的衔接

理解第二条必须回到 eip-161.md(Spurious Dragon 硬分叉,随 eip-607.md 引入)。该提案确立了三条核心不变量:

  • 空账户(无代码、零 nonce、零余额)被视为deadCALL向其转账不再收取 25000 gas 的新建账户费用;
  • 任何操作不得将账户从"不存在"变更为"存在但为空";
  • 交易结束时,所有被touched且为空的账户必须被删除

EIP-8246 的终结时改写流程正是设计为与这套规则无缝协作:被改写后余额为零的账户是"空"的,由 EIP-161 的既有机制回收,不需要新增删除逻辑;余额非零的账户则作为"仅余额账户(balance-only account)"保留下来。

设计理由:在源头移除销毁,而非四处打补丁

EIP-8246 的设计哲学是在行为源头移除销毁,而不是在交易终结时对"销毁"这个结果再做一层专门处理。具体到 Rationale(eip-8246.md):

  • 保留状态清空效果:对同交易创建的合约,SELFDESTRUCT仍然执行"清代码、清存储、重置 nonce"的效果,账户最多以"仅余额"形态存活。这让"ETH 凭空从状态中消失"的特例被消除,同时账户在交易终结后依然不可执行。
  • nonce 归零保证 CREATE2 可用:重置 nonce 为 0,确保未来在相同地址执行CREATE2不会被一个"仅余额账户"挡住。
  • 克制的最小变更:曾考虑过"完整保留账户(含 nonce、代码、存储)"的替代方案——它同样能消除销毁,但等于对整个SELFDESTRUCT进行"缴械",语义变更幅度过大。EIP-8246 只移除销毁行为,不触碰其余语义。

向后兼容性:硬分叉级变更与生态影响

由于修改的是共识规则,本 EIP 需要一次硬分叉。兼容性影响在 eip-8246.md 中逐层展开:

对部署合约的影响

  • 过去,在同笔交易内创建后立即自销毁的合约,其余额(无论是自销毁时锁定,还是之后被CALL转入)会被销毁。本 EIP 生效后这两种情况都不再销毁 ETH。
  • 过去这类合约在交易终结时必定被删除;现在,终结余额为零的合约仍被删除,终结余额非零的合约则以"仅余额账户"(空代码、空存储、nonce 0)的形式留在状态中
  • 对"不在创建同笔交易内执行SELFDESTRUCT"的合约,行为与 EIP-6780 完全一致,不受影响。
  • 对由此产生的仅余额账户,后续交易仍可通过CREATE2在同一地址重新部署合约,相关使用模式保持可用。

L2 的专项风险:OP Stack 的 burn() 依赖

文档特别警告:部分 L2 链会定期依赖SELFDESTRUCT的销毁功能,需要单独的迁移方案

以 OP Stack 为例(eip-8246.md 中的详细描述):从 L2 提款至 L1 的 ETH 会累积在L2ToL1MessagePasser预部署合约(地址0x4200000000000000000000000000000000000016)中。该合约提供一个无需权限的burn()函数:它通过创建"构造函数内执行以自身为受益人的SELFDESTRUCT"的合约来销毁余额,从而防止 L2 ETH 供应量膨胀。任何继承该代码库的链(包括许多并不被普遍认为是 Optimism 系的项目)都会继承这一依赖,除非修改该预部署合约。值得注意的细节是:这类合约通过CREATE部署,因此它们留下的"仅余额账户"无法用上文所述的CREATE2模式重新创建。

测试矩阵:一个覆盖多维因子的完整用例集

EIP-8246 的 Test Cases 章节给出了结构化的测试策略,是理解行为边界的绝佳地图。

未修改行为:复用既有覆盖

SELFDESTRUCT历史上被多次修改,指令级的通用测试覆盖预期已经非常完善。因此只需将现有测试用例按新语义对齐,即可获得所有未修改特性的良好覆盖。

修改行为:因子组合矩阵

每个测试用例都应在物理上有意义的前提下,覆盖以下因子的组合:

因子取值
level顶层交易 / 内部调用
call typeCALL(含顶层交易)/ CREATE(含顶层交易)/ CREATE2
code stateinitcode 内(部署前)执行 / 已部署代码执行
statusSELFDESTRUCT成功 / 因 OOG 失败
revert效果提交到 post-state / 效果被回滚(仅包装型内部调用)
balance执行SELFDESTRUCT时账户余额为零 / 非零

指令级用例(1–4)

  1. 同交易自销毁到自身。
  2. 同交易自销毁到自身,随后再次自销毁到自身。
  3. 同交易自销毁到自身,随后自销毁到其他地址。
  4. 同交易自销毁到其他地址,随后自销毁到自身。

这组用例验证多次SELFDESTRUCT交错执行时余额与状态的一致性。

交易终结级用例(5–16)

聚焦"自销毁之后又被转入 ETH"这一销毁残留路径:

  1. 同交易自销毁到其他地址,随后向已自销毁账户CALL转账。
  2. 同交易自销毁到其他地址,随后多次CALL转账到已自销毁账户。
  3. 自销毁到其他地址 →CALL转账 → 再次自销毁到其他地址。
  4. 自销毁到其他地址 →CALL转账 → 自销毁到自身。
  5. 自销毁到自身 →CALL转账。
  6. 自销毁到自身 → 多次CALL转账。
  7. 自销毁到自身 →CALL转账 → 自销毁到其他地址。
  8. 自销毁到自身 →CALL转账 → 自销毁到自身。
  9. 创建新账户,新账户再创建其他账户以抬高自身 nonce,随后自销毁到自身。
  10. 创建新账户,新账户再创建其他账户以抬高自身 nonce,随后自销毁到其他地址。
  11. 创建新账户,新账户写入新存储,随后自销毁到自身。
  12. 创建新账户,新账户写入新存储,随后自销毁到其他地址。

用例 13–16 专门验证"非零 nonce / 非零存储"对终结时改写与空账户判定的影响。

多交易用例(17)

  1. Tx-1:CREATE2创建带非零余额的新账户,新账户自销毁到自身;Tx-2:重复 Tx-1。

该用例直接验证提案声称的"仅余额账户可被后续CREATE2重新部署"这一关键承诺。

安全考量:三大要点

EIP-8246 的 Security Considerations 指出:

  1. 组合爆炸式的测试负担SELFDESTRUCT行为修改对大量涉及多调用/多创建交互的测试场景产生组合影响,需要显著测试投入;好在大量 EIP-6780 的既有测试用例可以直接适配到新行为。
  2. 灰尘账户不是免费 DoS 向量:当某些用例依赖 ETH 销毁时,交易会留下"带有潜在锁定非零余额的灰尘账户"。但新建账户的 gas 成本由交易方承担,因此灰尘账户无法构成免费的 DoS 攻击。主网(Cancun 至约 25M 区块)迄今只记录到 2 次此类事件。
  3. 仅余额账户可被抢先接管:保留余额会产生一个"nonce、代码、存储均被清空但仍有钱"的账户,而该地址重新成为合法的CREATE2目标——因为根据 EIP-684,仅非零余额本身永远不会触发创建碰撞(eip-684.md 规定只有目标地址存在非零 nonce 或非零代码长度时创建才必须失败)。(sender, salt, initcode)是公开数据,因此当sender是无需权限的工厂合约时,任何人都可以重新部署该账户并取走保留的余额。

总结:EVM 烧币时代的终结

EIP-8246 是SELFDESTRUCT语义收敛之路的最后一步:EIP-6049 声明弃用,EIP-6780 限定同交易删除,EIP-8246 移除最后的销毁路径。它用一个克制的两段式设计(指令级"自销毁不再烧币" + 终结时"余额保留、其余清空"),在保持状态清理效果、兼容 EIP-161 空账户回收、保留 CREATE2 重部署能力的同时,彻底终结了 ETH 经由 EVM 离开总供应的历史。对于以太坊核心开发者,它是共识规范与执行客户端必须对齐的新语义;对于 L2 团队,OP Stack 的L2ToL1MessagePasser.burn()案例则是一份必须尽早规划的迁移警示。

本文所有规范、数据与用例均直接引用自仓库内的 eip-8246.md,相关依赖提案见 eip-6780.md、eip-161.md、eip-684.md、eip-6049.md、eip-3529.md 与 eip-2929.md,版权遵循 CC0 声明。

【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 13:15:44

一键唤醒鼠标侧键:Mac Mouse Fix 快速上手

一键唤醒鼠标侧键:Mac Mouse Fix 快速上手 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你那只几十块的鼠标,侧键在 M…

作者头像 李华
网站建设 2026/9/16 13:09:27

FPGA上实现CNN:Verilog手写卷积、定点量化与时序收敛

简介:本资源是一个基于Verilog语言实现的FPGA加速CNN卷积神经网络硬件设计项目,面向数字电路设计、嵌入式AI与FPGA加速学习者,尤其适合具备数字逻辑基础并希望深入理解深度学习硬件部署的中高级开发者。项目完整实现了CNN核心模块&#xff08…

作者头像 李华
网站建设 2026/9/16 13:09:24

裸机GPIO测试工具:寄存器直写验证引脚电气特性

简介:这是一份面向嵌入式开发初学者与硬件调试工程师的GPIO功能验证工具包,聚焦于通用输入输出接口的基础操作与状态检测,适用于Linux平台下的驱动开发、单板调试及IoT设备联调等场景。资源压缩包仅1KB,含2个核心源码文件&#xf…

作者头像 李华
网站建设 2026/9/16 13:07:24

基于Django+Vue的民宿管理系统架构与实现

1. 项目概述与技术架构解析这个民宿推荐与管理系统采用了前后端分离的现代化架构设计,后端基于PythonDjango框架实现业务逻辑,前端使用Vue.js构建用户界面,数据库选用MySQL进行数据存储。系统主要服务于两类用户群体:寻求住宿体验…

作者头像 李华
网站建设 2026/9/16 13:06:43

微信聊天记录导出完整指南:免费四步转出 HTML/CSV

微信聊天记录导出完整指南:免费四步转出 HTML/CSV 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg…

作者头像 李华