剩余 Gas 低于 2300 就禁写存储:EIP-1706 为什么被作者自己撤回 图 1
剩余 Gas 低于 2300 就禁写存储:EIP-1706 为什么被作者自己撤回 · 图 1

一份带着撤回理由入场的提案

EIPs 仓库里有些文件的结局写在脸上。EIP-1706 提交于 2019 年 1 月 15 日,状态 Withdrawn——撤回,withdrawal-reason 字段原文是”作者们更倾向 EIP-2200”。它想做的那件事其实只有一行规格:给 SSTORE(写存储的指令)加一道硬条件——如果当前剩余 Gas 不超过 2300,直接让这次调用以耗尽 Gas 的异常失败。提案作者认为这一条能保住当时合约生态里一个没人明说却人人依赖的安全假设,而最后他们自己选择了让位给另一条更精细的路线。要理解这场退场,得先回到 2018 年那次给所有人省钱的 Gas 账本改革。

剩余 Gas 低于 2300 就禁写存储:EIP-1706 为什么被作者自己撤回 图 2
剩余 Gas 低于 2300 就禁写存储:EIP-1706 为什么被作者自己撤回 · 图 2

一次优化怎么撬动一块旧盾牌

EIP-1283 引入净计费:同一笔执行里对同一个存储槽反复写入,按净变化而不是每次写动作计价,大幅降低了存储写操作的平均成本。问题出在防重入上。旧合约广泛用 Solidity 的 transfer 或 send 向外部地址转账,这两种调用给接收方的固定零花钱是 2300 Gas——这笔钱够记账、够发事件,但不够在回调里再做一次复杂的存储写入加转账。于是 2300 成了一堵隐形防火墙:恶意的收款合约拿不到多余的 Gas,翻不了天。1283 的净计费改变了账本性质——在某些价格结构下,2300 的零花钱余额里居然也能完成一次存储修改,旧假设的地基被抽掉了一块。安全研究者当时公开演示了新的重入打法,整个生态被提醒:原来防线的材料不是 2300 这个数本身,而是它和 Gas 价格表的耦合关系。对重入攻击本身的完整解释,可以参考 重入攻击是什么?智能合约如何被“先取钱后记账”掏空

1706 的答案:把耦合变成铁律

1706 的解题思路简单粗暴:与其指望大家重写合约,不如在协议层立一条铁律——剩余 Gas 低到 2300 及以下时,写存储这个动作直接判死。这样无论 Gas 价格表怎么改,2300 零花钱永远买不到存储修改的能力,旧合约的隐含防线就从”惯例”升级为”共识规则”。提案还逐条讨论了替代方案:废掉 1283(作者认为净计费本身是重要改进)、直接改 Solidity 编译器(救不了已部署合约)等。它是一类很典型的提案——不新增功能,只为把一个已经依赖多年的安全属性写死。

时间线:撤稿、回滚与一条更精细的路线

真实走向比提案本身更有教科书味。1706 提交五天后,1 月 21 日,作者以”作者们更倾向 EIP-2200”为由撤回。而 2200 的路也没走直线:1283 随君士坦丁堡升级本应在主网区块 7280000 上线,安全警报拉响后,社区用紧随其后的彼得堡升级把 1283 单独撤下——EIP-1716 元数据写的正是”从君士坦丁堡移除 EIP-1283”这件事。真正的回归发生在伊斯坦布尔升级,主网区块 9069000 起,以 2200 的形式重新引入净计费,并同步调整了存取价格,让 2300 零花钱环境下仍然做不了危险的存储修改。也就是说:1706 的硬线没有被采纳,社区选择了用价格结构本身维持同一个安全属性;1706 成了这份集体作业里被引用后划掉的那页草稿。

2300 今天还在哪里站岗

撤回不等于 2300 失效。今天它仍是转账触发接收合约回调时那笔固定零花钱的数字:钱包通过 transfer 语义转入时,接收端的 receive 或 fallback 函数大约只有 2300 Gas 可用,够写一笔日志事件,不够做复杂状态变更——这也是合约收款教程都建议回调函数保持极简的原因。要分清两条不同的五分之一:一条是 2300 零花钱这条保护线,另一条是 EIP-3529 把每笔交易的 Gas 退款上限压到实际用量的五分之一,两者都源自防重入与退款的攻防史,管的是完全不同的账。用户视角的要点是:向合约地址直接转 ETH 可能触发其接收逻辑,遇到把 receive 写得过重的旧合约,交易失败或卡住的排查方向就应该先看回调 Gas,而不是网络拥堵。

撤回状态的读法

Withdrawn 与 Stagnant 的差别值得刻进检索习惯:Stagnant 是讨论搁浅,Withdrawn 是有人明确画了句号,而且这份文件的句号还附赠了”去看 2200”的路标。读安全类历史提案时,先查状态字段,再顺着 requires 与取代关系找到真正生效的那份,比孤立读任何单份文本都更接近真相。Gas 价格与合约安全的耦合关系今天依然存在——每次升级重定价,理论上都可能移动某类合约的隐含假设,这正是这批 2019 年旧案留给下一代读者的共同提醒。

风险提示

本文涉及的提案状态、分叉区块与机制描述按 EIPs 官方仓库原文核验,具体升级参数请以仓库当前内容与官方升级公告为准。理解 Gas 与重入的关系有助于识别合约风险,但不构成投资建议;与合约交互前请核实项目审计与来源。