该文档提出了一个DA足迹区块限制方案,旨在缓解DA垃圾邮件并防止出现优先费用拍卖。该方案通过跟踪交易的DA足迹以及gas使用量,调整区块gas限制以适应高估算的DA使用量,而无需改变单个交易的gas机制。初步分析表明,该方案对Base或OP Mainnet等生产网络上的大多数区块影响最小。
| 作者 | Sebastian Stammler |
| 创建于 | 2025-08-12 |
| 审核人 | @niran @geoknee |
| 状态 | 开发中<!--/ 审核中 / 实施行动 / 最终--> |
评估添加 DA 足迹区块限制的提案,以缓解 DA 垃圾信息并防止优先级费用拍卖的发生。 此提案是 自定义 Calldata 最小 Gas 的替代方案, 避免完全更改单个交易 gas 机制的必要。
引入 DA 足迹区块限制以缓解 DA 垃圾信息并防止优先级费用拍卖。通过跟踪交易的 DA 足迹以及 gas,此方法调整区块 gas 限制以考虑高估算的 DA 使用量,而无需改变单个交易 gas 机制。初步分析表明,对 Base 或 OP Mainnet 等生产网络上的大多数区块的影响最小。
<!-- 描述文档试图解决的特定问题,以及理解问题和设计空间所需的信息。 如果需要更多关于问题成本的信息, 这是一个放置这些信息的好地方。-->
当前的 L1 成本模型没有考虑到有限的 L1 数据可用性 (DA) 吞吐量。 如果 L2 上的吞吐量超过 L1 blob 空间的吞吐量,或者如果 blob 空间因其他原因而拥堵,这可能会导致批量处理者的网络拥堵。
当前 L1 吞吐量在目标情况下为每个区块 6 个 blob,最大为每个区块 9 个 blob。这大约是 128 kB * 6 / 12 s = 64 kB/s 或 96 kB/s。但是,大多数 OP Stack 链的 gas 目标(和限制)都足够高,可以接受远超过每 (2s) 区块 128kb 的 calldata。
因此,必须通过 gas 限制以外的其他方式来限制吞吐量,以防止累积不断增长的批量处理者数据的积压。
目前用于应对高 DA 吞吐量的措施是在生产网络上部署的批量处理者限制。但是,当网络在构建者策略级别受到限制时,
其基本费用可能会下降,并导致优先级费用拍卖和其他不良的用户体验问题。
另请参阅设计文档 自定义 Calldata 最小 Gas,以获取 对相同问题和背景以及类似解决方案的更详细分析。
引入一个 DA 足迹区块限制,以限制可以放入区块的估计压缩交易数据的总量。基本费用更新规则考虑了这个新的总 DA 足迹,因此基本费用市场不会像策略级别的限制解决方案那样崩溃。
主要思想是引入一个新的 DA 足迹 资源,该资源与 gas 并行跟踪,并受到与区块 gas 限制相同的限制。这受到了 多维 Gas 计量 设计的启发,但常规 gas 不会被触及,就像 L1 以太坊的这种设计一样。
与交易 calldata 的常规 gas 使用量类似,我们通过获取其 RLP 编码来计算交易的 DA 足迹,从 Fjord 计算压缩交易 DA 使用量估计值,并将其乘以一个因子,即 DA 足迹 gas 标量,以获得交易的 DA 足迹。
da_usage_estimate = max(minTransactionSize, (intercept + fastlzCoef*fastlzSize) / 1e6)
da_footprint = da_usage_estimate * da_footprint_gas_scalar
这里,fastlzSize 是交易的 FastLZ 压缩 RLP 编码的长度。
现在,当评估交易是否仍然适合放入区块时,我们取两个资源的最大值,所有交易的常规总 gas 使用量和新的总 DA 足迹,
并查看这个最大值是否仍然低于区块 gas 限制。多维 Gas 计量设计引入了一个新的区块字段 gas_metered,
以将其与作为所有交易使用的 gas 总和的 gas_used 区分开来。但是,建议仅重新利用区块的 gas_used 字段
来保存两个资源总量的最大值:
block.gas_used = max(sum(tx.gas_used), sum(tx.da_footprint if tx.type != DepositTxType))
区块的总 DA 足迹仅考虑非存款交易,因为存款交易不是批量处理的一部分,因此它们不会对区块的 DA 使用量做出贡献。
这个定义的优点是基本费用更新机制可以继续工作,现在考虑了高总区块 DA 足迹。
DA 足迹 gas 标量与 calldata 最小成本相当。如果将其设置为更高的值,例如 400,则与仅通过交易 gas 使用量限制相比, 你可以预期 大致 有 1/10 的不可压缩 calldata 适合放入区块。如果区块主要是低 calldata 交易,其使用的常规 gas 比 DA 足迹多得多,那么这种新机制将不会产生任何影响。对于绝大多数区块来说,都是这种情况。
我建议通过 SystemConfig(与往常一样,由 SystemConfig 所有者)使 DA 足迹 gas 标量参数可配置。
下一个以太坊硬分叉 Fusaka 引入了
仅 Blob 参数硬分叉 (EIP-7892),并且很难估计
blob 参数以及 OP Stack 链的数量和吞吐量在未来几个月内将如何演变,因此现在很难设置一个充分告知的常量,
使其在可预见的未来保持良好。
但是,我建议将 DA 足迹 gas 标量值设置为 400 作为合理的默认值,该值应对现有和未来的链的影响最小,
同时通过将随机数据的吞吐量降低大约 10 倍与当前区块的 calldata 最小 gas 限制单独允许的吞吐量相比,
保护 OP Stack 生态系统免受 DA 垃圾信息攻击。另请参阅下一节,以分析不同 gas 标量对各种 OP Stack 链的影响。
为了将 gas 标量引入执行层,我们向 L1Block 合约添加一个新字段,并在推导过程中更新它,
就像生成 L1 属性交易时一样,与往常一样。推导还负责设置默认值。值为零的 SystemConfig 更新代码用于默认值。
因此,为了 禁用 该功能,可以使用标量 1。
使用 uint16 类型作为 gas 标量应该足够了。最大值为 65,535,这对于我们目前为该功能预见的
所有用例来说似乎绰绰有余。对于具有 1 亿 gas 的链,此标量隐含的 DA 使用量限制为 1e8 / (2^16-1) ≈ 1,526 字节。
对于一个 1 亿 gas 的链来说,设置如此低的 DA 字节使用量限制似乎非常不现实。
我们回溯测试了 DA 足迹区块限制对 Base、OP Mainnet、WorldChain、Unichain、Ink、Soneium、 Mode 在各种 gas 标量下的估计影响,发现绝大多数区块不会受到影响,即使 gas 标量值高达 800。 完整的分析可以在我们的 op-analytics 存储库中找到。
对于每个链,分析采用了以下方法。从最近的 120 天期间(4/29 - 8/26)随机抽取了 1% 的区块样本。 然后,对于每个区块,通过计算每个交易的基于 FastLZ 的 DA 使用量估计值,然后取总和来估计 DA 足迹。 然后将其与区块的 gas 限制和 gas 使用量进行比较,以查看该区块是否会受到 DA 足迹限制的影响。 如果 DA 足迹低于区块的 gas 使用量,那么就不会有任何影响,因为新的区块 gas 使用量将被定义为总交易 gas 使用量和 DA 足迹的最大值。 如果它超过了 gas 使用量,但没有超过 gas 限制,那么影响将仅仅是新的区块 gas 使用量将被设置得更高(因此基本费用可能会潜在地更快地增加), 但该区块仍然不会受到限制。只有当 DA 足迹也超过了 gas 限制时,才会将该区块的交易限制为更小的 DA 足迹。 对于这些区块,我们还查看了超额 DA 足迹的分布,以指示这些区块将受到多大的限制。
下表显示了对于每个分析的链的结果统计信息。
block_gas_limit / da_footprint_gas_scalar),以估计的压缩字节为单位。block_gas_limit / elasticity / da_footprint_gas_scalar),以估计的压缩字节为单位。 它是有效限制除以弹性。block.gas_used 字段将等于总区块 DA 足迹,而不是总交易 gas 使用量。随机抽样:
链: op • 样本大小: 51840 个区块
每个区块的平均 DA 使用量: 12,890 • 每个区块的最大 DA 使用量: 121,830
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 250,000 | 125,000 | 0 | 0 | 0 (0.0%) | 5.0% | 48.7% |
| 400 | 100,000 | 50,000 | 4 (0.01%) | 289 (0.56%) | 535 (1.0%) | 12.4% | 121.8% |
| 600 | 66,666 | 33,333 | 50 (0.10%) | 1865 (3.60%) | 4623 (8.9%) | 18.6% | 182.7% |
| 800 | 50,000 | 25,000 | 289 (0.56%) | 5439 (10.49%) | 12440 (24.0%) | 24.8% | 243.7% |

前 1 百分位 Calldata 使用量:
链: op • 样本大小: 51996 个区块
每个区块的平均 DA 使用量: 37,625 • 每个区块的最大 DA 使用量: 130,178
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 250,000 | 125,000 | 0 | 10 (0.02%) | 0 (0.0%) | 14.5% | 52.0% |
| 400 | 100,000 | 50,000 | 299 (0.58%) | 10091 (19.41%) | 5324 (10.2%) | 36.2% | 130.0% |
| 600 | 66,666 | 33,333 | 4001 (7.69%) | 26107 (50.21%) | 17993 (34.6%) | 54.2% | 195.1% |
| 800 | 50,000 | 25,000 | 10091 (19.41%) | 35954 (69.15%) | 30271 (58.2%) | 72.3% | 260.1% |
随机抽样:
链: base • 样本大小: 51840 个区块
每个区块的平均 DA 使用量: 60,605 • 每个区块的最大 DA 使用量: 398,860
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 937,500 | 312,500 | 0 | 21 (0.04%) | 0 (0.0%) | 6.7% | 45.6% |
| 400 | 375,000 | 125,000 | 7 (0.01%) | 810 (1.56%) | 52 (0.1%) | 16.7% | 114.0% |
| 600 | 250,000 | 83,333 | 45 (0.09%) | 7054 (13.61%) | 2784 (5.4%) | 25.1% | 170.9% |
| 800 | 187,500 | 62,500 | 129 (0.25%) | 23702 (45.72%) | 17400 (33.6%) | 33.5% | 227.9% |

前 1 百分位 Calldata 使用量:
链: base • 样本大小: 52324 个区块
每个区块的平均 DA 使用量: 139,942 • 每个区块的最大 DA 使用量: 406,286
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 937,500 | 312,500 | 0 | 1066 (2.04%) | 11 (0.0%) | 15.5% | 46.0% |
| 400 | 375,000 | 125,000 | 451 (0.86%) | 29878 (57.10%) | 2306 (4.4%) | 38.7% | 115.0% |
| 600 | 250,000 | 83,333 | 3394 (6.49%) | 49775 (95.13%) | 13540 (25.9%) | 58.0% | 172.5% |
| 800 | 187,500 | 62,500 | 8315 (15.89%) | 52159 (99.68%) | 29715 (56.8%) | 77.4% | 230.0% |
随机抽样:
链: ink • 样本大小: 103680 个区块
每个区块的平均 DA 使用量: 1,232 • 每个区块的最大 DA 使用量: 114,022
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 187,500 | 31,250 | 0 | 20 (0.02%) | 9 (0.0%) | 0.7% | 60.8% |
| 400 | 75,000 | 12,500 | 3 (0.00%) | 29 (0.03%) | 965 (0.9%) | 1.6% | 152.0% |
| 600 | 50,000 | 8,333 | 3 (0.00%) | 51 (0.05%) | 8705 (8.4%) | 2.5% | 228.0% |
| 800 | 37,500 | 6,250 | 20 (0.02%) | 108 (0.10%) | 12585 (12.1%) | 3.3% | 304.1% |
随机抽样:
链: unichain • 样本大小: 103680 个区块
每个区块的平均 DA 使用量: 3,951 • 每个区块的最大 DA 使用量: 129,900
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 187,500 | 31,250 | 0 | 13 (0.01%) | 1 (0.0%) | 2.1% | 69.3% |
| 400 | 75,000 | 12,500 | 4 (0.00%) | 601 (0.58%) | 4897 (4.7%) | 5.3% | 173.2% |
| 600 | 50,000 | 8,333 | 5 (0.00%) | 4884 (4.71%) | 34185 (33.0%) | 7.9% | 259.8% |
| 800 | 37,500 | 6,250 | 9 (0.01%) | 14606 (14.09%) | 51142 (49.3%) | 10.5% | 346.4% |
随机抽样:
链: soneium • 样本大小: 51840 个区块
每个区块的平均 DA 使用量: 4,110 • 每个区块的最大 DA 使用量: 37,609
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 250,000 | 31,250 | 0 | 2 (0.00%) | 0 (0.0%) | 1.6% | 15.0% |
| 400 | 100,000 | 12,500 | 0 | 1006 (1.94%) | 288 (0.6%) | 4.1% | 37.6% |
| 600 | 66,666 | 8,333 | 0 | 4708 (9.08%) | 3361 (6.5%) | 6.2% | 56.4% |
| 800 | 50,000 | 6,250 | 0 | 8805 (16.98%) | 9645 (18.6%) | 8.2% | 75.2% |
随机抽样:
链: mode • 样本大小: 51840 个区块
每个区块的平均 DA 使用量: 834 • 每个区块的最大 DA 使用量: 12,973
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 187,500 | 31,250 | 0 | 0 | 0 (0.0%) | 0.4% | 6.9% |
| 400 | 75,000 | 12,500 | 0 | 1 (0.00%) | 12 (0.0%) | 1.1% | 17.3% |
| 600 | 50,000 | 8,333 | 0 | 3 (0.01%) | 54 (0.1%) | 1.7% | 25.9% |
| 800 | 37,500 | 6,250 | 0 | 8 (0.02%) | 190 (0.4%) | 2.2% | 34.6% |
随机抽样:
链: worldchain • 样本大小: 51840 个区块
每个区块的平均 DA 使用量: 23,774 • 每个区块的最大 DA 使用量: 74,313
| 标量 | 有效限制 | DA 使用量目标 | 超过限制 | 超过目标 | 超过 Gas 使用量 | 平均利用率 | 最大利用率 |
|---|---|---|---|---|---|---|---|
| 160 | 287,500 | 143,750 | 0 | 0 | 0 (0.0%) | 10.3% | 26.6% |
| 400 | 115,000 | 57,500 | 0 | 130 (0.25%) | 14 (0.0%) | 25.7% | 66.5% |
| 600 | 76,666 | 38,333 | 0 | 6771 (13.06%) | 12756 (24.6%) | 38.6% | 99.7% |
| 800 | 57,500 | 28,750 | 130 (0.25%) | 27803 (53.63%) | 40067 (77.3%) | 51.4% | 133.0% |
可以看出,对于所有链和标量 400,对于绝大多数区块来说,影响可以忽略不计,因为 DA 足迹甚至小于 gas 目标或使用量。
这很好,因为这意味着 DA 足迹只会影响少数区块,因此对于大多数用户来说几乎无法察觉。
但是由于限制对每个区块都有效,它仍然可以防止最坏情况下的高吞吐量不可压缩 DA 垃圾信息,这是此功能的目标。
此外,可以看出,甚至更小比例的区块将受到 DA 足迹限制的限制,表明在正常使用情况下(没有不可压缩的 DA 垃圾信息), DA 足迹限制对链的影响可以忽略不计。
<!-- 提议的解决方案的资源使用情况如何? 它是否消耗大量的计算资源或时间? -->
区块构建者或验证者的额外资源使用量被认为是可忽略不计的,因为自 Fjord 以来已经计算了交易的估计 DA 使用量, 并且其他计算是微不足道的,仅涉及基本算术。
<!-- 有关此更改将如何影响多个客户端的详细信息。我们是否需要计划更改 op-geth 和 op-reth? -->
<!-- 链接到从 fma-template.md 文件创建的故障模式分析文档。 -->
<!-- 提议的设计是否改变了应用程序开发者与协议交互的方式? 任何超级链开发者工具(如 Supersim、模板等)是否会因此次更改而中断? -->
block.gasUsed 的替代方案建议重新利用 block.gasUsed 字段来保存区块的总交易 gas 使用量和 DA 足迹的最大值的新计量值。
或者:
block.gasMetered(如 ethresearch 帖子中提议的那样)来存储这个新值,
然后在从 Jovian 开始更新基本费用时使用这个新字段。可以通过将其包含在 RLP 编码中来使该字段成为总区块哈希的一部分,也可以不包含。
可能没有必要,因为该值可以从区块执行中重新计算。block.blobGasUsed 字段来存储最大值,或仅存储总 DA 足迹值。
这样做的好处是不引入新字段,并且它会自动成为区块哈希的一部分。
但是,它会更改该字段的语义含义,因为 OP Stack 链不支持 blob,如果我们想支持 blob(无论这意味着什么),
我们都需要再次更改。另一方面,作为 gas 维度中的一个值和一个衡量区块对 DA 存储(通常是 L1 上的 blob)的影响的指标,
DA 足迹在语义上已经接近于 blob gas,因此它将直观地利用这个未使用的字段。
剩余 blob gas 字段仍将保持未使用状态。实现需要确保 blob gas used 字段的新用途不会导致意外的副作用,
例如 blob 基本费用的更新(对于 OP Stack 链来说,仍然应该是常数 1)。这两种替代方案的优点是 gasUsed 字段的含义没有改变,保留了区块的 gas used 字段存储其交易 gas 使用量总和的不变量。
但它们需要对基本费用更新逻辑进行额外的更改。
<!-- 概述可能出错的地方。 还有任何需要更多工作才能解决的未解决问题。 -->
- 原文链接: github.com/ethereum-opti...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!