给瞬态存储降价:EIP-7609为什么想用非线性公式管住TSTORE 图 1
给瞬态存储降价:EIP-7609为什么想用非线性公式管住TSTORE · 图 1

以太坊在坎昆升级引入瞬态存储:一块只在当前交易内存在的键值区,交易一结束就蒸发。它的操作码TLOAD和TSTORE定价沿用暖存储的100 Gas——不是因为它值这个价,而是因为拍板的时候没人有把握定得更准。EIP-7609试图回答这个遗留问题,主张把固定单价换成随用量增长的非线性曲线,常见调用便宜下来,滥用场景照旧昂贵。这条提案目前停在停滞状态,但它触碰的问题很有代表性:一个操作真实成本几乎为零时,价格该怎么定。

当年为什么定成同价

瞬态存储和持久存储共享同一套寻址直觉:都是按键读写的字数组。但两者的资源账完全不同。持久存储写入会改变世界状态、需要节点长期保存、还会让默克尔trie膨胀;瞬态存储只是一块随交易生灭的临时缓冲,执行结束就能整体丢弃。坎昆开发阶段把两者定价拉平,规格文档给的理由是两点:简单,以及堵住两个拒绝服务风险——写太多瞬态槽位会耗尽内存、循环里读写会被用来逃避某些 gas 优化。同价是最省争论的选择,代价是日常使用被按最坏场景收费。

非线性定价想修什么

EIP-7609的动机段把问题挑明:同一定价让常见场景的TSTORE比合理价格贵出一截,而滥用者其实并不特别心疼这100 Gas,他们有的是更省的办法把槽位写满。换句话说,固定高价惩罚了正常用户,却没有按比例惩罚恶意用户。提案提出的替代是一条总成本曲线:随着一笔交易触碰的瞬态槽位数量增加,单位成本随之上升,形成先低后陡的形状。低频读写的合约因此得到实惠——很多重入锁、跨调用传参的用例只碰几个槽;而在同一个交易里疯狂扩展瞬态空间的写法则按累进的价格付账,拒绝服务动机被曲线尾端吃掉。

这是一种在EVM定价里并不常见的手法。操作码费用通常是一个常数或线性函数,累进曲线要额外定义分段边界与累加方式,实现和测试成本都高。这也可能是提案停在停滞的原因之一:方向合理,但公式里每个常数都需要大量校准数据支撑,而主网上瞬态存储的使用模式还在形成期。

快速问答

问:瞬态存储和调用帧内的局部变量有什么区别? 答:局部变量随调用帧结束消失;瞬态存储在同一整笔交易期间对所有调用帧可见,交易结束才清除。跨合约传值不用打包进参数,是它主要的应用场景。

问:如果这条提案通过,我的合约会自动变便宜吗? 答:只有把TSTORE用在低频场景的合约受益。若某个函数在一个循环里写大量瞬态槽位,累进曲线可能让它比现在更贵。

问:怎么确认EIP-7609是否有效? 答:查官网页面状态;本批核查时它标记为停滞,意味着六个月以上无人推进。

一次读写的生命周期

把TSTORE放进时间轴更直观:交易开始前这块空间不存在;执行途中每次写入更新内存里的一张键值表;调用帧结束它原封不动,这正是与局部变量的分野;交易结束整体清零,下一笔交易从头开始。它既不会改变世界状态根,也不产生退款,更不影响其他交易的视图。瞬态存储从设计到定价都贯彻一条原则:对链上其他所有人,它像没发生过。

一笔对照账

假设一条曲线前六个槽位每个10 Gas、之后每个涨到100 Gas:一个只写两个槽的重入锁省下180 Gas;一个在循环里写一万个槽的滥用者反而多付近万 Gas。这就是累进定价与普通降价的分野——降价是把所有人调低,累进是把成本按真实危害重新分配。

风险提示:本文内容为协议机制科普,不构成任何投资建议;参数与提案状态可能变化,请以官方规格为准。