2300 的保底燃料够代理合约用吗:EIP-1285 的加高提案 图 1
2300 的保底燃料够代理合约用吗:EIP-1285 的加高提案 · 图 1

以太坊的燃料体系里藏着一笔不起眼的零钱:带金额转账调用一个合约时,如果收币方没有收款代码或调用落进 fallback,协议会强行塞给它两千三百 Gas,哪怕发送方给的燃料预算已经见底。这笔钱叫 call stipend。EIP-1285 想把它的数额加高:2018 年 8 月 1 日起草,状态 Stagnant,提案只有一行参数——Gcallstipend 从 2,300 提到 3,500。篇幅极短,牵动的却是以太坊安全设计里最微妙的一处平衡。

保底的来处与它的刻度

先要弄懂两千三百这个怪数字:它不是估出来的,是围绕’一条 LOG 日志指令加基础开销’这类最便宜的有用行为校准出来的——提案的原话是这笔钱’刻意很小,以防止被调合约花掉调用方的燃料或发动重入这类攻击’,同时’应当足够跑几个廉价操作码’,但’对平均一次 LOG 操作来说是严重的限制’。换句话说,定价者当年画的是这样的线:让收币方有能力记一笔’谁转给了我多少钱’,没有能力做任何可能伤害调用方的事。零钱的功能定位就是记账凭证,不是启动资金。

为什么2018年有人受不了了

三年里链上的收款方画像变了。钱包合约和代理模式大普及:用户的钱打进一个智能账户,钱要能自动分发、记账、触发逻辑,光记一条日志不够。提案的抱怨集中在这里——fallback 该有’更现代、更复杂的逻辑’的空间,而两三 K 的零头逼着所有实现挤在记账线以下。加到 3,500 的数额也不讲究工程推导,就是给一次中等容量的日志和几个存储读留的余量,提案坦承这需要不向后兼容的改动,因为老合约里恰好卡在两千多 Gas 的分支会变行为。

为什么它停在草稿

零头之争的反对意见同样有传统。第一,抬高保底等于抬高每一次跨合约转账的最坏情况开销:调用方付的 Gas 里有一部分可能凭空烧进对方不受控的代码,重入攻击的最短路径也随之变长——安全模型里’2300 内做不了坏事’是一条被研究透的假设,改动它要求所有人重新证明一次。第二,历史给了偏好示范:2017 年 10 月的 Tangerine Whistle 分叉以 EIP-150 重画调用族的燃料传递规则(63/64 转发从此成为结构件),面对调用语义的麻烦,社区惯于修结构而不是调零钱数额。第三,也是最现实的:代理合约的记账诉求最后被更好的抽象接住了——ERC-223 让代币主动通知收款合约,ERC-777 与后来的 ERC-4337 干脆把收款逻辑抬到账户层。需求被改道,加高预算就无人再提。

一笔对照账

把两版提案放一起看刻度会更有趣:同期的 EIP-1706 走的是相反方向——在燃料低于 2300 时禁止写存储,让这笔保底钱只能用于记账;EIP-1285 则想把零钱本身加高。一个要收紧零钱的花法,一个要加发零钱,两条路殊途同源地承认了同一件事:两千三是整个虚拟机安全推理的一个支点。支点之所以没人敢碰,正因为它撑着上面全部的调用重量。

零头之外的另一笔账

还有一个常被忽略的维度:保底数字是公开常数,攻击合约会精确校准自己的代码长度来贴着它生长。历史上对 2300 的各种微攻击与微规避研究不断,等于社区围绕这个数字做了一轮轮压力测试——提案加高零钱的诉求,一半来自功能,一半来自’旧刻度已被太多人研究透’的疲劳感。安全预算的刻度与攻击研究的注意力是同一枚硬币的两面,这也是这类参数多年无人再动的隐性原因:每挪一格,全部推理都要重跑一遍。

快速问答

问:这笔保底钱平时感觉得到吗? 答:只有在向合约转账、且预算压得极紧的时刻才轮到它出场;日常转账里调用方给的燃料通常远超它,保底形同保险丝。

问:现在的代理合约不是早就在跑复杂 fallback 了吗? 答:那靠的是调用方在交易里正常给足燃料——保底只在预算烧尽的兜底场景生效,与提案想解的是同一个问题的两个场景。

风险提示:本文为协议机制科普,不构成任何投资建议;参数数值与提案状态以 EIP 仓库当期文本为准。