Layer2 费用测量工具

  • getwax
  • 发布于 2024-03-21 20:37
  • 阅读 42

本文介绍了一种用于测量以太坊Layer 2(L2)费用的工具,该工具通过特定模型提供了L1费用与L2费用的统一计算方法。文中详细讲解了如何测量模型参数、如何应用该模型并进行最终计算,以及如何获取公正的估算值,从而更好地比较不同的L2费用。

费用测量工具

该工具便于直接测量 L2 费用。

每个 L2 需要扩展以太坊的费用收取系统,以考虑它们的 L1 成本。各种 L2 的方法往往不同,这造成了很多混淆,并使得各 L2 之间的比较变得困难。

该工具通过以下模型帮助统一 L2 费用:

l1GasUsed = fixedL1Gas + l1GasPerEffectiveDataByte * effectiveDataBytes
l2GasUsed = (由协议定义的普通气体 / L1 和本地开发下相同)

fee = l1GasUsed * l1GasPrice + l2GasUsed * l2GasPrice

要开始使用这一模型进行 L2 的测量,我们需要找到 L2 的 fixedL1Gasl1GasPerEffectiveDataByte 的值。一旦测量完成,这些值在 L1 和 L2 的气体价格变化时仍应能准确预测费用(<5% 误差)。只需定期重新评估,以跟上网络升级。

如何测量模型参数

yarn

主脚本是 scripts/measure.ts。你可以在测试环境中尝试这个:

yarn hardhat run scripts/measure.ts

然而,由于测试环境不是 L2,它应该将 L2 的额外费用测量为零。测试环境中的气体价格也可能会剧烈波动,这会影响计算结果。

要进行实际测量,你需要:

  1. 选择你想要测量的网络,并在 hardhat.config.ts 中找到其网络名称(或添加它)
  2. 设置一个大约 0.002 ETH 的账户,并有一个助记词(确切的支出金额应更接近 0.001 ETH,但你希望有一个缓冲区,以避免因资金不足而需要重新运行测试)

可选地,你还可以考虑更改这个硬编码的数字:

const maxPriorityFeePerGas = 100_000n; // 0.0001 gwei

然后:

## 提示:包含一个前导空格,以减少命令被写入某个历史记录的机会。
 MNEMONIC="(你的助记词)" yarn hardhat \
    --network "(网络名称)" \
    run scripts/measure.ts

这会生成大量输出,但关键的关注值是 baselineExtraWeiextraWeiPerByte。同样适合关注的是 weiUsedRelErrors 结果(有两组)。这些应该尽量接近零,理想情况下低于 0.05(5% 误差)。如果它们更高,可能是由于测试期间气体价格的显著波动,或因为 L2 的定价模型过于偏离这一模型的假设。你需要查看你认为可接受的估算误差,以便继续进行未来的估算,这可能通过在稍后重新运行测试来解决。(气体变化只是测试期间的问题——你仍然可以在气体价格稍后变化时使用结果模型进行估算。)

一旦你对数字满意,你需要找到适用的 L1 气体价格。你可以通过独立查看 L1 最近的气体收费来获得一个大致的数字,但为了获得最佳结果,你需要使用与 L2 相关的方法。例如:

有了 L1 气体价格值(以 wei 为单位(如果你有 gwei,将其乘以 10^9 以获得 wei 值)),你可以计算:

fixedL1Gas = baselineExtraWei / l1GasPrice
l1GasPerEffectiveDataByte = extraWeiPerByte / l1GasPrice

示例结果(2024 年 1 月测量):

Arbitrum One Optimism
fixedL1Gas 1816 1302
l1GasPerEffectiveDataByte 16.2 11.0

如何应用模型

步骤 1:测量 L2 气体

使用像 hardhat 这样的测试环境,测量你感兴趣的交易的普通气体(即 L2 在 L2 上运行时的气体)。根据交易的复杂性,可能需要小心设置正确的状态,以便你的交易遵循相关的/“正常”的代码路径。由于它会写入新的存储空间,第一次交易的这个值通常更高。取决于你是需要这个首次成本还是后续成本(或者你可能对两者都感兴趣)。

你也可以通过直接在目标链上运行交易来获取这个值,但要小心正确解释 L2 气体。这可能很棘手,因为 L2 可能以意想不到的方式报告气体,例如在 Arbitrum 上

步骤 2:测量有效数据字节

这与交易的 data 字段中的字节数以及它们在特定 L2 中的处理方式有关。如果你的交易数据是自定义且高效的格式,主要是随机且不可压缩的,那么你可以使用数据字段的实际长度作为有效长度。

如果你有一个基于 Solidity ABI 的大型数据字段,有效长度可能约为实际长度的 40%(基于 2024 年 1 月的实验)。

否则,你需要为你的交易和 L2 进行一些调查以找到正确的值。例如:

  • Arbitrum:使用基于 brotli 的复杂系统,并似乎将小数据字段(例如 ERC20 转账)当作不可压缩的来收费。测量有效字节的最实用方法可能是将你的实际字节发送到链,并找出将其插入模型时生成正确费用的长度。
  • Optimism:最终使用 gzip 来提交 L1 数据,但在费用计算中,它使用非零字节的数量加上 1/4 * 零字节的数量。

步骤 3:最终计算

在之前的步骤中,你应该为你的交易获得 l2GaseffectiveDataBytes 的值,以及内建模型的 fixedL1Gasl1GasPerEffectiveDataByte 值。

使用这些值,你可以计算:

l1GasUsed = fixedL1Gas + l1GasPerEffectiveDataByte * effectiveDataBytes
l2GasUsed = (步骤 1 中测量的数字)

fee = l1GasUsed * l1GasPrice + l2GasUsed * l2GasPrice

这会给出一个以 wei 为单位的数字,你可以除以 10^18 以获得以 ETH 为单位的数值,并乘以 ETH 的价格以获得你所需货币的数值。

中位 gas 价格

为了提供一个不严格与当前气体价格条件相关的客观估计,可以使用中位气体价格。

该脚本将测量中位 basefee:

yarn hardhat run --network "(你的网络)" scripts/estimateMedianBasefee.ts

添加一个适度的/适用的优先费用,以获得整体气体价格(例如 0.0001 gwei)。这取决于 L2(例如,Arbitrum 即便你提供优先费用也不收取)。

  • 原文链接: github.com/getwax/wax/bl...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
getwax
getwax
江湖只有他的大名,没有他的介绍。