一块钱找零的烦恼换个说法
EVM 的 gas 账本有一个隐形的地板:最小记账单位就是 1,没有半格。纯计算类指令,加法、减法、异或这些,这些年因为客户端优化和硬件进步变得极其便宜,按真实耗时折算,它们早该标上不到 1 的价格;可整数账本做不到,最便宜的指令也要收满 1 gas。EIP-8053 的动机文本把这称为舍入误差问题:该收零头的时候只能收整数,区块里塞得下的便宜运算数量就被虚高的单价压住了。文本给了一组测算:若把纯计算指令按更快的执行速度重定价、又不引入小数,取每秒 5000 万 gas 的锚定时,平均每个操作码有接近六成的费用是向上取整撑出来的——相当于这些运算一直在为账本的粗糙付溢价。
为什么不干脆整体翻一千倍
一个直觉方案是宣布所有 gas 数字乘以 1000,便宜运算就能标整数零头。提案文本算了另一笔账:整体重标会让状态操作、交易限额、区块限额所有数字同步膨胀一千倍,用户端看到的每格价格含义整个换掉,这叫扰动用户直觉,钱包界面、费率单位、历史数据的解读全要跟着动。这份 EIP 的思路是只换内部账本、不换对外口径:给 EVM 内部新增一个以千分之一 gas 为最小单位的计数器,执行期间的记账全部走新账本,便宜运算由此可以标 0.09 gas 这样的价格;交易执行完毕时,内部数字向上取整折算回现行 gas 单位,交易费、Gas 限额、区块限额的校验照旧按旧单位进行。用户、市场和费用市场看到的 world 一个字都不用变。落地细节上,既有操作码的定价参数整体乘以 1000 平移进新刻度,GAS 指令向合约返回的余额也按新刻度报告——这正是兼容性风险的来源。
旧字节代码里的暗礁
向后兼容部分写了这份提案最尖锐的一句话:已经部署的字节码里,如果有逻辑拿剩余 gas 和常数比较,或者用显式限额做子调用,升级之后它们会突然只收到千分之一的燃料,触发意料之外的回滚或逻辑翻转。提案承认对这类代码的分布情况还需要更多分析。它选择沿用历史上类似改动的路径——作为需要排期的网络升级上线,同时把取整推迟到交易末尾,测算显示这样每笔交易的舍入误差能从平均约百分之四压到万分之五。
这份 EIP 在官方仓库标注为 Draft,作者是 Maria Silva,思路承自早年一份未被采纳的浮点 gas 提案。对普通用户的意义是认知层面的:gas 不是自然常数,而是一个有人设计、有人权衡的计量体系,刻度本身的精度都已经是研究课题。
风险提示:本文为Gas计量机制的技术介绍,不构成投资建议,不构成对Gas费水平的预测。链上费用以实际网络状态为准。
一个看剩余燃料的合约会发生什么
把兼容风险落到一行代码上最直观。假设某段已部署的字节码里有这样一段保险丝:if(gasleft() < 5000) revert,意图是燃料不足五千时主动放弃。升级生效后,gasleft() 汇报的是千分之一刻度的数字,五千这个阈值对应的真实燃料瞬间缩小一千倍,保险丝在离终点很远时就熔断。显式限额的子调用有同样的问题:向子调用转拨固定数字时,这个数字在新刻度下只剩千分之一的实际功率。这就是为什么提案强调需要排期的网络升级、并把已部署代码的分布调查列为待办。另一个设计细节也值得留意:交易结束时向上取整,意味着实际用量永远略多于账面,误差被系统性地推给对网络更保守的一侧——定价史上把不确定留给自己的一方,通常才走得稳。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。