保障 Gas 费市场

本文介绍了Optimism Rollup中用于保证L1到L2交易(即Deposited transaction)的Gas机制。它详细说明了如何通过燃烧L1的Gas来购买L2上的Gas,以及如何通过EIP-1559类似的费用市场来限制和调节Gas的使用,同时解释了燃烧L1 Gas的必要性,并讨论了防止恶意攻击的机制。

保证 Gas 费市场

<!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> 目录

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

存款交易 是在 L2 上发起的 L1 交易。它们在 L2 上使用的 gas 是通过 L1 上的 gas 燃烧(或者未来直接支付)来购买的。我们维护一个费用市场,并对单个 L1 区块中提供给所有存款的 gas 数量设置硬上限。

提供给存款交易的 gas 有时被称为“保证 gas”。提供给存款交易的 gas 是独一无二的,因为它不可退还。它不能被退还,因为它有时是用 gas 燃烧来支付的,并且可能没有剩余的 ETH 可以退还。

保证 gas 由 gas 津贴和用户想要在此基础上(在 L1 上)购买的任何保证 gas 组成。

L2 上的保证 gas 通过以下方式购买。L2 gas 价格通过 EIP-1559 风格的算法计算。然后,购买该 gas 所需的 ETH 总量计算为 (保证 gas * L2 存款基础费)。然后,合约接受该数量的 ETH(在未来的升级中)或(目前唯一的方法),燃烧与 L2 成本相对应的 L1 gas 数量 (L2 成本 / L1 基础费)。保证 gas 的 L2 gas 价格与 L2 上的基础费不同步,并且可能不同。

Gas 津贴

为了抵消在存款事件中花费的 gas,我们将 gas 花费 * L1 基础费 的 ETH 记入 L2 gas 的成本,其中 gas 花费 是处理存款所花费的 L1 gas 数量。如果此信用额度的 ETH 值大于请求的保证 gas 的 ETH 值 (请求的保证 gas * L2 gas 价格),则不会燃烧 L1 gas。

默认值

变量
最大资源限制 20,000,000
弹性乘数 10
基础费最大变化分母 8
最小基础费 1 gwei
最大基础费 type(uint128).max
系统交易最大 Gas 1,000,000

限制保证的 Gas

单个 L1 区块中可以购买的保证 gas 总量必须受到限制,以防止对 L2 的拒绝服务攻击,并确保保证 gas 总量保持在 L2 区块 gas 限制之下。

我们设置了每个 L1 区块 8,000,000 gas 的保证 gas 限制和每个 L1 区块 2,000,000 gas 的目标。这些数字使偶尔的大型交易成为可能,同时保持在我们在 L2 上的目标和最大 gas 使用量之内。

因为在单个区块中可以购买的保证 L2 gas 数量现在受到限制,我们实现了 EIP-1559 风格的费用市场,以减少存款的拥塞。通过将限制设置为目标的倍数,我们使存款能够以更高的成本暂时使用更多的 L2 gas。

## 用于更新 L2 存款基础费并限制在一个区块中购买的保证 gas 数量的伪代码
## 调用代码必须处理 gas 燃烧和对帐户支付此 gas 能力的有效性检查。
BASE_FEE_MAX_CHANGE_DENOMINATOR = 8
ELASTICITY_MULTIPLIER = 4
MAX_RESOURCE_LIMIT = 8_000_000
TARGET_RESOURCE_LIMIT = MAX_RESOURCE_LIMIT / ELASTICITY_MULTIPLIER
MINIMUM_BASEFEE = 10000

## prev_basefee 是一个 u128,prev_bought_gas 和 prev_num 是 u64s
prev_basefee, prev_bought_gas, prev_num = &lt;来自先前更新的值>
now_num = block.number

## 将完整的基础费限制在特定范围内。范围内的最小值应在 100-1000 左右
## 以便在基础费中实现更快的响应。这取代了 ethereum 1559 中的 `max` 机制
## 实现(它还有助于在基础费非常小时使其增加)。
def clamp(v: i256, min: u128, max: u128) -> u128:
    if v &lt; i256(min):
        return min
    elif v > i256(max):
        return max
    else:
        return u128(v)

## 如果这是一个新区块,则更新基础费并重置总 gas
## 如果不是,则仅更新总 gas
if prev_num == now_num:
    now_basefee = prev_basefee
    now_bought_gas = prev_bought_gas + requested_gas
elif prev_num != now_num:
    # 宽度扩展并转换为有符号整数数学
    gas_used_delta = int128(prev_bought_gas) - int128(TARGET_RESOURCE_LIMIT)
    # 使用截断(四舍五入到 0)除法 - solidity 的默认设置。
    # 将 gas_used_delta 和 prev_basefee 符号扩展到 256 位,以避免此处溢出。
    base_fee_per_gas_delta = prev_basefee * gas_used_delta / TARGET_RESOURCE_LIMIT / BASE_FEE_MAX_CHANGE_DENOMINATOR
    now_basefee_wide = prev_basefee + base_fee_per_gas_delta

    now_basefee = clamp(now_basefee_wide, min=MINIMUM_BASEFEE, max=UINT_128_MAX_VALUE)
    now_bought_gas =  requested_gas

    # 如果我们在前一个区块和现在之间跳过了多个区块,则再次更新基础费。
    # 这与迭代上述函数并不完全相同,但对于合理的 gas 目标值来说非常接近。
    # 对于保持 gas 使用量稳定而言,它也是关于错过区块数量的恒定时间,这一点很重要。
    if prev_num + 1 &lt; now_num:
        n = now_num - prev_num - 1
        # 对连续 n 个空区块,将 prev_basefee 减少 7/8。
        now_basefee_wide = now_basefee * pow(1-(1/BASE_FEE_MAX_CHANGE_DENOMINATOR), n)
        now_basefee = clamp(now_basefee_wide, min=MINIMUM_BASEFEE, max=type(uint128).max)

require(now_bought_gas &lt; MAX_RESOURCE_LIMIT)

store_values(now_basefee, now_bought_gas, now_num)

燃烧 L1 Gas 的理由

必须有一种针对网络使用的女巫攻击抵抗机制。如果很容易在 L2 上获得保证 gas,那么就有可能垃圾邮件网络。在 L1 上燃烧动态数量的 gas 充当女巫攻击抵抗机制,因为它随着需求的增加而变得更加昂贵。

如果我们直接收集 ETH 以支付 L2 gas,存款函数的每个(间接)调用者都需要标有 payable 选择器。对于许多现有项目,这不可能实现。不幸的是,这非常浪费。因此,我们将提供两种购买 L2 gas 的选项:

  1. 燃烧 L1 Gas
  2. 将 ETH 发送到 Optimism Portal(尚不支持)

payable 版本(选项 2)可能会有折扣(或者相反,#1 有溢价)。

对于 bedrock 的初始版本,仅支持 #1。

关于防止恶意攻击

购买每个区块中所有存款 gas 的成本必须足够昂贵,以防止攻击者恶意攻击网络的所有存款。攻击者会观察到内存池中的存款,并通过购买足够 gas 的存款来抢先交易,从而使其他存款恢复。最大资源限制越小,这种攻击就越容易实施。通过拥有较大的资源限制以及较大的弹性乘数可以缓解此攻击。这意味着目标资源使用量保持较小,从而为存款基础费用在购买最大资源限制时上涨留出了很大的空间。

实际上,这种攻击的实施成本应该太高,但是如果一个非常富有的对手确实决定在一段时间内恶意攻击网络存款,那么将采取措施以确保存款能够在网络上进行处理。

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

0 条评论

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