EIP-4844,也称为 proto-danksharding,新增了一种以太坊交易类型,该类型携带数据 blob,其内容无法被 EVM 读取,但其 KZG 承诺可以被读取。Rollup 使用 blob 以比 calldata 更低的成本发布数据可用性,并支付独立的 blob gas 费用市场。本指南解释了该机制,展示了如何通过 JSON-RPC 端点检查 blob 交易和 blob 基础费用,并提供了可复现的流程来测量 blob 成本并诊断常见故障。它将协议文档记录的行为与运营建议以及你必须在自己的网络上测量的数字区分开来。
EIP-4844 改变了什么以及本指南涵盖的内容
EIP-4844 引入了携带 blob 的交易:一种将一到多个数据 blob 附加到普通执行交易上的交易格式。EVM 无法读取 blob 内容,但可以读取对每个 blob 进行承诺的版本化哈希。blob 本身由共识层节点传播和存储,在有限的保留窗口后会被修剪。这就是该提案被称为 proto-danksharding 的原因:它部署了完整 danksharding 将复用的交易格式和费用市场,但尚未真正将数据分片到整个网络。
对 Rollup 而言,实际结果是除了 calldata 之外,多了一条更便宜的数据可用性通道。执行 gas 和 blob gas 分开定价,因此 Rollup 发布一批数据的成本取决于两个市场。本文涵盖机制、可运行的检查流程、blob 成本的测量方法、故障排查以及权衡。本文假设你可以访问一个暴露 blob 相关字段的以太坊 JSON-RPC 端点,并且可以运行 curl 或 Node.js。
- 协议文档记录的行为:交易类型、KZG 承诺、blob gas 核算、保留期。
- 操作流程:通过 JSON-RPC 检查 blob 交易和 blob 基础费用。
- 测量:在你自己的数据上计算每笔交易和每字节的有效 blob 成本。
- 建议:需要注意的地方,以及何时咨询端点提供商。
前提条件与假设
你需要一个支持 blob 相关 JSON-RPC 字段的以太坊主网或测试网 RPC 端点。大多数现代执行客户端会在交易收据上暴露 blobGasUsed 和 blobGasPrice,并在区块上暴露 blobBaseFee 字段,但在依赖它之前,你应该向你的提供商核实这一点。你还需要一种提交或观察 blob 交易的方式;如果你不是 Rollup 运营者,可以从区块浏览器或通过查询最近的区块来检查现有的 blob 交易。
对于代码示例,请将 RPC_URL 替换为你自己的端点。如果你还没有合适的端点,OnFinality API 服务和 RPC 端点指南解释了如何获取一个;具体的提供商选择是一个简短的推荐任务,更适合由 RPC Assistant 处理。不要使用公共端点进行生产测量,因为速率限制和缓存可能会扭曲结果。
export RPC_URL="https://your-endpoint.example"
export BLOCK_NUMBER="latest"心智模型:执行负载、Blob 负载与两个费用市场
一笔 blob 交易有两个部分。执行负载是一笔普通交易:发送者、nonce、接收者、value、calldata、gas 限制和最大费用字段。blob 负载是一个 blob 列表,每个 blob 由 4096 个 32 字节的字段元素组成,外加 KZG 承诺和证明。执行层验证交易并照常收取执行 gas。共识层根据承诺验证 blob 并将其包含在信标区块中。EVM 只能看到版本化哈希,这些哈希是从承诺派生出来的。
Blob gas 单独核算。每个 blob 消耗固定数量的 blob gas,blob 基础费用按照与 EIP-1559 相同风格的指数更新规则调整,但有自己的目标和最大值。一笔 blob 交易指定每 blob gas 的最大费用和小费,有效的 blob gas 价格受 blob 基础费用和发送者上限的约束。由于 blob 在保留期后被修剪,它们的定价低于永久存储的 calldata。保留窗口足够长,让 Rollup 参与者可以检索数据,但又足够短,以保持磁盘使用可控。
- 执行 gas:为计算和 calldata 支付,EVM 可见。
- Blob gas:为 blob 空间支付,EVM 不可读,保留期后被修剪。
- KZG 承诺:对 blob 数据的简洁承诺,由共识节点验证。
- 版本化哈希:EVM 可以访问的内容,从承诺派生。
使用 curl 检查 Blob 交易
确认你的端点暴露 blob 字段的最快方法是获取一个包含完整交易的最近区块,并查找 type-3 交易。JSON-RPC 方法 eth_getBlockByNumber 在第二个参数设置为 true 时返回交易对象。Blob 交易的类型为 0x3,并包含 blobVersionedHashes。区块对象可能包含 blobGasUsed 和 excessBlobGas,交易收据包含 blobGasUsed 和 blobGasPrice。
对你的端点运行以下 curl 命令。如果该区块没有 blob 交易,请选择一个 Rollup 活跃时期的区块,或查询一系列区块直到找到一个。预期的验证结果是一个 JSON 对象,其中至少包含一笔 type 为 0x3 且 blobVersionedHashes 数组非空的交易。
curl -s "$RPC_URL" \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["'"$BLOCK_NUMBER"'",true]}' \
| jq '.result.transactions[] | select(.type == "0x3") | {hash, type, blobVersionedHashes, maxFeePerBlobGas}'在收据上验证 Blob Gas 核算
一旦你有了 blob 交易哈希,使用 eth_getTransactionReceipt 获取其收据。收据应包含 blobGasUsed 和 blobGasPrice。将它们相乘即可得到该交易支付的 blob 费用。将其与执行 gas 费用(gasUsed 乘以 effectiveGasPrice)进行比较。这种比较是任何 blob 成本分析的核心。
以下 JavaScript 代码片段使用 Node.js 18 及更高版本中可用的内置 fetch API。它以 wei 和 ether 为单位打印执行费用、blob 费用和总费用。它不假设任何特定数字;你提供交易哈希。如果你的端点对 blobGasPrice 返回 null,则端点或客户端版本可能未暴露该字段,你应该尝试另一个端点或改为查询区块的 blobBaseFee。
const RPC_URL = process.env.RPC_URL;
const TX_HASH = process.env.TX_HASH;
async function rpc(method, params) {
const res = await fetch(RPC_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params })
});
const json = await res.json();
if (json.error) throw new Error(json.error.message);
return json.result;
}
const receipt = await rpc('eth_getTransactionReceipt', [TX_HASH]);
const gasUsed = BigInt(receipt.gasUsed);
const effectiveGasPrice = BigInt(receipt.effectiveGasPrice);
const blobGasUsed = BigInt(receipt.blobGasUsed ?? '0x0');
const blobGasPrice = BigInt(receipt.blobGasPrice ?? '0x0');
const executionFee = gasUsed * effectiveGasPrice;
const blobFee = blobGasUsed * blobGasPrice;
const totalFee = executionFee + blobFee;
console.log({
executionFeeWei: executionFee.toString(),
blobFeeWei: blobFee.toString(),
totalFeeWei: totalFee.toString(),
totalFeeEther: Number(totalFee) / 1e18
});测量 Blob 基础费用和每字节成本
要随时间测量 blob 成本,请采样区块并记录 blobBaseFee、blobGasUsed 和 blob 交易数量。blob 基础费用是每 blob gas 的价格;每个 blob 消耗固定数量的 blob gas,因此每个 blob 的成本是每个 blob 的 blobGasUsed 乘以 blobBaseFee。要得到每字节成本,请将每个 blob 的成本除以 blob 的字节大小。由于 blob 大小由协议固定,一旦你有了基础费用,这就是一个简单的计算。
使用表格记录你的测量结果。不要凭记忆或从其他网络填入数字;运行流程并记录你的端点返回的内容。下表是一个模板。流程是:选择一个采样窗口,获取每个区块,提取字段并进行汇总。一种简单的方法是查询一个范围内的每个区块,计算 blob 基础费用的均值和最大值,然后乘以每个 blob 的 blob gas 以得到每个 blob 的成本。
- 采样窗口:你运营的网络上的连续区块范围。
- 字段:区块 blobBaseFee、区块 blobGasUsed、交易类型和 blobVersionedHashes。
- 汇总:blob 基础费用的均值、中位数和最大值;blob 交易计数。
- 派生指标:使用协议固定 blob 大小的每个 blob 成本和每字节成本。
| Sample | Block | blobBaseFee (wei) | blobGasUsed | Blob txs | Cost per blob (wei) | Cost per byte (wei) |
|--------|-------|-------------------|-------------|----------|---------------------|---------------------|
| 1 | | | | | | |
| 2 | | | | | | |
| 3 | | | | | | |预期的验证结果及其含义
如果你的端点健康且支持 blob,区块查询会返回带有 blobVersionedHashes 的 type-3 交易,收据查询会返回非空的 blobGasUsed 和 blobGasPrice。在网络激活 blob 交易后的区块上,blob 基础费用应该存在。如果你看到 type-3 交易但 blob 字段为 null,则端点可能落后或使用的客户端未暴露这些字段;在得出网络有问题的结论之前,请尝试另一个端点。
成功的测量运行会生成一个表格,其中采样的字段没有空缺,并且每个 blob 的成本数字与你观察到的 blob 基础费用一致。如果每个 blob 的成本在短窗口内剧烈变化,请检查你是否混合了来自不同网络的区块,或者你的端点是否返回了缓存数据。对于生产监控,请使用专用端点而不是共享的公共端点,如果你需要一致的采样,请考虑使用专用节点。
排查常见的 EIP-4844 运营问题
Blob 交易引入了传统交易不存在的故障模式。最常见的是与费用相关:每 blob gas 最大费用低于当前 blob 基础费用的交易将不会被包含。与执行 gas 不同,你不能简单地提高优先费用;你必须确保 blob 费用上限足够高。另一个常见问题是提交多笔 blob 交易时的 nonce 管理,因为每笔交易消耗一个 nonce,而失败的 blob 交易如果被包含仍然会消耗 nonce。
第二类问题是数据检索。blob 在保留窗口后被修剪,因此任何需要历史 blob 数据的系统必须在修剪前将其归档。如果你的 Rollup 的数据可用性依赖于 blob,你需要一个不假设 blob 是永久的检索策略。第三类是端点支持:一些 RPC 提供商不暴露 blob 字段或不中继 blob 交易。在围绕特定端点构建工作流之前,请验证支持情况。
- Blob 费用上限过低:交易未被包含;提高 maxFeePerBlobGas。
- Nonce 缺口:提交多笔 blob 交易而未等待收据。
- Blob 被修剪:历史数据不可用;在保留期到期前归档。
- 端点缺口:blob 字段为 null 或 blob 交易被拒绝;切换端点。
- 客户端版本:较旧的客户端可能不暴露 blob 字段;升级或更换提供商。
Proto-Danksharding 的局限性与权衡
EIP-4844 是垫脚石,不是完整的分片。blob 数据不会像完整 danksharding 那样在整个网络中分片,并且每个区块的 blob 数量有上限。这个上限意味着在 Rollup 活动高峰期 blob 空间可能变得竞争激烈,blob 基础费用可能上升。费用市场旨在处理这种情况,但这意味着 blob 成本不是固定的,必须进行监控。
Blob 也无法被 EVM 读取,这是一个有意的设计选择,但对于需要直接检查数据的合约来说是一个限制。Rollup 必须围绕版本化哈希和链下检索进行设计。最后,保留期是有限的。任何将 blob 视为永久存储的应用程序都在误用该功能。这些权衡对于数据可用性是可以接受的,但它们不能替代完整的数据可用性层。
后续步骤:从检查到生产监控
一旦你可以检查 blob 交易并测量 blob 基础费用,下一步就是构建一个小型监控循环。按计划采样区块,记录 blob 基础费用和 blob 交易数量,并在费用超过与你的 Rollup 经济性相关的阈值时发出警报。将此与执行 gas 监控相结合,以便你可以看到发布一批数据的综合成本。
对于端点选择,使用 RPC Assistant 获取关于支持 blob 的以太坊端点的简短推荐,并查看 OnFinality RPC 定价以了解速率限制和专用选项。如果你运营 Rollup 或数据可用性服务,专用节点可以为你提供一致的访问并避免共享端点的可变性。网络目录列出了支持的网络,Learn 部分有关于 RPC 端点和节点托管的相关指南。
- 为 blobBaseFee 和 blob 交易数量构建一个定时采样器。
- 对 blob 费用阈值和端点缺失 blob 字段发出警报。
- 如果你的应用程序需要历史数据,请在保留期到期前归档 blob 数据。
- 选择支持 blob 的端点,并考虑为生产使用专用节点。