文章探讨了以太坊合约向 Rollup 发送消息时如何支付 L2 执行成本的问题,对比了 Arbitrum 和 Optimism 的不同方案,并提出了两种新的以太坊opcode提案:EXTRACTGAS(将 gas 转换为 value)和 PAYFROMORIGIN(从交易发起者的 value 中扣除)。这些方案旨在解决现有桥接方案的不足,使得消息发送方无需修改合约接口即可支付 L2 执行成本。
当合约将消息从以太坊发送到 rollup 时,它们需要支付消息执行的费用,就像在 rollup 上的一笔交易一样。Arbitrum 和 Optimism 对此有不同的处理方法。
使其消息发送 函数在其桥上是 payable 的,并期望调用者发送足够的 value 来覆盖 L2 执行的成本。这样做的缺点是,许多现有合约不提供进行 payable 调用的能力,即使它们提供了,value 也可能需要从用户处传递,经过路径中的所有合约,才能到达 payable 函数。
ERC721 标准就是一个例子。ERC721 提供了一个 _checkOnERC721Received 函数,该函数将在转移到合约后被调用。这可以用于将 ERC721 token 转移到合约并检查它是否已被接收。然而,需要 payable 存款函数的 rollup 不能使用这种方法,因为 _checkOnERC721Received 不会随之发送任何 value。相反,为了让用户随存款发送 value,他们必须将存款分成 2 个单独的交易:
为了避免强制执行 payable 接口,Optimism 不接收任何用于消息的 L2 执行的资金。相反,他们 燃烧 gas,gas 量与 L2 交易 gas 限制成正比,以防止调用者能够 DOS rollup 节点,使其免费处理任意数量的 L2 gas。这样做的缺点是燃烧 gas 占据了 L1 区块空间,这是一种宝贵的资源。
以下是关于新的以太坊操作码的两个替代方案,这些操作码可以接受资金,而无需强制更改调用合约的公共接口。
一个新的操作码 (EXTRACTGAS),从交易的 gas 补贴中提取 gas,将其转换为 value 并发送到当前地址。该操作码将 gasUsed 增加 gasExtracted,并将 gasExtracted*tx.gasprice 发送到当前地址。此外,在计算区块中使用的 gas 总量时,需要从使用的 gas 中减去提取的 gas 总量,以确保区块 gas 限制不受影响:blockGasUsed - blockGasExtracted < blockGasLimit。
一种新的交易类型,包括一个额外的 value 字段,称为 originValue,以及一个新的操作码 (PAYFROMORIGIN),它可以从 originValue 字段中获取一些资金,并将其发送到当前正在执行的合约。originValue 字段不是绝对必要的,但在为交易发送者提供一些保护以防止合约获取任意数量的 value 方面可能很好。
编辑:这个问题也可以用 3074 解决。用户可以使用具有批量处理能力的invoker,首先进行相关的合约调用(这将在内部调用桥),而不提供 value,然后在之后调用桥合约,并为之前存入的消息付费。然而,这样做会带来必须进行两次额外调用的开销。
- 原文链接: ethereum-magicians.org/t...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!