关于Blob市场、基础费用调整和优化
特别感谢Ansgar、Barnabé、Alex、Georgios、Roman和Dankrad的意见和讨论,以及Bert、Gajinder和Max在这个话题上的努力!
总结:
所有建议的更新在理论上都是有意义的。我们是否应该在Pectra中实施它们,这取决于具体情况。
- 提高最低Blob费用可以加快价格发现。
- 自动化Blob gas更新分数可以使其具有未来可扩展性。
- 标准化超额gas可以防止在增加目标后分叉导致Blob基础费用下降的边缘情况,但如果我们不这样做也不会发生任何坏事。
- 使基础费用缩放对称可以确保机制保持不变(在0和6个Blob的极端情况下,缩放±12.5%)
我建议将所有这些变更总结在EIP-7762中,并在我们将目标/最大值从3/6改为4/6时一起发布。如果我们担心Pectra添加更多变更可能会变得太大,我建议按以下顺序实施,重要性递减:
- 增加Blob数量。
a) 保守地做4/6,或者如果我们更有信心的话,做6/9。
b) 发布EIP-7623以确保EL有效载荷大小显著减小,为更多Blob腾出空间。 - 发布概述的基础费用变更。
Blob费用机制概述
随着EIP-4844的推出,以太坊为其费用市场增加了一个新的维度。Blob附带自己的基础费用,为数据提供专用空间,允许应用程序和Rollup在不需要EVM执行的情况下在链上发布信息。
Blob费用结构由基础费用更新规则管理,该规则近似于以下公式:
base_fee_per_blob_gas = MIN_BASE_FEE_PER_BLOB_GAS * e**(excess_blob_gas / BLOB_BASE_FEE_UPDATE_FRACTION)
在这个等式中,excess_blob_gas
代表Blob gas使用总量与目标量(TARGET_BLOB_GAS_PER_BLOCK
每块)的差额。与EIP-1559费用机制类似,该公式是自我调整的:随着超额Blob gas的增加,base_fee_per_blob_gas
呈指数上升,这会抑制过度使用并推动超额回到Rollup认为基础费用是"公平"价格的水平。
该过程如下进行:如果第N块消耗X
个Blob gas,那么在第N+1块,excess_blob_gas
增加X - TARGET_BLOB_GAS_PER_BLOCK
。因此,第N+1块的base_fee_per_blob_gas
会以e**((X - TARGET_BLOB_GAS_PER_BLOCK) / BLOB_BASE_FEE_UPDATE_FRACTION)
的因子进行调整。
参数BLOB_BASE_FEE_UPDATE_FRACTION
控制Blob基础费用的最大可能变化率。该费率设置为实现大约1.125
每块的最大增加和减少,基于e**(TARGET_BLOB_GAS_PER_BLOCK / BLOB_BASE_FEE_UPDATE_FRACTION)
。
在初始推出时,Blob价格预计会很低,并逐步上升,直到市场找到平衡或"公平"价格(即价格发现)。EIP-4844引入的Blob费用市场遵循与EIP-1559类似的结构,具有根据需求动态调整的基础费用。
达到"价格发现"的时刻
截至2024年11月,以太坊已达到一定需求水平,Rollup将不再无论基础费用如何都发布Blob,而是发布一定数量的Blob以保持基础费用相当稳定。人们喜欢称之为"价格发现"阶段,尽管它只意味着在某个特定时间点,某个特定基础费用X被视为公平价格。在"价格发现"时,Rollup将不再无视Blob基础费用而持续发布6个Blob,因为它已不再可忽略。然而,在没有增加供给(即更多可用Blob)的情况下,对Blob的需求增加将导致Blob费用上升。对于以下内容,请原谅我使用这个简化的"价格发现"概念,尽管价格每12秒都会随每个时隙发现。
建议的调整及其优缺点
展望即将到来的Pectra分叉,对扩展Blob(从3/6到4/6或更复杂的6/9)的需求很明显,这可能需要对Blob费用市场进行调整。
在以下部分,我将概述4个对Blob费用市场的潜在变更,并讨论每个变更的相关利弊。
- 调整最低基础费用:最简单的调整之一是修改
MIN_BASE_FEE
参数,正如Max Resnick所建议的。 - 自动化Blob基础费用更新分数:一个简单的变更,以确保Blob基础费用更新分数随目标Blob数量的变化而缩放。
- 标准化超额gas:Bert Kellerman和Gajinder提出的另一个建议是"标准化"超额gas使用的计算。
- 对称化基础费用更新:调整基础费用公式的一个建议。
1. 增加MIN_BASE_FEE_PER_BLOB_GAS (EIP-7762)
Blob基础费用从0开始,然后缓慢上升,直到达到价格发现的点。每~6个块(6个Blob),基础费用翻倍,但从1 wei到一个更合理的价格(例如5 gwei)还有很长的路要走。在达到那个水平之前,价格可能会大幅波动,Rollup基本上获得了"过于便宜"的去中心化应用。
上述EIP提议将最低基础费用从1 wei提高到约0.034 gwei。这将缩短达到价格发现的时间,从而更快地推动Rollup向被视为"公平"的更稳定价格范围发展。
对于基础费用从1上升到5 gwei,需要...
\frac{\ln\left(\frac{\text{base_fee_target}}{\text{base_fee_start}}\right)}{\text{growth_rate}} = \frac{\ln(5 \times 10^9 / 1)}{0.117} \approx 190 \text{ blocks}ln(base_fee_targetbase_fee_start)growth_rate=ln(5×109/1)0.117≈190 个块,而且所有这些块都需要有6个Blob。这相当于大约38分钟。
MIN_BASE_FEE_PER_BLOB_GAS
,我们将把这个持续时间降低到...
\frac{\ln(5 \times 10^9 / 2^{25})}{0.117} \approx \text{42 blocks},相当于8.4分钟。
有一个非常重要的警告/实施细节:
我们必须在更新MIN_BASE_FEE_PER_BLOB_GAS
时重置多余的gas。
原因是,否则我们会在分叉后立即看到不可预测的、极端的blob基础费用峰值。这是因为最低基础费用充当基础费用的乘数,对它的小调整可能会极大地影响基础费用,如果在此之前累积的多余gas没有被重置。
这里有一个例子:一个看似"无关紧要"的从1 wei增加到5 wei的增加就足以使基础费用飙升,然后rollups将不得不等待一段时间,直到价格再次平静下来。
总结
优点:
- 更快的"价格发现"。
- 在供给 < 需求的时候,波动性更小。
缺点:
- 需要触碰协议,而我们通常不会"微调"那些没有问题的东西。
- 由于多余的gas被重置,我们必须再次经历价格发现的阶段,尽管从一个更高的水平开始,从而缩短了这个时间。
这可以简单地归结为"固化与优化",在我看来,没有对错,尽管我个人认为不触碰协议也有价值。
2. 自动化Blob基础费用更新比例
这个变化非常简单:目前,更新比例设置为3338477,如EIP-4844中所指定的。这个数字是通过做\frac{target\_gas}{ln(1.125)}得到的。如果我们现在用这个公式替换硬编码的数字,我们就可以确保维持所需的\pm 12.5%变化。
3. 多余gas的标准化
这是一个旨在避免在增加blob目标后分叉出现陡峭基础费用下降的提议。
为了避免在增加blob目标的分叉后立即出现基础费用的突然下降,这个提议建议调整我们计算多余gas的方式。通常,基础费用应该平稳变化 - 每个时隙最多12.5%。通过标准化多余gas,我们可以确保基础费用保持稳定,不会超出预期的12.5%限制而急剧下降,从而保持费用调整的可预测性和渐进性。
简单地说,我们不是累积多余gas,而是累积标准化的多余gas。这样目标blob数量就不重要了。
通过在多余gas计算中引入标准化因子,我们可以调整累积的多余gas,使其与新目标保持成比例。这确保了基础费用平稳调整,即使目标发生变化,费用动态也能保持一致。
标准化涉及使用恒定因子缩放多余gas,使其无论目标值如何,都能以一致的方式反映偏离目标的程度。这种方法将基础费用调整保持在预期的限制范围内,防止突然下降或飙升,从而扰乱网络的费用市场。
总结
优点
- 避免了目标增加后分叉导致的基础费用下降。
- 为blob用户提供更多可预测性
缺点
- 另一个潜在的"微优化"。
使blob基础费用更新对称于目标
通过将目标改为target=\frac{max}{2}不再成立,我们改变了目标与最小/最大值之间的距离。例如,将blob目标设为4,最大值设为6,则向上有2个blob的空间,向下有4个blob的空间。
现在,负面方向的空间比正面方向的空间大,基础费用可以下降得更快,而不是上升。
一个简单的修复方法如下:
我们首先确定gas使用量与目标之间的差额(与我们现在做的一样)。然后我们应用一个缩放因子,该因子只是target/(max-target)
应用于"空间"较少的一侧(例如,在4/6目标/最大值时应用于"向上"一侧)。
calc_excess_blob_gas
函数将如下所示:
定义 计算超额blob gas(父区块头: Header) -> int:缩放因子 = 目标blob gas每块 / (最大blob gas每块 - 目标blob gas每块)blob gas差值 = 父区块头.blob gas使用 - 目标blob gas每块如果 blob gas差值 > 0:缩放差值 = blob gas差值 * 缩放因子否则:缩放差值 = blob gas差值超额blob gas = 最大(0, 父区块头.超额blob gas + 缩放差值)返回 超额blob gas
当然,这只在最大-目标<目标的情况下有效max−target<target的情况下,我们甚至可以更一般化,但我想这可能没什么用。
为了更好地理解这个对称化过程的影响,让我们来看一个简单的例子:
- 假设我们有三个槽位:
- 前两个槽位各包含6个blob。
- 最后一个槽位包含0个blob。
- 这导致总共有12个blob跨越这3个槽位。
- 目标设置为每块4个blob,最大为6个blob。
对称与非对称基础费用调整:
对称基础费用:
- 基础费用大约增加12.5%两次(对应两个6-blob槽位),然后减少12.5%一次(对应0-blob槽位)。
- 经过这些调整后,基础费用最终高于其初始值。
非对称基础费用:
- 在6-6-0 blob序列之后,基础费用保持不变。
这个例子突出了对称调整的好处:
- 6-6-0 blob序列推动我们走向极端(最大利用率followed by none),这是不可取的。
- 理想情况下,负载应该在三个槽位之间更均匀分布(例如,每个块4个blob)。
- 对称基础费用通过"惩罚"不均匀使用(6个blob而不是4个)来抑制极端行为,从而促进更平衡的负载。
- 当然,人们可以争辩说blob用户可能不关心推高基础费用,因为他们可能只需要在每个时期发布几次blob,因此不关心他们6-blob发布之后的槽位。不过,这种论点是短视的。
总结
优点
- 确保"价格发现"的速度与现在一样快。
- 确保"极端"(0和6个blob)导致相同百分比的增加/减少。
缺点
- 又一个"微优化",即使不这样做一切也可能很好。
- 引入一些路径依赖性。例如,在gas\_used= target \pm 1\ blobsgas_used=target±1 blobs之间跳跃会导致基础费用随时间稳步上升。通过避免发布超过目标的blob,可以抵消这种行为,甚至可能激励更平衡的发布策略。