
Foundry Anvil 修复本地构建 OP Stack 区块时避免将以太坊 Blob 超额 Gas 误写入 DA 足迹数据【免费下载链接】foundryFoundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.项目地址: https://gitcode.com/GitHub_Trending/fo/foundryAnvil 是 Foundry 内置的本地以太坊节点实现。当它本地构建 OP StackOptimism区块时会为每个交易核算 L1 数据可用性DA足迹并写入区块头的blobGasUsed/excessBlobGas字段。本篇文章围绕 Foundry 变更记录.changelog/anvil-op-blob-excess.md中的一条 patch 级修复展开说明该问题产生的背景、修复方式以及背后的源码逻辑帮助你理解 Anvil 的 OP 区块核算机制以及如何验证该行为。变更记录原文与语义该变更条目位于 .changelog/anvil-op-blob-excess.md属于 Foundry 的 changelog 片段机制--- anvil: patch --- Fixed locally built OP Stack blocks applying Ethereum blob excess gas updates to DA footprint data.按照 Foundry 的变更记录规范见 .changelog/README.md每个.changelog/*.md文件包含 YAML frontmatter 与一条非空 release notefrontmatter 将工作区包名映射到patch/minor/major版本级别正文是发布说明。因此本次变更影响anvil包级别为patchbug 修复修复的问题是本地构建本地出块的 OP Stack 区块把以太坊Ethereum风格的 blob excess gas 更新逻辑错误地套用到了 DA 足迹DA footprint数据上。问题背景OP Stack 的 DA 足迹与以太坊 blob gas 的区别在理解修复前需要先区分两套“blob”语义以太坊EIP-4844Blob GasblobGasUsed是区块头中实际被 blob 交易占用的 gasexcessBlobGas通过目标target数量推导用于计算 blob base fee。两者服务于 blob 数据blob data的定价。OP Stack 的 DA 足迹DA footprintOP Stack尤其自 Jovian 硬分叉后在本地构建区块时会把交易的压缩大小乘以一个从 L1L1BlockInfo合约读取的 scalar得到该交易对 L1 数据可用性成本的占用——即 DA 足迹。这个值被写入区块头的blobGasUsed字段用于驱动下一区块的 base fee 定价OP 的“Jovian 动态费用”机制但它本质上衡量的是 DA 足迹而不是以太坊的 blob gas。问题就出在如果本地构建 OP 区块时错误地使用以太坊的 excess blob gas 更新逻辑即根据blobGasUsed与目标值计算excessBlobGas就会把以太坊语义的错误数值写入 DA 足迹数据破坏 OP 网络的费用核算。修复的源码落点修复的核心实现在 crates/anvil/src/eth/backend/executor/optimism.rs 中Anvil 为 OP 区块执行器单独实现了blob_gas_used核算函数/// Returns the blob gas accounted for by an OP transaction under the active hardfork. pub(crate) fn blob_gas_usedDB: Database( db: mut DB, tx: FoundryTxEnvelope, jovian: bool, ) - Resultu64, alloy_evm::block::BlockExecutionError { if !jovian || matches!(tx, FoundryTxEnvelope::Deposit(_)) { return Ok(tx.blob_gas_used().unwrap_or_default()); } let encoded estimate_tx_compressed_size(tx.encoded_2718().as_ref()).saturating_div(1_000_000); let scalar L1BlockInfo::fetch_da_footprint_gas_scalar(db) .map_err(alloy_evm::block::BlockExecutionError::other)?; Ok(encoded.saturating_mul(u64::from(scalar))) }关键逻辑解读非 Jovian 硬分叉或存款交易Deposit直接返回交易自带的blob_gas_used通常为 0不应用 DA 足迹逻辑Jovian 及之后 普通交易先通过estimate_tx_compressed_size估算交易编码后的压缩大小结果除以1_000_000换算为 MB 量级再从 L1 的L1BlockInfo合约读取da_footprint_gas_scalar两者相乘得到该交易的 DA 足迹。同时执行器在初始化时通过set_optimism_hardfork记录optimism_jovian标志判断当前 OP 硬分叉是否达到 Jovianpub(crate) fn set_optimism_hardfork(mut self, hardfork: FoundryHardfork) { self.optimism_jovian OpHardfork::from(hardfork) OpHardfork::Jovian; }这意味着“DA 足迹”核算只在 OP 的 Jovian 硬分叉语义下生效不会把以太坊的 blob 语义混入。测试验证Jovian 采矿与模拟使用 DA 足迹仓库在 crates/anvil/tests/it/optimism.rs 中提供了针对性的集成测试直接印证了本次修复的行为。测试jovian_mining_and_simulation_use_da_footprint做了如下验证构造 Jovian 环境以 chain id 8453Base 主网、OpHardfork::Jovian、NetworkConfigs::with_optimism()启动 Anvil写入 DA scalar通过anvil_set_storage_at向 L1L1BlockInfo合约0x4200000000000000000000000000000000000015的 slot 8 写入DA_FOOTPRINT_SCALAR 400即每个交易 DA 足迹期望为100 * 400 40_000eth_simulateV1 模拟模拟单笔转账时断言blobGasUsed 0x9c40即 40000、excessBlobGas 0x0模拟 30 笔转账时断言blobGasUsed 30 * 40000超额限制在 gas limit 受限的 block override 下模拟 26 笔交易断言错误信息以blob gas usage exceeds the limit of开头说明 DA 足迹同样受 blob gas 上限约束真实采矿关闭 auto mine 后批量发送 30 笔交易并mine_one()断言最新区块头的blob_gas_used 30 * 40000且excess_blob_gas Some(0)费用联动再挖一个块用 OP Canyon 参数elasticity 250、denominator 2计算下一块 base fee断言“Jovian 应根据其 DA 足迹为下一区块定价”。配套测试local_jovian_blocks_include_dynamic_fee_parameters进一步验证在本地非 forkJovian 节点上写入 DA scalar 后下一区块 base fee 会上升next_block.header.base_fee_per_gas transaction_block.header.base_fee_per_gas且extra_data采用 Jovian 格式长度 17、首字节为 1。这些测试共同确认了修复后本地 OP 区块的 blob/DA 字段完全由 DA 足迹驱动不再混入以太坊 excess blob gas 更新。修复的实际效果综合源码与测试可以确认本次 patch 修复使 Anvil 在本地构建 OP Stack 区块时blobGasUsed只由 DA 足迹交易压缩大小 × DA scalar决定与交易是否携带 blob 无关excessBlobGas保持为 0不再套用以太坊“根据 blobGasUsed 目标值推导 excess”的更新逻辑base fee 定价遵循 OP Jovian/Canyon 的动态费用参数elasticity 6、max change denominator 250见 crates/anvil/tests/it/optimism.rs 中test_optimism_base_fee_params的说明而非以太坊 EIP-1559 参数fork 与本地模式行为一致无论是--fork-url分叉模式还是纯本地 Jovian 节点DA 足迹核算路径一致。如何复现与验证你可以通过以下方式在本地复现该行为以 OP 网络与 Jovian 硬分叉启动 Anvilanvil --chain-id 8453 --hardfork jovian向 L1L1BlockInfo合约写入 DA scalar测试中使用anvil_set_storage_at向地址0x4200000000000000000000000000000000000015的 slot 8 写入 400cast rpc anvil_set_storage_at \ 0x4200000000000000000000000000000000000015 8 \ 0x0000000000000000000000000000000000000000000000000000000000000190发送若干普通转账后通过eth_getBlockByNumber观察区块头blobGasUsed应为 DA 足迹之和与excessBlobGas应为 0cast block latest --json | jq .blobGasUsed, .excessBlobGas也可用eth_simulateV1在不出块的情况下观察模拟区块的blobGasUsed/excessBlobGas验证与真实采矿结果一致。小结.changelog/anvil-op-blob-excess.md记录的是一个典型的语义边界 bugOP Stack 的 DA 足迹与以太坊 blob gas 共用区块头字段但底层定价逻辑完全不同。修复通过在 OP 执行器中引入独立的blob_gas_used核算路径crates/anvil/src/eth/backend/executor/optimism.rs配合 crates/anvil/tests/it/optimism.rs 中的集成测试确保本地构建的 OP 区块从blobGasUsed、excessBlobGas到 base fee 定价全部遵循 Jovian 的 DA 足迹语义为依赖 Anvil 做 OP Stack 本地开发、模拟与费用测试的开发者提供了可靠的一致性保障。【免费下载链接】foundryFoundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.项目地址: https://gitcode.com/GitHub_Trending/fo/foundry创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考