冷热状态跨交易生效:EIP-7863的区块级预热设想
以太坊的Gas定价里有一条隐形的时间规则:一条交易开始时,整个世界的状态都是冷的。EIP-2929为EVM引入冷热访问区分,账户与存储槽第一次被碰到按冷价(地址两千六百、槽两千一百Gas),之后的再访问按热价(一百Gas)。关键在于作用域——已访问集合是交易级的,每笔交易从空集开始。EIP-7863(2025年1月15日创建,提案文本状态为Draft)挑战的正是这个作用域:既然节点进程里那些刚被读过的状态本来就在缓存里,为什么出了交易的边界就要假装忘掉?它提议把冷热判定的作用域扩大到整个区块。
被重复支付的同一笔查找
设想一个热门区块:某个预言机合约的价格槽在这一千多笔交易里被读了几百次。按现行规则,每笔交易里的第一次读都按冷价两千一百Gas收,哪怕这笔交易紧跟着上一笔、节点读的还是同一份刚缓存过的数据。从全节点真实成本看,区块内第一次冷读之后,后续所有交易对同一位置的读取都不再产生磁盘查找。交易级作用域让这些并不存在的成本持续计入Gas账本,结果有两个:用户的Gas账单里含着一段为虚构的磁盘查找付的钱;区块容量被浪费——同样体积的Gas额度,用来装真实计算比用来装名义冷费更值。EIP-7863的修法朴素:在区块处理开头建两个区块级的已访问集合(地址与存储槽各一个),交易处理时把这两个集合并入交易预访问集,交易结束后把它更新的访问集再并回区块集。每个区块边界自然重置,不需要额外的失效逻辑。
谁受益、谁可能吃亏
直接受益的是高热合约的重度交互场景:热门时段的兑换、清算、铸造交易扎堆时,同一批槽被反复读写,区块级预热把每一次重复冷启动费收敛成整个区块一次。对普通孤立交易几乎无感——如果你的交易是本区块里第一个碰某个位置的,照样冷价。潜在代价在另外两侧:其一,执行层要为整个区块维护两个可能相当大的集合,并小心处理交易失败时的合并语义(失败交易触达的访问是否保留是实现需要钉死的细节,EIP-2929现行规则对失败交易触达的状态同样维持已访问标记,本提案方向与之一脉相承);其二,Gas收入结构改变,同一区块的顺序会开始影响总Gas消耗——排在热合约后面的交易天然占便宜,这给打包排序加了一个此前不存在的维度。
与相邻提案的分界线
同类问题在EIP仓库里有好几条路:EIP-7557走的是整块预热的显式声明路线,把预热做成区块里的显式动作;EIP-7650的prefetch预编译把预取下放到合约代码内部;另有提案讨论把预热效果延伸到多个区块。EIP-7863是其中改动最小的一个:不加新指令、不加新字段、不改交易格式,只是把既有集合的生命周期拉长一个层级。这也决定了它的性质——纯优化提案,不引入新的共识面,但每一笔交易的Gas用量都可能因区块上下文不同而不同,这类看似温和的语义变化恰恰是评审最警惕的部分,因为它会让同一笔交易在不同区块里烧掉不同的Gas。
快速问答
问:为什么EIP-2929当初要按交易重置? 答:交易级作用域让每笔交易的Gas用量与外部上下文无关,验证者可以独立计价与并行处理;跨交易共享热集意味着交易的Gas开始依赖它前面有哪些交易,这是有意的取舍。
问:对Layer2有意义吗? 答:L2执行费里状态访问同样按这套规则计价,理论上同样受益;但L2的排序器并行度更高,区块级共享集合对并行执行器的干扰需要先解决。
问:主网能用吗? 答:不能,提案文本状态是Draft,未进入任何已确认的升级清单。
一条直觉线
把冷热判定想成图书馆的借阅登记:现行规则是每位读者进店先查一遍馆藏(所有东西算第一次借),EIP-7863说登记簿应该按天记不按人记——同一天里同一本书谁先借都一样。看所有预热类提案,问同一个问题就够:它把记住这件事推到多远的时间轴上,推得越远,省得越多,交易顺序的耦合也越深。
风险提示:本文仅解释协议提案机制,不构成任何投资建议。EIP状态以官方仓库为准,提案不等于主网激活。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。