账本变厚之后,读账要加价:EIP-1884 的三条涨价令 图 1
账本变厚之后,读账要加价:EIP-1884 的三条涨价令 · 图 1

价格与资源之间的裂缝

以太坊的 Gas 价目表本质上是一份资源兑换汇率:每条操作码收多少 Gas,应尽量对得上节点处理它消耗的算力与磁盘。裂缝出现在依赖状态体积的操作上。SLOAD 读一次存储槽、BALANCE 查一次账户余额、EXTCODEHASH 取一次合约代码哈希——状态树小的时候这些操作近似查内存,状态树长到几十吉字节之后,同样的操作意味着真正的磁盘寻址与默克尔证明计算。操作还是那条操作,成本悄悄翻了几番,价格却停在好几年前。

EIP-1884 的作者 Martin Holst Swende 用 Geth 全量同步数据画了证据:把每万个块的各操作码执行时间汇总,5M 到 7M 块区间里 SLOAD 的累计耗时一路爬到榜首附近,比 EIP-150 那次涨价之前还高出一倍上下。存储读取与账户读取两项合计,占了块处理总时间的头两把交椅。价格不动,攻击者就能用低价高耗的操作填满区块,正常用户则看到块耗时忽长忽短。

三条涨价与一个新产品

2019 年随伊斯坦布尔分叉落地的方案很克制。SLOAD 从二百提到八百,涨四倍;BALANCE 从四百升到七百;EXTCODEHASH 同样升到七百。三个操作码有个共同标签:成本随 trie 大小走,提案标题 trie-size-dependent 说的就是它们。同批还发了一个新操作码 SELFBALANCE,编码位零四七,只查当前合约自己的余额,五日定价。理由直击要害:绝大多数查余额的场景根本不需要跨账户查找,与其让所有人都掏七百查全局状态,不如给自家余额开一条快车道。

涨价改变的是行为曲线

价格翻四倍不等于所有合约成本翻四倍。对偶尔读一次存储的转账逻辑,八百 Gas 淹没在总开销里;真正被重塑的是循环里密集读状态的代码——老式合约里靠 SLOAD 空转耗块、把状态读取当免费午餐的模式,从此在费用曲线上原形毕露。项目方后续的直觉规则也随之成形:能用局部变量缓存就不要反复读存储;查自己余额用 SELFBALANCE 而不是 CALLDATALOAD 绕路调 BALANCE;访问列表类结构在柏林分叉后又给热点地址补了第二刀。回头看,EIP-1884 与后来的 EIP-2929 冷热价格体系是同一条思路的两步棋——先按状态体积补大账,再按访问冷热细分。

为什么偏偏是这三个

提案挑中 SLOAD、BALANCE、EXTCODEHASH,用词很精确:它们的成本随状态树大小走。对比之下,加法、哈希这类操作码的执行时间几乎恒定,定价无需随网络年龄变动;调用转账类操作码的成本另有模型。一条操作码该不该重定价,看它的账单是否随全网历史数据变厚而悄悄变贵——这个判例后来被反复援引,几乎每次 Gas 讨论都会重演一遍同样的筛查逻辑。

快速问答

问:这次涨价影响历史交易吗? 答:不影响。价格规则只对激活块之后的执行生效,历史块重放仍按当年价目表计算。

问:SLOAD 涨四倍后,普通用户的手续费会涨四倍吗? 答:不会按操作码线性放大。受影响的是存储密集型调用,普通转账与简单交互在整笔费用里占比很小。

问:怎么判断自己的合约受这次涨价影响大不大? 答:把函数放进测试网跑一遍并留痕操作码计数,凡是热路径里出现循环内存储读取的,都值得重写为读取一次、缓存复用的写法。

一条直觉线

把世界状态想成一座持续扩建的图书馆:早期在门口小书架取书,跟取内存差不多;书楼盖到几十层后,每次取书都是真实的上楼翻找。EIP-1884 做的就是把取书费改成按楼层收,顺便给自带随身书架的读者(SELFBALANCE)免了上楼这一步。定价追资源,是虚拟机长期保鲜的日常手术。

风险提示:本文介绍协议与 Gas 机制,不构成投资建议;估算交易成本请以当前网络实际 Gas 参数为准。