大小与压缩实测分析:60M Gas Limit 下的 1000 区块基准)
EIP-7928 区块级访问列表BAL大小与压缩实测分析60M Gas Limit 下的 1000 区块基准【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs本篇基于仓库中的实测报告 bal_size_analysis_60m.md 撰写该报告是 EIP-7928Block-Level Access ListsEIPS/eip-7928.md在 60M 区块 Gas Limit 前提下的 BAL 大小与压缩效率分析。通过本文读者将掌握 BAL 各组成成分存储写入、存储读取、余额/Nonce/代码变更、地址列表与 RLP 编码开销的真实体积分布、Snappy 压缩表现、与整块大小的比例关系以及是否记录存储读取这一设计取舍对 BAL 体量的决定性影响。一、分析背景为什么需要量化 BAL 的体积EIP-7928 提出在区块头新增block_access_list_hash字段强制记录区块执行期间被访问的全部账户与存储槽位以及执行后的状态值以支持并行磁盘读取、并行交易校验、并行状态根计算和无执行的状态重建。BAL 由执行层EL单独存储通过 Engine API 的ExecutionPayloadV4.blockAccessList字段随载荷下发给共识层CL。由于 BAL 不进入区块体而是作为区块头的承诺Keccak-256 哈希存在其原始字节通过 Engine API 传输并可能长期保留因此 BAL 的体积直接关系到网络传播带宽BAL 每块都要随 ExecutionPayload 传输存储开销弱主观期3533 epochs内 EL 必须保留完整 BAL 以支持离线重同步区块传播延迟体积越大传播时间越长。EIP 规范还给出了 BAL 的规模约束bal_items block_gas_limit // ITEM_COST其中bal_items storage_keys addressesITEM_COST 2000。在 60M Gas Limit 前提下按该公式可推出 BAL 条目的上限约为60_000_000 // 2000 30000项。ITEM_COST被刻意设置得低于 EIP-2929 中COLD_SLOAD_COST2100的最小添加成本从而留出约block_gas_limit / 42000项的缓冲空间吸收系统合约EIP-2935、EIP-4788、EIP-7002、EIP-7251与提款接收者EIP-4895等不消耗区块 Gas 的 BAL 条目。这正是本报告以60M block gas limit为前提做实测的意义所在。二、数据集与方法项目说明分析区块数1000 个区块范围23,991,474 23,992,473编码格式RLP与 EIP-7928 规范一致压缩算法Snappy补充对比仓库中另有一份 bal_size_analysis.md基于 100 个历史区块每 10 块采样一次并使用 SSZ 编码、Snappy 压缩。两份报告在编码格式、样本区块、样本量上均不同数值不宜直接横向对比但结论方向一致详见后文对比小节。三、每区块组件统计KiB下表给出各 BAL 组件在 1000 个区块上的平均与中位数原始体积、压缩体积以及 Snappy 压缩比组件平均原始中位原始平均压缩中位压缩平均压缩比中位压缩比存储写入52.649.629.228.01.79x1.78x存储读取31.729.718.717.51.71x1.71x余额变更6.86.66.76.51.02x1.00xNonce 变更1.11.01.11.00.99x1.00x代码变更2.10.21.20.21.37x1.16x账户地址含变更8.18.07.77.61.05x1.05x仅触及地址3.63.63.53.41.03x1.06xRLP 编码开销4.64.54.44.31.05x1.05x完整 BAL110.8106.072.470.51.52x1.52x从表中可以读出几个关键信号存储类数据主导存储写入 存储读取的原始体积合计约 84.3 KiB占完整 BAL 原始大小的 76% 以上结构性数据几乎不可压缩地址、Nonce、RLP 编码开销的压缩比都趋近 1.0x——它们由定长字节20 字节地址、8 字节 Nonce和编码前缀构成缺乏冗余代码变更中位值极小0.2 KiB但平均 2.1 KiB说明多数区块几乎没有代码部署/修改少数区块存在较大字节码写入分布严重右偏详见下一节。这些组件与 EIP-7928 规范中AccountChanges的 RLP 结构一一对应[address, storage_changes, storage_reads, balance_changes, nonce_changes, code_changes]其中账户地址含变更对应至少存在一个非空变更列表的地址条目仅触及地址对应无状态变更但被访问、必须以空变更列表出现的地址如BALANCE、EXTCODESIZE、EXTCODEHASH、STATICCALL的目标以及零值转账接收方等见 EIPS/eip-7928.md 的 Scope and Inclusion 小节。四、组件大小分布KiB下表给出各组件的最小/最大值与标准差反映 BAL 体量的波动范围组件最小原始最大原始原始标准差最小压缩最大压缩压缩标准差存储写入4.5197.023.72.8113.812.8存储读取1.2105.715.00.988.99.2余额变更0.722.42.80.722.42.7Nonce 变更0.14.40.50.14.50.5代码变更0.072.65.60.025.32.9账户地址含变更1.929.53.21.828.13.0仅触及地址0.812.61.40.812.21.3RLP 编码开销1.216.82.11.116.22.0完整 BAL10.9301.945.58.6191.428.8分布要点完整 BAL 压缩后最小 8.6 KiB、最大 191.4 KiB跨度为 20 倍以上说明 BAL 体积高度依赖区块活跃度交易数量、存储密集程度存储写入的标准差最大原始 23.7 / 压缩 12.8是 BAL 波动的首要来源代码变更的压缩比波动极大最小 0.93x、最大 8.67x见下节因为字节码一旦出现体积可观、重复模式多Snappy 压缩收益显著。五、压缩比分布组件最小压缩比最大压缩比标准差25 分位75 分位存储写入1.54x2.86x0.12x1.74x1.83x存储读取1.07x2.33x0.16x1.61x1.81x余额变更1.00x1.50x0.04x1.00x1.03xNonce 变更0.97x1.07x0.00x0.99x1.00x代码变更0.93x8.67x0.65x0.99x1.56x账户地址含变更1.02x1.08x0.02x1.04x1.06x仅触及地址1.00x1.10x0.03x1.02x1.05xRLP 编码开销1.02x1.12x0.03x1.03x1.07x完整 BAL1.19x1.98x0.09x1.47x1.56x完整 BAL 的压缩比集中在 1.47x1.56x2575 分位中位数与平均值均为1.52x存储写入/读取压缩收益最大1.71x1.79x 中位因为存储值中大量零值与非零重复字节地址、哈希前缀可被 Snappy 高效压缩余额、Nonce、地址与 RLP 开销压缩比趋近 1.0x基本不可压缩值得注意Nonce 变更存在 0.97x 的负压缩压缩后反而略大说明存在极少数 Nonce 值在 Snappy 下无法缩减但影响微乎其微该组件总量仅约 1.1 KiB。六、区块活动指标每块指标平均中位最小最大账户总数603600981474存储写入次数700667652521存储读取次数982922363279余额变更次数612598621812Nonce 变更次数22922418770这些计数解释了体积构成每块平均约603 个账户、700 次存储写入与982 次存储读取。结合上一节的编码分析可以理解存储写入比存储读取更贵的原因不仅是次数更在于写入需要携带完整的 32 字节新值StorageChange [block_access_index, new_value]而读取只需 32 字节槽位键storage_reads: List[StorageKey]。不过由于写入值中存在大量零/低熵数据Snappy 对写入的压缩收益1.79x高于读取1.71x部分抵消了体积劣势。七、组件占完整 BAL 的比例组件占原始体积 %占压缩体积 %存储写入47.5%40.3%存储读取28.6%25.8%余额变更6.2%9.2%Nonce 变更1.0%1.5%代码变更1.9%1.6%账户地址含变更7.3%10.7%仅触及地址3.3%4.8%RLP 编码开销4.1%6.1%压缩前后占比的位移非常直观压缩后存储类占比下降76.1% → 66.1%而不可压缩成分的占比被动上升——账户地址合计从 10.6% 升至 15.5%RLP 编码开销从 4.1% 升至 6.1%。也就是说压缩虽然将完整 BAL 从 110.8 KiB 降到 72.4 KiB但固定成本部分地址 编码结构在压缩后的相对权重更高进一步压缩的空间有限。八、BAL 与区块大小对比对比基准压缩后区块平均大小71.71 KiB。指标BAL 大小KiB区块大小KiB比例BAL/区块大小差完整 BAL含读取72.471.71.01x0.7 KiB不含读取的 BAL49.471.70.69x-22.3 KiB完整 BAL含读取约为压缩区块大小的1.01x两者几乎等量不含读取的 BAL 仅为压缩区块大小的0.69x小约 22.3 KiB存储读取使 BAL 体积增加23.0 KiB46.6%相对区块大小的开销含读取时1.0%不含读取时-31.1%。该结论与 EIPS/eip-7928.md Rationale 中的判断一致平均 BAL 约 72.4 KiB压缩后小于当前最坏情况的 calldata 区块即以 60M Gas Limit 为前提BAL 的带宽增量处于可接受范围。九、存储读取影响分析含读取完整 BAL压缩后 72.4 KiB不含读取压缩后 49.4 KiB存储读取带来的开销23.0 KiB占不含读取版本的 46.6%存储读取是 BAL 中第二大体积来源理解其语义有助于评估是否记录读取的设计取舍。按 EIPS/eip-7928.md 的 Recording Semanticsstorage_reads包含通过SLOAD访问但未被写入的槽位以及写入前后值相等的槽位no-op 写入即SSTORE后值与现值相同实现必须将每次写入与当前block_access_index之前的累计存储值比较以区分真实写入与 no-op 写入no-op 写入不得删除同一槽位早期索引的storage_changes条目SSTORE在执行隐式读取前必须满足槽位的access_cost且剩余 Gas 高于GAS_CALL_STIPEND哨兵否则该槽位既不能出现在storage_reads也不能出现在storage_changes。这意味着storage_reads捕获的是读多写少的合约访问模式例如路径式查询、治理提案读取、预言机轮询它们在典型主网区块中大量存在。报告量化了这种模式的代价记录读取会使 BAL 体积膨胀近五成。这也与另一份 bal_size_analysis.md 的结论呼应——该 SSZ 分析中包含读取使平均体积从 63.6 KB 增至 91.3 KB45.6%并明确提示读取跟踪的 45.6% 开销虽可接受但未来可能被移除。十、安全视角下的读取条目隐患报告数据也为 EIPS/eip-7928.md 的 Security Considerations 提供了量化背景由于storage_reads条目不映射到具体交易索引其有效性只能在全部交易执行完毕后确认。恶意区块提议者可以声明从未被访问的虚假存储读取迫使客户端进行不必要的 I/O 预取与数据下载而区块在完成前无法被拒绝。bal_items约束从数量上限制此类条目客户端还应考虑在执行过程中检测不可行的storage_reads并提前拒绝区块但必须注意系统调用产生的存储读取不由区块 Gas 支付不能以其为界。本节数据中存储读取平均每块 982 次、最大 3279 次、压缩后平均 18.7 KiB的量级正是评估该攻击面成本与防护必要性的直接依据。十一、核心结论组件主导性存储写入占原始 BAL 体积的 47.5%是第一大成分地址账目含变更账户10.7%与仅触及账户4.8%共同构成压缩体积的 15.5%是不可压缩的固定成本纯 RLP 开销编码结构占压缩体积的 6.1%是相对可控的固定成本压缩效率整体 1.52x 压缩比其中存储类数据贡献了绝大部分压缩收益体积波动压缩后 BAL 从 8.6 KiB 到 191.4 KiB跨度超过 20 倍由存储写入的波动主导与区块的比例完整 BAL 为压缩区块大小的 1.01x体积开销约 1.0%在可接受范围内。与 SSZ 100 块分析的对照bal_size_analysis.mdSSZ、100 块、采样测得压缩后平均 42.7 KB、压缩比 2.1x本报告RLP、1000 块、连续测得压缩后平均 72.4 KiB、压缩比 1.52x。两者在绝对值上的差异主要源于编码格式SSZ 定长紧凑编码 vs RLP 长度前缀编码、样本区块与样本量不同不宜直接对比但结论方向高度一致存储操作写入 读取始终占据 BAL 体积的绝对多数SSZ 版 85.3%RLP 版约 76%存储读取是第二大成分且是是否记录的主要取舍点SSZ 版 45.6%RLP 版 46.6%存储写入与 BAL 总量高度相关SSZ 版 Pearson 相关系数 0.973。两份报告互为印证为 EIP-7928 的 BAL 设计采用 RLP 以兼容既有基础设施、包含全部被访问地址以支持完整并行 IO提供了实证支撑。十二、延伸阅读规范全文EIPS/eip-7928.md含 RLP 数据结构、BlockAccessIndex 赋值、引擎 API 扩展、状态转移函数与完整示例SSZ 版分析assets/eip-7928/bal_size_analysis.md关联 EIPEIP-2930 可选访问列表、EIP-2929 Gas 成本COLD_SLOAD_COST2100、COLD_ACCOUNT_ACCESS_COST2600、WARM_STORAGE_READ_COST100、EIP-7981 提高访问列表成本ITEM_COST2000的定价参照、EIP-7702、EIP-2935、EIP-4788、EIP-7002、EIP-7251、EIP-4895系统合约与提款接收者贡献的 BAL 条目来源【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考