让自毁越用越贵而不是哪天禁用:EIP-4760 的 SELFDESTRUCT 定时炸弹 图 1
让自毁越用越贵而不是哪天禁用:EIP-4760 的 SELFDESTRUCT 定时炸弹 · 图 1

提案在纠结什么

合约自毁指令(操作码原名 SUICIDE、后改名 SELFDESTRUCT)干两件事:把合约余额全转给指定目标,然后抹掉这个账户的代码与存储。第二件事在协议演进中越来越碍事:状态树要换成 Verkle 一类结构,账户数据会被打散到许多互不显式关联的键里,“找出并清空一个账户的全部存储”在成本与实现上都变得难以维持;更麻烦的是依赖自毁清状态的合约,在状态迁移事故中是最疼的一类资产。直接在下一次升级禁用行不行?历史上”哪天起功能消失”的硬截止,最受害者往往是从不读升级公告的存量合约用户。EIP-4760(2022 年 2 月创建,状态 Stagnant)因此选了第三条路:让它越来越贵,直到贵出协议。

规则里的三个常量

提案规范给出了一个可算术的节奏:SELFDESTRUCT 当时的成本 5000 Gas,设翻倍周期 DOUBLING_SLOTS 为 2 的 16 次方个信标槽(提案注记约九天),再设 DOUBLINGS_BEFORE_SENDALL 为 13。从上海硬分叉块(提案撰写时高度待定)起,每经过一个翻倍周期成本乘二;到第 13 次翻倍用完的时点,指令正式改名为 SENDALL,价格回落到 5000 Gas,但语义收缩为”只把账户里的 ETH 立刻转给目标”,不再删除代码与存储。把时间摊开:13 个约九天的周期总计约四个月——提案动机段落的原话就是这个窗口要”长到足以让开发者对变化作出反应并改造应用”。

为什么涨价曲线比公告更负责

这类设计的精妙处在于它不信任”开发者会读文档”这个假设,而是假设开发者只对自己的成本曲线敏感。第一个翻倍周期内行为与价格都还在原位,等于给所有人一个近乎免费的告别窗口;第一次翻倍起,还在用自毁做资源清理的合约会在账单一格一格变贵中被自己的后台监控发现;四个月走完曲线时,只有从头到尾没动过的合约才会发现语义已经换掉——而那已经是十几次账单提醒之后。曲线把一个本来只在协议邮件列表里讨论的变更,转译成每个运维面板都会看见的异常费用,等于把治理公告的成本分摊给了合约自己的 Gas 账单。

它没有落地,但方向留在了空气里

这条提案停在 Stagnant。后续路线里,自毁语义的处置被拆进不同方案的博弈——坎昆升级里它已被大幅削弱(只有同一笔交易内创建的合约才真正销毁),此后还有多条提案在推进彻底收尾,各自进度请以当期规范为准。EIP-4760 的独特遗产是那条”指数涨价倒计时”本身:任何要劝退存量行为的协议设计(旧操作码、旧地址格式、旧网络参数)都可以抄这个作业——不设截止日,设一张每个人都会在某个深夜自己发现的、越来越贵的账单。

一笔直觉账

从 5000 Gas 起步,第 n 次翻倍的单价是 5000 乘以 2 的 n 次方。到第 10 次翻倍约 514 万 Gas,已经比一笔普通转账贵两个数量级;第 13 次翻倍约 4100 万 Gas,一个区块的容量都未必装得下几次调用。价格到第几年会疼,取决于你怎么数:把”能疼醒人”的档位标出来,第 4 到第 6 次翻倍(约 8 万至 32 万 Gas)已经足够让任何认真跑合约的团队警觉——也就是说曲线的前半段就决定了绝大多数人迁移,后半段只是给最迟钝的角落留的。

快速问答

问:改名为 SENDALL 会改变链上已有字节码吗? 答:不会。链上字节码里的操作码编号不变,变的是编号绑定的语义与价格。

问:翻倍周期为什么用”槽”而不是块? 答:提案按信标链槽计数,与出块节奏绑定;换算成大约九天一个周期只是方便理解,精确值以规范为准。

问:为什么要把涨价窗口设计成几个月而不是几天? 答:提案原话是要给开发者留出反应和改造应用的时长;曲线太陡等于公告式硬截止,违背设计初衷。

问:现在合约还能自毁吗? 答:指令还在,但现行主网对它的处置(自 2024 年坎昆起)已远严格于本提案时代,调用前的实际后果务必按当期规范核验。

风险提示:本文只做协议机制说明,不构成任何投资建议。