Alert Source Discuss
⚠️ Draft Standards Track: Core

EIP-7915: 自适应均值回复 blob 定价

考虑到长期平均值的费用计划,以便在非弹性需求下快速恢复平衡

Authors Anders Elowsson (@anderselowsson)
Created 2025-03-23
Discussion Link https://ethereum-magicians.org/t/adaptive-mean-reversion-blob-pricing/23243
Requires EIP-4844

摘要

重新设计 calc_excess_blob_gas() 中的超额 blob gas 更新,以便在当前费用低于长期平均水平时,blob 基础费用在高 gas 使用期间的上涨幅度大于在低 gas 使用期间的下降幅度。这为基础费用建立了一个平滑适应的、中性的下限。指数移动平均 (EMA) 在线性域中计算,并存储为头变量。

动机

对 blobspace 的需求是费用非弹性的,导致 blob 基础费用可能因总需求的微小变化而过度波动。在当前情况下,1 wei 的费用范围的下限在经济上无关紧要,但可能会在消耗的 blob 少于目标的区块周期后达到。在需求增加期间,现有的费用机制需要持续的接近完整的区块周期才能重新建立平衡。这加剧了资源消耗的峰值,这可能会阻碍吞吐量的有效扩展。此外,用户可能需要间歇性地在第一价格拍卖中竞争以获得包含,从而降低 UX。由于 ETH 代币价格和流通供应量的变化,以及协议扩展吞吐量的能力,适当的费用范围将不可避免地发生变化。为了保持中立和面向未来,运营范围应相对于长期平均费用建立,平滑地影响消耗的 blob 的平衡数量。因此,此 EIP 引入了一种新的费用更新机制,该机制在响应需求变化时考虑了长期平均费用。这使得协议能够快速收敛到理想的平衡状态,同时保持中立和面向未来。

Figure 1

图 1. 针对提出的费用机制(绿色)、当前机制(黑色)和 EIP-7762(红色)的阈值机制对各种 blob 数量的响应。当需求发生变化时,提出的机制平滑地收敛到适当的平衡状态,相对于长期平均基本费用 $\bar{f}_g$(在此示例中为 4 gwei)建立费用。当从下方收敛到 $\bar{f}_g$ 时,费用调整速度比从上方发散时更快。

规范

参数

Constant Value Short description
EMA_DECAY 2**18 EMA 衰减率的倒数(每个插槽)
MEAN_REVERSION_DEADBAND 64 均值回复效应加速的费用比率
MEAN_REVERSION_FULLBAND 10**6 均值回复效应停止增加的费用比率

函数

更新 EIP-4844 中的函数 calc_excess_blob_gas()。根据长期基本费用和当前基本费用之间的比率计算均值回复权重 w。当当前基本费用低于长期基本费用时,权重通过平滑地增加已使用的 gas 并减少 gas 目标来影响超额 gas 的更新(参见下面的图 2)。变量 Upw 进行上采样以保留精度。请注意,该函数应用 integer_squareroot(),该函数必须在执行层实现;它当前在共识层实现。在 MEAN_REVERSION_FULLBAND 处进行阈值处理以及 Up 的战略部署允许该机制在内部依赖 uint64 类型。

def calc_excess_blob_gas(parent: Header) -> int:
    if parent.excess_blob_gas + parent.blob_gas_used < TARGET_BLOB_GAS_PER_BLOCK:
        return 0

    # Compute upsampled mean reversion weight w based on the EMA fee ratio
    # 基于 EMA 费用比率计算上采样的均值回归权重 w
    Up = 2**16
    if get_base_fee_per_blob_gas(parent) > parent.base_fee_per_blob_gas_ema:
        w = Up
    else:
        if parent.base_fee_per_blob_gas_ema // get_base_fee_per_blob_gas(parent) > MEAN_REVERSION_FULLBAND:
            ratio = Up * MEAN_REVERSION_FULLBAND
        else:
            ratio = Up * parent.base_fee_per_blob_gas_ema // get_base_fee_per_blob_gas(parent)
        w = (ratio + Up * MEAN_REVERSION_DEADBAND) // (MEAN_REVERSION_DEADBAND + 1)
        for _ in range(3):
            w = integer_squareroot(w * Up)
    
    # Return excess blob gas based on adjusted gas usage and target under mean reversion
    # 根据均值回复下调整后的 gas 使用量和目标返回超额 blob gas
    return parent.excess_blob_gas + parent.blob_gas_used * w // Up - TARGET_BLOB_GAS_PER_BLOCK * Up // w

基础费用的指数移动平均值 (EMA) 基于上一个区块的 base_fee_per_blob_gasbase_fee_per_blob_gas_ema 在一个新函数中更新:

def calc_base_fee_per_blob_gas_ema(parent: Header) -> int:
    return parent.base_fee_per_blob_gas_ema +
        get_base_fee_per_blob_gas(parent) // EMA_DECAY -
        parent.base_fee_per_blob_gas_ema // EMA_DECAY

标头扩展

当前标头编码使用 uint 字段 base_fee_per_blob_gas_ema 进行扩展。对于第一个后分叉块,parent.base_fee_per_blob_gas_ema 的计算结果为 4*10**9 (4 gwei)。

执行层验证

执行层上的区块有效性条件被扩展以断言 base_fee_per_blob_gas_ema 已正确更新:

    ...
    # Check that the base fee per blob gas EMA was updated correctly
    # 检查每个 blob gas 的基本费用 EMA 是否已正确更新
    assert block.header.base_fee_per_blob_gas_ema == calc_base_fee_per_blob_gas_ema(block.parent.header)

理由

供需关系

自从引入 blob 以来,blob 边际消费者的预订费用一直非常低。每当需求增加时,需要持续的近满区块才能恢复平衡,该机制会间歇性地诉诸第一价格拍卖,blob 消费者认为这是一种较差的 UX。由此产生的资源消耗的峰值对于扩展 blobspace 来说是次优的。从根本上讲,问题在于 Ethereum 面临着费用非弹性的需求曲线,同时运营着完全非弹性的供应曲线——供应固定为 TARGET_BLOB_GAS_PER_BLOCK。当费用非弹性的供需曲线之间形成平衡时,即使总需求的微小变化也会导致平衡费用的巨大变化。该提案平滑地增加了供应曲线的弹性,因为它偏离了长期平均值,从而限制了低于平均值的平衡费用的形成。结合平均方向上更快的费用调整,在需求暂时转移期间可以快速建立理想的平衡。

供需不是固定的,并且由于 ETH 代币价格和流通供应量的变化,以及协议扩展吞吐量的能力,适当的平衡将在未来不可避免地发生变化。为了保持中立和面向未来,定价机制应因此以相对的方式运作,理想情况下应锚定到计算出的长期平均值。

当需求无法满足供应时,生产者可以降低单价或减少供应量以重新建立平衡。如果它销售独特的商品,但试图避免闲置产能或过度资源使用造成的效率低下,它可以逐渐减少两者,平稳地沿着其扩张路径移动,以在给定的需求曲线下获得最佳平衡。以太坊可以通过逐渐降低价格平衡吞吐量来响应需求的暂时下滑,从而平滑地减少价格保持不变的消耗 blob 的数量。这是通过调整费用更新来实现的,以平滑地降低对低 gas 使用的响应,从而隐式地控制输出。以太坊无法通过降低吞吐量来响应需求的持续下滑,因为这种下滑可能意味着情况发生了变化,并且价格现在太高(假设协议保持中立)。需要明确的是,以太坊今天已经在需求下滑期间通过在 1 wei 处进行控制来降低吞吐量。一旦达到某个固定阈值,该阈值会阻止价格进一步下跌,从而通过不允许低于阈值的 gas 使用量的区块影响未来的费用来降低吞吐量。然而,从固定响应计划到低于目标需求的完全无响应的即时转变大概不能反映协议的 blobspace 生产扩张路径(另请参见图 1)。

建议的基础费用更新计划

更新计划遵循以下设计原则:

  • 保持中立和面向未来,关于供需变化。
  • 当基础费用高于或略低于长期平均水平时,依靠正常的费用更新计划。
  • 平滑地调整费用更新,使其随着比率 $\bar{f}_g/f_g$ 的增长,对低 gas 使用的响应变得更少,而对高 gas 使用的响应变得更多。
  • 当价格相对较低 ($f_g<\bar{f}_g$) 时,在需求上升期间快速提高费用,并在需求下降期间缓慢降低费用。换句话说,添加一个均值回复效应(这与前一点密切相关)。
  • 费用更新必须在所有适用的 $\bar{f}_g/f_g$ 比率下随 blob 数量平稳变化,以便用户或验证者不会有策略地在每个区块中包含特定数量的 blob。
  • 即使比率 $\bar{f}_g/f_g$ 发生显着变化,也要避免极端响应。

首先计算一个均值回复权重

\[w = \sqrt[8]{\frac{\bar{f}_g/f_g + D}{D+1}},\]

其中 $D$ 是常数 MEAN_REVERSION_DEADBAND,设置为 64。可以通过应用现有的(在共识层)函数 integer_squareroot() 三次来计算第八个根。然后,将插槽 $n$ 的超额 gas 字段 $e_g$ 的更新从

\[e_{g(n)} = e_{g(n-1)} + c_g - t_g\]

更改为

\[e_{g(n)} = e_{g(n-1)} + c_gw - t_g/w.\]

图 2 说明了在应用来自 Pectra 的 blob 目标时产生的费用更新计划。费用越低于平均水平,为使费用保持固定而必需消耗的 blob 就越少。这最终导致建立平衡,即使在低需求下也是如此。过渡是渐进的,允许对需求的变化做出平滑的响应。请注意,垂直 blob 间距在所有比率下都保持平滑,从而阻止用户或验证者有策略地适应区块内 blob 的消耗。

Figure 2

图 2. 在 Pectra blob 常数下,提出的跨 $f_g/\bar{f}_g$ 比率的 blob 费用更新计划。当比率约为或高于 1 时,将应用基准费用更新计划。当费用低于平均水平时,为使费用保持固定而必需消耗的 blob 就会更少。

费用计划是在范围 MEAN_REVERSION_FULLBAND = 10**6 上计算的。因此,如果图 2 中的比率低于 $10^{-6}$,则应用 $10^{-6}$ 处的计划。这种方法可以防止费用计划爆炸,允许费用在根本不消耗 blob 的情况下逐渐进一步降低,并防止由于高比率而导致的溢出(因此允许在 calc_excess_blob_gas() 函数中使用较小的 uint64)。或者,也可以通过将一个常数 $c$(设置在 1-2 个 blob 值的 gas 范围内)添加到费用更新计划来限制操作区域:

\[e_{g(n)} = e_{g(n-1)} + c_gw - t_g/w + c(w-1).\]

该机制仅在 $f_g < \bar{f}_ g.$ 时应用均值回复。虽然在两个方向上均值回复都有好处,但解决 $f_g<\bar{f}_ g$ 的情况更为重要。此外,来自 EIP-7691 的更新计划(在 $f_g \geq \bar{f}_g$ 时应用)在 0 个 blob 时的降幅大于在最大值时的增幅。

最初考虑使用围绕 1 的比率的对称更新时间表,因为来自 Pectra 的目标未以 MAX_BLOB_GAS_PER_BLOCK/2 为中心。但是,一个形式良好的对称费用更新时间表可能无法实现 TARGET_BLOB_GAS_PER_BLOCK 的吞吐量,即使它通过保持费用固定来响应目标 gas 消耗。原因是高于目标 $x$ 个 blob 和低于目标 $x$ 个 blob 的区块的费用更新将不是互惠的。因此,平衡会以略低于 TARGET_BLOB_GAS_PER_BLOCK 的吞吐量结算,价格略高于依赖具有相同目标的非对称更新计划时的价格。相反,建议的费用更新计划中间过渡到对称时间表,因为费用比率下降(参见图 2)。

计算长期平均基础费用

基本费用 $\bar{f}_g$ 的平均值保存在标头变量 base_fee_per_blob_gas_ema 中,该变量计算为指数移动平均值。每个插槽,$\bar{f}_g$ 通过取

\[\bar{f}_ {g(n)} = \bar{f}_ {g(n-1)} + \frac{f_{g(n-1)} - \bar{f}_{g(n-1)}}{m},\]

进行更新,其中 $m$ 是一个常数 EMA_DECAY=2**18。此设置给出的半衰期约为一个月。如果 EMA_DECAY 设置得稍高一些,则该机制保证会在未来几年内影响 blob 定价。例如,初始化 $\bar{f}_ g=4\times10^9$(如提议的那样)并将半衰期设置为四个月 (EMA_DECAY=2**20) 可确保在激活一年后 $\bar{f}_ g>5\times10^8$。如果在也提高吞吐量的硬分叉中包含建议的机制,则可以将其视为奖励,因为平滑下限运行在 $\bar{f}_ g$ 以下几个数量级。

图 3 显示了使用 $4\times10^9$ 作为起始值,$\bar{f}_{g}$ 在 2024 年 11 月至 2025 年 3 月期间的演变情况。请注意,可以通过在每个更新步骤中至少减去 1 来允许 EMA 费用低于 EMA_DECAY(但这不是规范中的功能的一部分)。

EMA 在线性域中计算以保留可加性并保持可解释性。在超额 gas 上取对数域中的平均值(类似于线性域中的几何平均值)将对较低费用的细粒度波动产生不适当的影响。这将使较低 gas 阈值的变化非常具有影响力,从而创建难以解释和推理的反馈循环;特别是由于 1 wei 处的阈值将始终是固定的,并且由于供需变化,可能会随着时间的推移而逐渐发挥作用。但是,请注意,虽然严格首选在线性域中计算 EMA,但可以转换回对数域以存储和应用超额 blob gas EMA。下一个小节将描述此选项。

Figure 3

图 3. 应用于几个月历史 blob 基础费数据的具有建议设置的指数移动平均值。

替代方法

上一个子部分中引用了一种替代的自适应均值回复结构方式,这里将对其进行描述。不同之处在于,协议将依赖并存储 base_fee_per_blob_gas_ema 的对数域表示形式:excess_blob_gas_ema。EMA 计算仍将在线性域中执行,但 get_base_fee_per_blob_gas() 及其逆—依赖于新的 fake_log() 函数—将在计算期间应用,以首先进入线性域,然后返回到对数域

\[\bar{e}_ {g(n)} = \log\Biggl[\exp\bigl(\bar{e}_ {g(n-1)}\bigr) + \frac{\exp\bigl(e_ {g(n-1)}\bigr) - \exp\bigl(\bar{e}_ {g(n-1)}\bigr)}{m}\Biggr].\]

原则上,calc_excess_blob_gas() 中的权重计算可以在对数域中执行:

\[w = \frac{\bar{e}_g-e_g + D}{D+1},\]

但是,例如,$D$ 将根据适用硬分叉的相关超额 gas 缩放进行调整。两种方法的费用更新计划将非常相似,因此选择主要取决于架构偏好。

安全注意事项

如果当前费用低于平均水平几个数量级,则 blob 基本费用在完整区块期间会翻倍。因此,纳入的单区块延迟会导致用户支付两倍的费用,这可能会影响纳入和费用市场策略。但是,鉴于这种激进的费用计划仅在远低于平均水平的费用下运作,因此实际影响应受到限制。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Anders Elowsson (@anderselowsson), "EIP-7915: 自适应均值回复 blob 定价 [DRAFT]," Ethereum Improvement Proposals, no. 7915, March 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7915.