运行时长出来的字节也要收地板费:EIP-8279 给区块访问列表补的价 图 1
运行时长出来的字节也要收地板费:EIP-8279 给区块访问列表补的价 · 图 1

给区块体积设保险丝,是以太坊费用设计的一条暗线。EIP-7623 给 calldata 立了每非零字节六十四gas的地板价,动机就是防一类攻击:用大量廉价gas操作把六千万gas的区块塞进一点九兆字节的实体,压垮带宽差的节点。此后这条暗线一路延伸——EIP-7981 把地板扩展到访问列表条目,EIP-8131 再把所有交易内容字段统一成同一定价。EIP-8279 处理的是这条防线上最后一个没被覆盖的入口:运行期才产生的字节。提案由社区研究者 Toni Wahrstätter 起草,2026 年 5 月提交,草案状态,依赖项里既有地板费前辈,也有还在推进中的区块访问列表提案 EIP-7928。

冷SLOAD的套利通道

EIP-7928 设想让区块随附一份访问列表,记录这条区块动过哪些存储槽,验证者可以据此并行执行。列表的条目不是交易里预先声明的,而是操作码在运行期加进去的——一条冷 SLOAD 就往列表里塞三十二字节,却只收两千一百gas。于是出现一个定价空洞:攻击者写一笔交易,把gas预算的七成半花在冷 SLOAD 上堆访问列表字节,剩下花在高非零率的 calldata 上;因为 calldata 单价被七六二三定死,他宁可把内容也尽量改走 SLOAD 通道。提案给了算术:六千万gas的区块在旧规则下最坏能装进约一点五五兆字节的实体。所有静态地板——calldata 的、访问列表的、7623 的——都只盯着交易报文里的字节,对运行期长出来的这些字节视而不见。

运行时长出来的字节也要收地板费:EIP-8279 给区块访问列表补的价 图 2
运行时长出来的字节也要收地板费:EIP-8279 给区块访问列表补的价 · 图 2

一把共用同一汇率的尺

修补思路非常克制:不给操作码涨价,只在交易执行时维护一个地板累计器。每当某条操作码要往区块访问列表添加条目,先按三十二字节乘以六十四gas 向累计器记账,再让列表生长;SSTORE 每次改变槽的当前值同样记三十二字节的账,哪怕列表里每槽最终只留一份后值——宁可多收,边界仍成立。交易结算时取执行用量与地板用量的较大值,和 7623 的取较大值的结构一致。配合 8131 对交易内容的静态地板,两类字节用同一汇率计量,最坏区块体积被压回约「gas上限除以六十四」的量级——六千万gas对应约零点八九兆字节,比现状收拢四成。文档特意强调累计器是计数器不是预留:执行到一半才发现地板超了不需要回退,结算时补收即可。

典型交易碰不到这道闸

地板机制的哲学从来不是让所有人多付钱,而是让最坏情况付够钱。一笔普通转账的访问列表字节有限,运行时地板远够不着触发线;一个正常读写存储的合约调用,指令内在费用也远超等价字节数乘以六十四。提案的安全考量段因此把注意力放在边缘:回滚的交易要不要记账(要,字节照样进过网络)、估算器要跟着改(钱包与 eth_estimateGas 必须同时模拟地板用量,否则对地板受限交易的估气会偏低、上链被拒)、重复写同一槽会超收(可接受,因为边界由超收保证)。

快速问答

问:这和 EIP-6800 时代的访问列表收费是一回事吗? 答:不是。当年的访问列表是交易自带的显式声明、按条目定价;这里计的是运行期由操作码生成、进区块级列表的字节,收费口径也不同。

问:为什么它挂在这么多依赖上? 答:它站在别人的地板上:7928 定义了字节从哪来,8131 定义了静态侧同一定价,缺一个它的账就算不完整——这类层层引用也意味着推进节奏被上游牵制。

一笔对照账

用两个具体数字感受这个洞的大小。假设一笔交易把六千万gas全部花完:一种花法是约两万八千次冷 SLOAD(每次两千一百gas),按每访问列表条目三十二字节算,运行期能往区块里堆出约八十九万六千字节的访问列表内容;另一种花法是老老实实写 calldata,六十四gas一字节,同样预算只换来约九十三万七千字节——看起来接近,但前一种花法里 calldata 本身可以缩到极小,交易报文轻如羽毛,重活全由运行期记账,而旧地板价对报文外的字节一概不看。8279 的效果就是把两种花法拉到同一汇率之下:谁想再走冷 SLOAD 路线,每三十二字节先交两千零四十八gas 的地板税,与两千一百的指令费叠加后,套利空间被压缩到几乎只剩执行本身。数字是近似值,量级关系却是提案全部安全考量的支点。

风险提示:本文讨论草案阶段的费用提案,不构成投资建议;现行 gas 规则以当期网络行为为准。