区块访问列表 BAL 由 EIP-7928 定义:每个区块把自己碰过的地址与存储槽连同变化打包广播,验证者不必从头重放执行就能核对状态增量。这套格式还没捂热,2026 年 5 月 3 日又有人递了 EIP-8247:作者 Toni Wahrstätter 注意到 BAL 里大量的 20 字节地址与 32 字节槽键,其实在最近的几个块里一字不差地出现过——既然邻居家的清单上就有现成的行,为什么每次要重抄一遍,而不是写一句引用第几个祖先块的第几项?
引用代替重抄
设计核心是给 BAL 的两类键开一种紧凑引用:地址项可以写成账户引用——一个祖先偏移加一个账户下标的 RLP 列表,约 5 字节,对比原文 20 字节;存储槽项可以写成槽引用——再加一个槽下标,约 9 字节,对比原文 32 字节。祖先偏移只允许 0 到 7,0 是父块、7 是第八个祖先。引用与原文靠 RLP 类型天然区分:字面地址是一段 20 字节串、字面槽键是 32 字节值,引用则是列表,解码器不需要额外标志位。作者给出的期望收益是 BAL 体积减三成到一半,视跨块重复率而定——热门 DeFi 合约每个块被反复触碰,正是重复率最高的数据。

锚定在展开视图上的确定性编码
引用最危险的地方是间接层:引用可以套引用,验证就会滚成递归查表,给拒绝服务留出深不见底的洞。8247 直接掐死这条路径——引用只能指向祖先块 BAL 的展开视图,也就是那份已经把全部引用解析回字面量、并且通过 EIP-7928 校验的清单;禁止指向尚未展开的编码文本,也禁止指向当前块。验证者因此要为最近八个激活后的区块保留展开视图和每个账户的槽字典——槽下标数的是该账户存储变更与存储读取两处键做字典序并集去重后的位置——验证动作只是定长数组查表,没有递归,成本被窗口长度锁死。
另一半纪律是编码唯一性:只要某个字面量在八个祖先视图里存在有效引用,写原文本身就违规;存在多个可行引用时,必须选偏移与下标最小的那一个。编码因此成为区块与其祖先的纯函数,生产者无法靠挑一个更贵的写法偷偷塞体积。规范部分为此写了一整列拒绝条件:偏移越界、指向激活前的块、下标越界、非最小引用,逐条列清。
硬分叉、重组与未完成的零件
提案不打算温柔兼容:这是一次硬分叉,激活前的 BAL 保持字面量原样、引用够不着它们;测试用例一栏仍是 TBD。重组的处理很朴素——被换掉的块让引用在新规范链下解析失败,与一切随区块绑定的数据同命。规模方面,EIP-7928 给展开后条目数设的预算继续有效:引用省的是传输字节,不是共识上限,膨胀担忧由展开规模兜底。理由部分还解释了窗口选八的算盘:验证状态有界、能覆盖大多数跨块复用、偏移还能塞进 3 个比特。
快速问答
问:为什么不干脆对整份 BAL 做差分? 答:提案只替换重复的键,值变更列表等其余结构原样保留 7928 的定义——改动面越小,越容易排进议程。
问:验证者要多存什么? 答:最近八个规范块的展开 BAL 与逐账户槽字典,都是可重建的临时视图,不是新的永久状态。
问:今天能用吗? 答:Draft 状态,依赖 EIP-7928 先在主网站稳;测试向量未定稿。
一条判断线
读任何压缩方案都先问两句:解压是否唯一、验证成本是否随压缩深度增长。8247 用最小引用规则买唯一性,用展开视图加八块窗口买验证成本有界——这两条恰好是压缩类协议最常见的死穴,提案把它们写成了显式拒绝条件而不是惯例。
常见误区
一是把引用窗口当无限缓存,八个块之外的键必须写原文;二是以为引用改变了 BAL 的语义内容——展开后的清单与逐字版等价,省的只是字节;三是忽略验证者的存储换带宽账:每个全验证节点都多养八份展开视图。
风险提示:本文解释评审中的提案草案,不构成投资建议;结构定义以 EIPs 仓库当期原文为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。