揭开 Arbitrum 费用的神秘面纱

  • voltrevo
  • 发布于 2024-01-10 12:27
  • 阅读 57

本文深入分析了 Arbitrum 中 L1 和 L2 费用的计算机制,特别强调了在理解 Arbitrum 收费时的两个主要陷阱:Arbitrum 报告的 gasUsed 字段并不等同于 L2 gas,以及 Arbiscan 的 L1 gas 报告可能会引发误解。通过生动的蛋糕和饼干的类比,阐明了费用计算中的复杂性和可能的困惑。文章提供了具体的计算示例,帮助开发者更好理解和估算费用。

解密 Arbitrum 的费用

通用型以太坊 L2 需要为两件事情收费:

  1. 作为一个与以太坊兼容的链,它们像以太坊一样收取自己的 gas 费用。
  2. 它们需要承诺为你的交易在 L1 上支付的 L1 gas 费用。这主要涉及将你的交易的 calldata 提供到 L1 上。

为了做到这一点,每个 L2 交易实际上都会消耗一定数量的 L1 gas 和 L2 gas。为了澄清,这些术语的含义如下:

  • L1 gas:L2 为支持你的交易需要在 L1 上花费的 gas 量,按照 L1 gas 价格收费
  • L2 gas:由 L2 链本身直接使用的 gas 量(根据 以太坊黄皮书),按照 L2 gas 价格收费

或者至少,这就是我(Andrew Morris)使用这些术语的方式,以及我认为以太坊社区如何理解这些术语。

Arbitrum 引入了 2 个陷阱,使得 Arbitrum 的费用特别难以理解。

免责声明

在继续之前,我想强调 L2 有许多难以解决的问题。必须做出权衡。混淆是可以理解的,并非 Arbitrum 独有。我希望看到 Arbitrum 改善它们报告 gas 的方式,不是因为它们做得不好,而是因为总有改进的空间。

陷阱 #1

Arbitrum 报告的 gasUsed 字段不是 L2 gas。

通常,gas 的数量纯粹由交易的完整数据(不仅仅是数据字段)和它所执行的 EVM 操作决定。这使得 gas 变得可预测 —— 你可以在与相关状态相同的不同链上测量交易的 gas,包括在开发环境中。通常情况下,这个相关状态是可以合理控制的,但在 Arbitrum 上,它包括一个独特的复杂系统。

Arbitrum 通过这个系统解决的问题是,所有 L2 都需要收取额外的费用,以证明它们在 L1 上正确执行了你的交易。因为这个额外的费用是关于在 L1 上工作的,所以最好将其理解为一种 L1 gas 的数量。

Arbitrum 的系统只是增加 gasUsed 到所需的数字,使得它们收取的费用等于 gasUsed \* gasPrice。由于费用主要由这个将数据发布到 L1 的额外成本主导,它们的 gasUsed 数字中的大部分实际上并不是 L2 gas。

这个解决方案有以下优点:

  1. 从你的账户中扣除的费用是 gasUsed \* gasPrice,与 L1 一致
  2. 你可以通过使用 gasLimit 和 gas 定价字段来限制你愿意支付的费用

缺点是混淆。期望 L2 gas 是 L2 报告的 gas 量是合理的。在 Arbitrum 上这是一个非常不同的事情。

陷阱 #2

Arbiscan 提供了 L1 和 L2 gas 的细分,但它们的 "L1 gas" 不是 L1 gas。

Arbiscan 高级交易信息注释示例

这个细分对于获得 L2 gas 是有用的,但这里报告的 L1 gas 实际上只是它们的 gasUsed 字段减去 L2 gas。这既不是 L1 gas 也不是 L2 gas。它是一种额外的假设 L2 gas 量,可以用来补偿它们的 L1 成本,按 L2 gas 价格收费。这个数字很难贴上准确的标签,这大概就是这个系统令人困惑的原因所在。

烘焙店类比

想象一家出售饼干和蛋糕的烘焙店。今天,一块饼干的价格是 $2,而一块蛋糕的价格是 $50。你决定购买 5 块饼干和 1 块蛋糕。这花费了 $60,但商店的结账系统有一些不寻常的软件,只能按饼干收费,所以你最终获得了如下收据:

饼干数量:          30   // gasUsed
饼干单价: $ 2.00   // gasPrice

======================================
总计:        $60.00   // 总费用

你是一名工程师,所以你点头表示理解。然而,你需要一个明细记录,因此烘焙店乐意为你添加这个注释:

蛋糕数量:            25   // "L1 gas"
饼干数量:           5   // L2 gas

======================================
总计:            30   // gasUsed

这部分是有帮助的,因为它准确记录了你购买了 5 块饼干,但 25 块蛋糕这个数字是错误的。此外,尽管知道这个注释背后的想法是 25 是为了获得总共 30 块饼干而选的,但从收据和注释中没有办法推断出你购买了 1 块蛋糕,或者说那天蛋糕的售价是 $50。

这才是你真正想要的:

蛋糕数量:             1   // L1 gas
蛋糕单价:   $50.00   // L1 gas 价格

饼干数量:           5   // L2 gas
饼干单价: $ 2.00   // L2 gas 价格

======================================
总计:        $60.00   // 总费用

计算实际的 L1 Gas

我们需要找出使用的 L1 gas 价格,然后就可以简单地计算:

Poster Fee / l1GasPrice

或者等价于:

"L1 Gas" \* l2GasPrice / l1GasPrice

为了快速近似,我们可以查找在 Arbitrum 交易的大致相同时 L1 收取的 gas 费用。

为了更全面,Arbitrum 提供了 预编译,能提供关于 Arbitrum 对 L1 gas 价格的链上洞察。

就我所知,调用 ArbGasInfo(地址为 0x6c)与 getL1GasPriceEstimate() 是我们需要的。

下面是如何使用 cURL 进行操作的示例:

curl -X POST --data \
  '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x000000000000000000000000000000000000006c","data":"0x055f362f"},"0xa1040b4"],"id":1}' \
  -H 'Content-Type: application/json' \
  https://rpc.ankr.com/arbitrum

(将 0xa1040b4 替换为你的交易的区块号。需要将其转换为十六进制。)

响应:

{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000003ff7f6ec2"}

因此 0x3ff7f6ec2 是该区块的 L1 gas 价格估计,即 17,171,443,394 (17.1 gwei)。

这个示例中使用的区块与 截图中的交易 匹配,因此我们可以将 0.0000318701 ETH (=31,870,100,000,000 wei)除以 17,171,443,394 得到 1,856 L1 gas。

如果你的示例一切顺利,结果应该非常接近一个完整的 L1 gas 数字,就像这里一样,我认为这已相当好的证据,证明 Arbitrum 的内部运作正是如此。

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

0 条评论

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