本文深入分析了 Arbitrum 中 L1 和 L2 费用的计算机制,特别强调了在理解 Arbitrum 收费时的两个主要陷阱:Arbitrum 报告的 gasUsed
字段并不等同于 L2 gas,以及 Arbiscan 的 L1 gas 报告可能会引发误解。通过生动的蛋糕和饼干的类比,阐明了费用计算中的复杂性和可能的困惑。文章提供了具体的计算示例,帮助开发者更好理解和估算费用。
通用型以太坊 L2 需要为两件事情收费:
为了做到这一点,每个 L2 交易实际上都会消耗一定数量的 L1 gas 和 L2 gas。为了澄清,这些术语的含义如下:
或者至少,这就是我(Andrew Morris)使用这些术语的方式,以及我认为以太坊社区如何理解这些术语。
Arbitrum 引入了 2 个陷阱,使得 Arbitrum 的费用特别难以理解。
在继续之前,我想强调 L2 有许多难以解决的问题。必须做出权衡。混淆是可以理解的,并非 Arbitrum 独有。我希望看到 Arbitrum 改善它们报告 gas 的方式,不是因为它们做得不好,而是因为总有改进的空间。
Arbitrum 报告的 gasUsed
字段不是 L2 gas。
通常,gas 的数量纯粹由交易的完整数据(不仅仅是数据字段)和它所执行的 EVM 操作决定。这使得 gas 变得可预测 —— 你可以在与相关状态相同的不同链上测量交易的 gas,包括在开发环境中。通常情况下,这个相关状态是可以合理控制的,但在 Arbitrum 上,它包括一个独特的复杂系统。
Arbitrum 通过这个系统解决的问题是,所有 L2 都需要收取额外的费用,以证明它们在 L1 上正确执行了你的交易。因为这个额外的费用是关于在 L1 上工作的,所以最好将其理解为一种 L1 gas 的数量。
Arbitrum 的系统只是增加 gasUsed
到所需的数字,使得它们收取的费用等于 gasUsed
\* gasPrice
。由于费用主要由这个将数据发布到 L1 的额外成本主导,它们的 gasUsed
数字中的大部分实际上并不是 L2 gas。
这个解决方案有以下优点:
gasUsed
\* gasPrice
,与 L1 一致gasLimit
和 gas 定价字段来限制你愿意支付的费用缺点是混淆。期望 L2 gas 是 L2 报告的 gas 量是合理的。在 Arbitrum 上这是一个非常不同的事情。
Arbiscan 提供了 L1 和 L2 gas 的细分,但它们的 "L1 gas" 不是 L1 gas。
这个细分对于获得 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 价格,然后就可以简单地计算:
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!