本文介绍了一种用于测量以太坊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 的 fixedL1Gas
和 l1GasPerEffectiveDataByte
的值。一旦测量完成,这些值在 L1 和 L2 的气体价格变化时仍应能准确预测费用(<5% 误差)。只需定期重新评估,以跟上网络升级。
yarn
主脚本是 scripts/measure.ts
。你可以在测试环境中尝试这个:
yarn hardhat run scripts/measure.ts
然而,由于测试环境不是 L2,它应该将 L2 的额外费用测量为零。测试环境中的气体价格也可能会剧烈波动,这会影响计算结果。
要进行实际测量,你需要:
hardhat.config.ts
中找到其网络名称(或添加它)可选地,你还可以考虑更改这个硬编码的数字:
const maxPriorityFeePerGas = 100_000n; // 0.0001 gwei
然后:
## 提示:包含一个前导空格,以减少命令被写入某个历史记录的机会。
MNEMONIC="(你的助记词)" yarn hardhat \
--network "(网络名称)" \
run scripts/measure.ts
这会生成大量输出,但关键的关注值是 baselineExtraWei
和 extraWeiPerByte
。同样适合关注的是 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 进行一些调查以找到正确的值。例如:
步骤 3:最终计算
在之前的步骤中,你应该为你的交易获得 l2Gas
和 effectiveDataBytes
的值,以及内建模型的 fixedL1Gas
和 l1GasPerEffectiveDataByte
值。
使用这些值,你可以计算:
l1GasUsed = fixedL1Gas + l1GasPerEffectiveDataByte * effectiveDataBytes
l2GasUsed = (步骤 1 中测量的数字)
fee = l1GasUsed * l1GasPrice + l2GasUsed * l2GasPrice
这会给出一个以 wei 为单位的数字,你可以除以 10^18 以获得以 ETH 为单位的数值,并乘以 ETH 的价格以获得你所需货币的数值。
为了提供一个不严格与当前气体价格条件相关的客观估计,可以使用中位气体价格。
该脚本将测量中位 basefee:
yarn hardhat run --network "(你的网络)" scripts/estimateMedianBasefee.ts
添加一个适度的/适用的优先费用,以获得整体气体价格(例如 0.0001 gwei)。这取决于 L2(例如,Arbitrum 即便你提供优先费用也不收取)。
- 原文链接: github.com/getwax/wax/bl...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!