把"自毁"改名 SENDALL:EIP-4758 为什么想连根拔掉 SELFDESTRUCT 图 1
把"自毁"改名 SENDALL:EIP-4758 为什么想连根拔掉 SELFDESTRUCT · 图 1

以太坊上的合约操作码 SELFDESTRUCT 常被中文圈称作”自毁”,但自 2024 年坎昆升级之后,它已经不毁合约了(现状见 EIP-6780后合约还能自毁吗?)。在它退役之前,还有一份更激进的提案想把这条指令彻底改名换芯:EIP-4758,Deactivate SELFDESTRUCT,2022 年 2 月 3 日立项,作者名单上有 Guillaume Ballet、Vitalik Buterin 与 Dankrad Feist,现状态 Stagnant(停滞)。它给出的方案是把 SELFDESTRUCT 改名为 SENDALL,并把行为收窄成一件事:把账户里所有的以太转给目标地址,代码、存储、nonce 一概不动。

提案到底改了什么

按规范原文,三条:指令改名 SENDALL;执行时只把账户内的以太全部划转给目标,不再删除代码与存储,也不再改动 nonce;与 SELFDESTRUCT 相关的全部 Gas 退款一并移除。连带的工程判断也写得很硬——这需要一次硬分叉,因为它改的是共识规则。提案同时点名了两类会因此失效的用法:用自毁来销毁合约内非以太代币余额的做法(作者认为现实中找不到用例,毕竟发到黑洞地址同样能烧);用 CREATE2 在原地址反复重建合约的做法,无论是”用完即毁防止他人动用”的场景锁,还是靠摧毁旧合约换上新代码的可升级模式,都得改写成委托(delegate)结构。

把"自毁"改名 SENDALL:EIP-4758 为什么想连根拔掉 SELFDESTRUCT 图 2
把”自毁”改名 SENDALL:EIP-4758 为什么想连根拔掉 SELFDESTRUCT · 图 2

为什么为了一条指令要大动干戈

动机不在指令本身,而在以太坊的路线图。提案正文的理由:Verkle 树形态下,一个账户的状态会被拆存到许多互不显式关联的存储键里,“把账户整个删干净”从此是个昂贵且不明确的操作;无状态客户端路线更是要求废除这种牵一发动全局的语义。SENDALL 的设计取向很典型——保住”把钱全部转走”这个仍然被应用依赖的行为,砍掉”把状态从世界里抹除”这个难以延续的行为。这也解释了退款为什么顺手被删:SELFDESTRUCT 的退款本来就是补偿清理存储的,行为取消后退款失去对应物。

它与实际落地的 EIP-6780 差在哪

真正随坎昆生效的是 EIP-6780:保留 SELFDESTRUCT 这个名字与操作码,但除非在合约创建的同一笔交易里调用,否则不再删除合约,只转走以太。对比之下,4758 走得更远:改名、删除全部相关退款、语义一步到位。两条路线殊途同归于”合约不再真的毁”,分歧在节奏与兼容:6780 允许创世以来的历史合约语义在同一操作码名下自然衰减,而退款规模早已在 2021 年被 EIP-3529 砍到五分之一(见 清存储还能退 Gas 吗?EIP-3529 把退款上限砍到五分之一),Gas 退款的整体机制可另见 Gas 退款是怎么回事?销毁的燃料还能还回来。4758 停滞并不奇怪——最坏的那部分语义已经被 6780 拆掉引信,剩下的改名与清算成了不紧急的收尾。

钱包与交易所视角的阅读法

这次语义演进的实用收获是一条阅读纪律:把链上”自毁”字样当转账来理解。一笔带 SELFDESTRUCT 调用的交易,效果是合约余额外流;它既可能把钱送给某个外部地址,也可能送给另一份合约——送给合约时,若接收方没有对应的入账逻辑,这批以太会停在原地失去可用钥匙。审计旧合约时,“地址上还有代码”早已不是”它没有动过资产”的证据,代码存续与资金流动自 2024 年起是两件解耦的事。更晚的提案想把残留在自毁路径上的最后一环——以太本身的去向——也重新定义,那是另一篇文章的话题。

停滞提案的读法

Stagnant 在以太坊的流程定义里意味着作者长期未推进、也未正式撤回。对研究者,这类提案的价值在于它把”路线图上的约束”写成了白纸黑字:Verkle 树与无状态化对账户语义的要求,在 4758 的动机一节里有最直接的表述。把它当作现状来读会出错(今天 SELFDESTRUCT 仍在,退款为零),把它当作一段被压缩的路线图注释来读,恰好及格。

风险提示:本文为以太坊改进提案机制科普,不构成投资建议;操作码语义随升级变化,涉及合约资产判断请以现网数据与当期规范为准。