多维费用市场的气体溢出

本文为机器翻译
展示原文

多维度费用市场的气体溢出

感谢Vitalik Buterin的回馈和主要想法。

TL;DR:本文分析了EIP-7999的“通用溢出”,将其作为一种最小方式,以保留CALL周围的传统标量保留 gas 模式,同时避免将所有聚合 EVM gas 定价为价格最高的 EVM 资源的主要低效之处。

背景

多维费用市场是首选的最终资源定价机制,它能够精确控制资源消耗。每种稀缺资源,例如执行、状态成长、呼叫数据或blob数据,都有其自身的基准费用,交易则根据其在这些资源上的实际消耗量支付费用。这使得市场能够根据开发者认为安全的基准目标和限制,公平地为资源定价,并允许在这些限制范围内最大限度地消耗资源。本文讨论的实现方案是EIP-7999 ,它基于EIP-7706构建,允许用户设定单个max_fee ,从而在保持良好经济效益的同时简化用户体验。

多维费用市场的主要问题在于如何处理 gas 可观测性(内省)。具体来说,一些合约依赖CALL系列操作码(以下简称CALL )的 gas 参数,仅转发呼叫方可用 gas 的一部分,并将剩余 gas 保留给呼叫合约中待完成的其他操作。由于 gas 参数并非多维的,依赖 gas 内省的开发者将无法精细控制跨资源维度转送的 gas 量。虽然总体而言,我们应该摒弃 gas 内省,但目前尚不清楚开发者和使用者是否能够接受这种做法。

因此,EIP-7999 概述了处理带有 gas 参数的子呼叫的选项。一个基本方法是让 EVM 重新解释带有 gas 参数g_c g c的传统子调用,方法是转发调用者在每个资源维度中剩余预算的一部分。如果呼叫者在维度j j中的剩余预算为g_j g j ,且剩余的总 gas 为g_r := \sum_j g_j g r : = j g j ,且剩余的总 gas 为g_r := \sum_j g_j g r : = ∑ j g j ,则该呼叫在每个维度 j j 中转送\lfloor g_j \ cdot \ min ( 1 , g_c / g_r ) g joor dot \ min

透过让使用者提供单一的交易 gas 限额并聚合 EVM gas ,处理过程可以像目前在 EVM 中一样进行。缺点是,如果聚合的 EVM gas 限额最终没有被最高价的 EVM 资源消耗掉,使用者就必须指定一个不必要的高max_fee分配

j具有基本费用b_j和反事实资源限制g_j确定性 EVM 资源的索引,令i具有确定性 gas 使用量g_i和基本费用b_i的资源的索引。定义价格最高的 EVM 资源为b_max := max_j b_j b_max : = max j b_j 聚合交易gas限制g_a g_a 其中g_a = \sum_j g_j + \sum_i g_i g_a = j g_j + i g_i 对于使用单一 EVM gas 限制g_j g_j 所需的预执行基本费用覆盖率增加了:

\sum_j (b_\text{max} - b_j)g_j.
j ( b max b j ) g j

资金核查中的基本费用部分(包括确定性资源i i )变为:

m \ge (g_a-\sum_i g_i) b_\text{max} + \sum_i b_i g_i.
m ( g a i g i ) b max + i b i g i

缓解这一问题的建议方案包括:

  • 当交易后检查显示交易的总费用超过其max_fee时,使该区块无效。
  • 赋予The Block生产者在交易执行后进行资金补足的能力和责任。
  • 允许交易者根据需要为所有维度设定限制。

最后一个选项是混合 EVM gas 设计。这是 EIP-7999 中提出的最令人满意的方案。依赖具有 gas 参数的CALL的使用者可以使用聚合 EVM gas,而所有其他使用者可以为每个资源设定单独的限额。部分使用者只能聚合某些资源。然而,对于那些依赖聚合 EVM gas 的使用者来说,不必要的高max_fee分配仍然存在。

通用溢出

改进「混合EVM gas」方案的一个想法是「通用溢出」。它降低了在涉及带有gas参数的CALL的常见用例中,必须按最昂贵的EVM资源定价的gas比例。 Vitalik提出的设计如下:

我们有 n+1 个维度的 gas,其中 n+1 是「通用溢出」。所有操作都会尝试从其预定的 gas 维度中消耗,如果耗尽,则开始从通用溢出中消耗。 GAS 操作码传回剩余​​的通用溢出,而 CALL 操作码会转送所有新的 gas 维度,但仅限于指定的通用溢出。

换句话说,传统的CALL会转送所有剩余的常规多维 gas 限制,而标量 gas 参数只控制转送多少通用溢位。这保留了传统 gas 可观测性的关键保留 gas 用例:呼叫者仍然可以使用标量 gas 值来预留CALL后的缓冲区,而大部分执行成本则在多维维度上计算。图 1 显示了一个子调用,其中通用溢出以绿色显示,常规 gas 限制以红色显示。

通用溢出
通用溢出1920×937 63.4 KB

图 1.绿色显示的是通用溢出,它与红色显示的常规多维资源限制一起作为附加事务参数指定。传统的CALL会转送所有剩余的常规多维资源限制,而其标量 gas 参数则决定转送多少共享的通用溢位。一旦资源的常规限制耗尽,事务就会使用其通用溢出。

在这种设计下,执行前的基本费用资金检查不再要求max_fee覆盖交易中所有 EVM gas 中最昂贵的资源,而仅涵盖通用溢出额。在通常情况下,这主要是呼叫者在执行CALL后希望保留的 gas,因此这部分费用可以仅占分配给交易的总 EVM gas 的一小部分,从而显著提高经济效率。由于通用溢出限额o_u可以用于任何 EVM 资源j 因此执行前的基本费用资金检查需要:

m \ge \sum_j b_j g_j + o_u b_\text{max} + \sum_i b_i g_i.
m j b j g j + o u b max + i b i g i

改进之处在于不再将b_\text{max} b max应用于完整的 EVM gas 限制\sum_j g_j j g j 。保守的区块有效性预检查需要预留容量,以应对o_u o u完全用于任何单一 EVM 资源的可能性(例如,透过在每个 EVM 维度中预留o_u o u 的余裕)。

还有第二个特性,可能有用也可能没用:具有多个分支的复杂交易可以依赖通用溢出作为更灵活的 gas 缓冲,但代价是必须根据最昂贵的资源预先为该缓冲分配更多资金。

一个限制在于,通用溢位无法保留GAS作为剩余执行能力的量测。虽然 EVM 会追踪常规的多维限制,但传统的GAS操作码仅报告标量CALL参数可控制的通用溢位。因此,需要了解每个维度中剩余常规 gas 量的合约可能需要新的多维自省机制,或者需要足够的通用溢出以确保标量介面的有效性。

溢出向量

理想情况下,也应从执行前资金检查中移除最坏情况项o_u b_\text{max} o u b max 。因此,通用溢出的一个潜在扩展是使用「溢出向量」 \mathbf{o} o ,其中每个分量对应nEVM 资源,而不是使用单一通用溢位。一个可能的遗留可观测性规则是令o_r := \sum_j o_j o r : = j o j ,并让GAS操作码回传o_r o r 。对于o_r> 0 使用gas参数g_cCALL会转发每个资源维度j溢出的gas 量 \lfloor o_j \cdot \min(1, g_c/o_r)\rfloor o j min ( 1 , g c / o r ) 如果o_r = 0 不会转发任何向量溢出。与通用溢出不同,此聚合仅是特定资源向量的标量投影,因此可能无法准确指示保留的 gas 混合是否足够。常规的多维限制会被完整转送。

图 2 展示了一个典型的用例:子呼叫在常规的多维限制下执行,而后续的呼叫方处理可以使用保留的溢位向量。

溢出向量
溢出向量1762×1374 84.4 KB

图 2.黄色为溢出向量,红色部分为每个常规多维资源限制额外增加一个溢出向量。子呼叫中传递的溢出向量量由CALL gas 参数相对于溢出向量总 gas 量的比例决定。一旦资源的常规限制耗尽,事务将使用其关联的溢出。在本例中,呼叫方保留了完整的溢出向量以供后续使用:子呼叫在传递给它的常规多维限制下执行,而后续的呼叫方处理可以使用保留的溢位向量。

如果使用者对交易在每个资源维度上的溢出使用量有可靠的估计,则溢出向量可以避免分配过多的max_fee 。由于每个溢出组件都是单独指定和定价的,因此预付资金检查无需对价格最高的资源收取任何溢出预算,除非该预算实际上已分配给该资源:

m \ge \sum_j b_j (g_j + o_j) + \sum_i b_i g_i.
m j b j ( g j + o j ) + i b i g i

鉴于其增加的复杂性,目前尚不清楚溢出向量的经济效率提升是否足以使其优于通用溢出。当使用者仅依赖溢出向量时,合约通常无法在执行时间根据GAS传回的总 gas 值来确定剩余的溢出 gas 是否足以满足预期的执行需求(例如,子呼叫后要执行的操作)。这促使我们提出下文讨论的混合方案:如果保留的 gas 的资源组合不确定,使用者可以对不确定的部分使用通用溢出,而对预先已知的资源使用仍然使用溢出向量。

其他变体

天然气预订

CALL呼叫中,转送与指定 gas 成比例的 gas 限制向量(先前探讨过的基准方法)与转送与指定 gas 成比例的溢位向量之间的差异在于,溢位向量的资源组成可以与呼叫者的常规 gas 限制向量不同。这很有利,因为呼叫合约可能需要为不同的CALL后操作(例如,清理、计费、日志产生)预留 gas,而这些操作与被呼叫者的操作不同,这意味著资源组合可能不同。溢出向量允许预留与转送的 gas 不同的资源组合。

一种更具侵入性但可能更简洁的EVM改进方案是允许合约在运行时明确地预留特定的gas向量。从概念上讲,这会将呼叫者的剩余预算拆分为可用(可转送)向量和预留(不可转送)向量,后者保证在CALL执行后仍然保留。这可以透过以下两种方式实现:(a) 使用一个操作码将gas从可用向量转移到预留向量(并可选择稍后释放);(b) 使用一个多维CALL变体,该变体同时接受转发的gas向量和预留的gas向量。

混合溢出

本文提出的两种方法也可以结合使用,允许同时存在溢位向量\mathbf{o} o和通用溢位o_u o u 。当某个资源的常规 gas 限制耗尽时,协定首先使用该资源的溢位向量分量o_j o j中剩余的 gas,然后才使用通用溢位o_u o u中的 gas。相应的基本费用资金检查如下:

m \ge \sum_j b_j (g_j + o_j) + o_u b_\text{max} + \sum_i b_i g_i.
m j b j ( g j + o j ) + o ub max + i b i g i

然而,这种混合方案也需要一条相容旧版演算法的可观测性规则。最直接的规则是, GAS操作码只回传o_u o u ,而旧版CALL gas 参数只控制转送多少通用溢位。因此,溢出向量不会透过旧版 gas 可观测性暴露出来,并且在旧版CALL下,它会保留在呼叫者手中,供子调用之后的任何处理使用。

结论

通用溢位提供了一种最小化的方法,既能保留CALL的传统标量保留 gas 模式,又能避免将所有聚合 EVM gas 定价为最高价 EVM 资源所带来的主要效率低下问题。透过将最高价资金需求限制在显式提供的通用溢出范围内,它为合约提供了一个熟悉的保留 gas 缓冲,同时又不会放弃大部分执行过程中的多维定价。溢位向量和混合解决方案或许可以提供一些有用的改进。尽管如此,通用溢出仍然为协调 gas 可观测性和多维费用市场提供了一个直觉的基准。


来源
免责声明:以上内容仅为作者观点,不代表Followin的任何立场,不构成与Followin相关的任何投资建议。
喜欢
收藏
评论