以太坊虚拟机的暂存空间分好几层:合约存储是永久账本,内存是函数调用期间的一维胶带,而 2024 年 3 月随 Dencun 升级进入主网的瞬态存储(transient storage,规范里由 TLOAD 与 TSTORE 一对操作码读写)是一笔交易期间临时的键值格子——交易一结束全部清空,不留状态。EIP-7971 在 2025 年 6 月给这套机制提出两块改动:把读写计价从现行的 100 Gas 暖访问价降到固定低价,同时给每笔交易能占用的瞬态槽位数量设一个协议层硬上限。它目前是草案(Draft),未进入任何已激活升级。
瞬态存储填的是哪一格
在瞬态存储出现之前,合约想在一次交易里暂存中间值,要么花钱写永久存储——即使随后马上改回去,状态树也被翻动过——要么把值编进内存偏移自己管理。瞬态存储给了第三个选择:按 32 字节键寻址的临时平面,生命周期恰好等于一笔交易。重入保护是提案点名最多的用例:现在的定价(每次读写 100 Gas,与暖存储访问同价)让”每个函数默认加一道瞬态锁”在 Gas 上不够划算,语言层因此迟迟不敢全面推广这种模式,把一类经典攻击面留给了开发者自觉。
没有闸门的代价
降价之后的风险藏在键空间里。瞬态存储的键理论上覆盖全范围:一笔交易愿意的话,可以为海量不同的键各写一个格子。规范要求客户端为被写过的键维持状态直到交易结束,如果实现选择”碰到一个键分配一个槽”,攻击者用不多的 Gas 就能迫使节点为百万级临时键分配内存——Gas 收费与实际内存开销脱钩,这正是拒绝服务的标准形状:攻击者花小钱,全网付大钱。EIP-7971 的解法是把上限写进协议:单笔交易最多占用 131072 个瞬态槽位(提案参数表里的 MAX_TRANSIENT_SLOTS),超限的处理由规范定死,客户端由此可以预留有界结构,内存占用在交易开始前就能算出来。
低价与闸门是一对
提案给出的价目表是:TLOAD 5 Gas、TSTORE 12 Gas,新分配一个槽再加 24 Gas(GAS_TSTORE_ALLOCATE)。三条数合起来的逻辑:常用场景(少数几个格子反复读写)变得几乎免费,鼓励重入锁默认化;首次分配的加价与总闸门则保证”铺格子”这条路既贵又有顶。低价是胡萝卜,闸门是天花板,缺一个都不成立——只降价不设限等于放大拒绝服务面,只设限不降价则回到了今天的谨慎原点。
一笔重入锁的算术
把抽象的数字放到一次真实调用里。假设一个转账函数默认加两道瞬态检查:进门写一次锁、出门清一次锁,再加一次读取校验。今天的价格体系下,每次读写 100 Gas,三下就是 300 Gas 的固定税,摊在小额转账上肉眼可见;按提案的 5、12、首次分配 24,同样三下折进首次分配的总账不过数十 Gas 量级,对多数交易接近噪声。税被拆掉之后,语言与框架才愿意把默认锁从「推荐」升格为「内置」——提案真正想推动的是这种生态位的迁移,而不是让某几个合约省钱。反方向的风险也对称:对攻击者,旧定价下铺满 131072 个格子要一亿三千万 Gas,贵得没人干;新定价加上限后,铺满同样的格子成本骤降,客户端的内存上界从「理论有界」变成「设计必查项」——这正是闸门与降价必须同车的原因。
快速问答
问:瞬态存储和内存有什么区别? 答:内存按字节线性寻址、按扩展大小收费、随调用帧结束消失;瞬态存储按 32 字节键值对寻址,活到整笔交易结束,跨内部调用可见。
问:这份提案上线了吗? 答:截至写作时 EIP-7971 是草案;已激活的只有 EIP-1153 定义的瞬态存储本身(Dencun,2024 年 3 月),现行定价仍是读写各 100 Gas。
问:131072 个槽位是什么概念? 答:它是提案参数表的当前取值;按最坏情况每个槽 32 字节计,对应约四兆字节的瞬时内存上界,具体实现表示法由客户端自定。
风险提示:本文介绍协议提案与虚拟机机制,不构成任何投资建议;Gas 参数与限额以当期提案文本和客户端文档为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。