BURN操作码:EIP-7775把销毁原币变成一条指令 图 1
BURN操作码:EIP-7775把销毁原币变成一条指令 · 图 1

BURN操作码:EIP-7775把销毁原币变成一条指令

在以太坊上销毁原生币ETH,至今没有一条专用指令。最常见的做法是把币转给一个公认无法花费的地址,比如社区约定为黑洞的0x地址;协议自己的销毁逻辑则更多作用在ERC-20代币上,把代币转给零地址或调用代币合约的burn函数。原生币层面的销毁靠的是转移动作加地址不可用这两个间接条件。EIP-7775(2024年9月30日创建,提案文本状态为Stagnant)提议把这件事变成原语:给EVM加一条BURN操作码,直接从当前执行上下文的地址余额里扣掉指定数量的原生币,扣掉的币不再出现在任何账户里。

提案规定的行为规则

提案文本对语义写得非常具体。BURN从栈顶弹出一个三十二字节的字,当作要销毁的wei数量;取当前EVM上下文的地址;检查该地址余额。余额不足以支付销毁数量时,操作必须以revert失败;销毁数量为零时,明确规定不许revert——销毁零是一个合法的空操作,不该中断执行。检查通过后直接从余额中减去该数量,没有转账、没有接收方、没有转账事件。上下文规则同样逐条列出:在DELEGATECALL或CALLCODE语境里,被扣余额的是发起这条委托的合约,而不是执行指令代码所在的合约——委托语义下代码与存储、余额的归属本来就分离,销毁跟着余额走。STATICCALL语境里BURN必须revert,理由直白:静态调用承诺不修改状态,而销毁是对余额最直接的修改。

一百到两千九:Gas构成

计费结构是基础费用一百Gas,加一项动态费用。动态费用取值为三档:销毁量为零时动态费为零;账户不存在或余额为零时动态费也为零——这两种情况下没有真正发生余额变动;其余情况收两千八百Gas。所以一笔真实的销毁最少一百Gas、最多两千九百Gas。为什么要给一个不产生转账的动作收两千多Gas?因为扣余额要写状态、要更新账户节点、要进状态根哈希,成本结构与一笔转账的状态写入部分相当,只是省掉了目标端。与转账的另一个区别是它不触发接收方逻辑:转给合约地址可能触发fallback或receive并连带一串计算,BURN不给任何代码执行机会,销毁路径上的可组合性风险因此归零。

与转死地址的实质差别

第一,语义可判定。链上分析工具看到一笔向黑洞地址的转账,要靠地址列表推断意图;看到BURN,销毁就是指令本身的含义,不存在误读。第二,供应量的账更容易对。转账销毁的币仍躺在黑洞地址的余额里,只是不可花;BURN直接从总余额里抹掉,节点汇总全网总供应量的算术更直接。第三,审计边界收窄。转账方案依赖目标地址永远不可被破解这一外部假设,而BURN把假设消掉了。

快速问答

问:主网现在能销毁原生币吗? 答:合约层面没有任何指令能直接减少ETH总供应量。烧Gas是另一种机制——交易费被收取后按EIP-1559规则销毁,那是费用机制在结算,不是合约主动选择的销毁动作,两者别混为一谈。

问:为什么提案停在Stagnant? 答:主动销毁原生币动的是ETH供应模型这条敏感的线,社区顾虑多(谁有资格烧、会不会与质押经济学冲突),推进自然慢。状态以EIP仓库为准。

问:对代币合约有意义吗? 答:意义在于补全:ERC-20的burn早已是惯例,原生币却缺一块,补齐后同一套销毁语义可以跨资产讨论。

一条对照账

一次带数据转账的Gas常在三万到十万量级,BURN的上限不足其零头——销毁动作本身从费用结构看确实便宜。但Gas只是三个问题里最容易回答的那个:销毁地址是否真不可花费?烧毁量能否被链上数据直接读出?协议条款允不允许在目标地址上触发逻辑?转死地址方案在三个问题上各打七折,BURN三个都是满分语义,但前提是它能被激活。评估这类底层原语提案,先看它消除了哪个长期存在的假设,再看谁在依赖那个假设,往往能同时看懂提案价值与阻力来源。

风险提示:本文仅解释协议提案机制,不构成任何投资建议。EIP状态以官方仓库为准,提案不等于主网激活。