多維度費用市場的 Gas 溢出機制分析

多維度費用市場的 Gas 溢出機制分析

ethresear.ch·

本文分析了針對 EIP-7999 的通用溢出設計,這是一種在多維度費用市場中保留傳統 Gas 內省模式,同時避免將所有資源按最高價格定價所導致的低效率問題的最小化方案。

感謝 Vitalik Buterin 的回饋與核心構思。

摘要: 本文分析了針對 EIP-7999 的「通用溢出」(Universal overflow)機制。這是一種最小化方案,旨在保留圍繞 CALL 指令的傳統標量保留 Gas(retained-gas)模式,同時避免將所有聚合 EVM Gas 以最高價 EVM 資源定價所導致的主要效率低下問題。

背景

多維度費用市場是理想的資源定價終局機制,能夠精確控制資源消耗。每種稀缺資源(如執行、狀態增長、calldata 或 blob 數據)都有各自的基礎費用(base fee),交易根據其在這些資源上的實際消耗進行支付。這使得市場能根據開發者認為安全的目標和限制對資源進行公平定價,並允許資源在這些限制內以最大容量被消耗。這裡考慮的實現方案是 EIP-7999,它基於 EIP-7706,允許用戶設置單一的 max_fee,在簡化用戶體驗的同時保持良好的經濟效率。

多維度費用市場的主要擔憂是如何處理 Gas 的可觀測性(內省,introspection)。具體而言,某些合約依賴 CALL 系列操作碼(以下簡稱 CALL)的 Gas 參數,僅轉發調用者可用 Gas 的一部分,並為調用合約中剩餘的操作保留 Gas。由於 Gas 參數不是多維度的,依賴 Gas 內省的開發者將缺乏在不同資源維度上精確控制轉發量的能力。雖然從長遠來看,擺脫 Gas 內省是理想的,但目前尚不清楚這是否能被開發者和用戶接受。

因此,EIP-7999 概述了處理帶有 Gas 參數的子調用(subcalls)的選項。基準方法是讓 EVM 通過在每個資源維度中轉發調用者剩餘預算的一部分,來重新解釋帶有 Gas 參數 $g_c$ 的傳統子調用。如果調用者在維度 $j$ 的剩餘預算為 $g_j$,且剩餘聚合 Gas 為 $g_r := \sum_j g_j$,則該調用在每個維度 $j$ 中轉發 $\lfloor g_j \cdot \min(1, g_c/g_r)\rfloor$。

通過讓用戶提供單一的交易 Gas 限制並聚合 EVM Gas,處理過程可以像目前的 EVM 一樣進行。缺點是,每當聚合 EVM Gas 限制最終未在最高價的 EVM 資源中消耗時,用戶必須設定一個不必要的高 max_fee 分配 $m$。

令 $j$ 為具有基礎費用 $b_j$ 和反事實單項資源限制 $g_j$ 的非確定性 EVM 資源索引,令 $i$ 為具有確定性 Gas 使用量 $g_i$ 和基礎費用 $b_i$ 的資源索引。定義最高價 EVM 資源為 $b_\text{max} := \max_j b_j$。聚合交易 Gas 限制 $g_a$(其中 $g_a = \sum_j g_j + \sum_i g_i$)相對於使用單獨的 EVM Gas 限制 $g_j$,會增加所需的執行前基礎費用覆蓋額:

$\sum_j (b_\text{max} - b_j)g_j$。

資金檢查中的基礎費用部分(包括確定性資源 $i$)變為:

$m \ge (g_a-\sum_i g_i) b_\text{max} + \sum_i b_i g_i$。

緩解此問題的建議選項包括:

  • 當交易後檢查顯示交易的總費用超過其 max_fee 時,使該區塊無效。
  • 賦予區塊生產者在執行後檢查中提供任何缺失資金的能力和責任。
  • 賦予交易者為所有維度提供限制的能力(如果他們願意)。

最後一個選項是「混合 EVM Gas」設計。它是 EIP-7999 中提出的最令人滿意的選項。依賴帶有 Gas 參數的 CALL 的用戶可以使用聚合 EVM Gas,而所有其他用戶可以為每種資源設置單獨的限制。某些用戶可以僅聚合特定資源。然而,對於那些依賴聚合 EVM Gas 的用戶,不必要的高 max_fee 分配仍然存在。

通用溢出 (Universal overflow)

改進「混合 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 限制為紅色。

圖 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$。

改進之處在於 $b_\text{max} $ 不再應用於完整的 EVM Gas 限制 $\sum_j g_j$。保守的區塊有效性預檢查需要為 $o_u$ 完全花費在任何單一 EVM 資源上的可能性預留空間(例如,在每個 EVM 維度中預留 $o_u$ 的餘裕)。

還有第二個功能,可能有用也可能沒用:具有多個分支的複雜交易可以依賴通用溢出作為更具同質化(fungible)的 Gas 緩衝區,代價是必須根據最昂貴的資源為該緩衝區預分配更多資金。

一個限制是,通用溢出不再將 GAS 視為所有剩餘執行能力的衡量標準。雖然 EVM 追蹤常規的多維限制,但傳統的 GAS 操作碼僅報告標量 CALL 參數可以控制的通用溢出。因此,需要知道每個維度剩餘多少常規 Gas 的合約可能需要一種新的多維內省機制,或者需要足夠的通用溢出以使標量接口保持有用。

溢出向量 (Overflow vector)

理想情況下,還能從執行前資金檢查中移除最壞情況項 $o_u b_\text{max}$。因此,通用溢出的一個潛在擴展是使用「溢出向量」$\mathbf{o}$,為 $n$ 個 EVM 資源中的每一個提供一個組件,而不是單一的通用溢出。一種可能的傳統可觀測性規則是令 $o_r := \sum_j o_j$,並讓 GAS 操作碼返回 $o_r$。對於 $o_r>0$,帶有 Gas 參數 $g_c$ 的 CALL 在每個資源維度 $j$ 中轉發 $\lfloor o_j \cdot \min(1, g_c/o_r)\rfloor$ 的溢出 Gas;如果 $o_r=0$,則不轉發向量溢出。與通用溢出不同,這種聚合只是資源特定向量的標量投影,因此對於保留的 Gas 組合是否充足,它可能是一個糟糕的運行時信號。常規的多維限制則被完整轉發。

圖 2 說明了一個典型用例:子調用在常規多維限制下執行,而隨後的調用者端處理可以使用保留的溢出向量。

圖 2. 黃色為溢出向量,在紅色的常規多維資源限制基礎上,每種資源增加一個溢出量。子調用中傳遞的溢出向量量由 CALL Gas 參數相對於溢出向量的聚合 Gas 決定。一旦某種資源的常規限制耗盡,交易就會利用其相關的溢出。在示例中,調用者為以後預留了完整的溢出向量:子調用在傳遞給它的常規多維限制下執行,而隨後的調用者端處理可以使用保留的溢出向量。

如果用戶對交易在每個資源維度中的溢出使用量有可靠的估計,溢出向量可以避免過度的 max_fee 分配。因為每個溢出組件都是單獨指定和定價的,前期資金檢查不需要按最高價資源收取任何溢出預算,除非該預算實際分配給了該資源:

$m \ge \sum_j b_j (g_j + o_j) + \sum_i b_i g_i$。

目前尚不清楚溢出向量提高的經濟效率是否足以證明其比通用溢出更值得採用,畢竟它增加了複雜性。當用戶僅依賴溢出向量時,合約通常無法在運行時從 GAS 返回的聚合 Gas 中判斷,剩餘的跨資源溢出 Gas 組合是否足以支持預定的執行(例如,設定在子調用之後執行的操作)。這引發了下文討論的混合變體:如果保留 Gas 的資源組合不確定,用戶可以對該不確定部分使用通用溢出,同時對預先知道的資源使用量仍使用溢出向量。

其他變體

Gas 預留 (Gas reservation)

在 CALL 中按比例轉發 Gas 限制向量(之前探索的基準方法)與按比例轉發溢出向量之間的區別在於,溢出向量可以選擇與調用者的常規 Gas 限制向量具有不同的資源組成。這是有益的,因為調用合約可能希望為與被調用者不同的一組 CALL 後操作(例如清理、會計、發送日誌)預留 Gas,這意味著資源組合可能不同。溢出向量使得預留與轉發內容不同的組合變為可能。

一種更具侵入性但可能更整潔的 EVM 更改是讓合約在運行時顯式預留特定的 Gas 向量。從概念上講,這將調用者剩餘的預算拆分為可用(可轉發)向量和預留(不可轉發)向量,後者保證留給 CALL 後的執行。這可以通過以下方式實現:(a) 通過一個將 Gas 從可用向量移動到預留向量的操作碼(並可選擇稍後釋放),或 (b) 通過一個同時接收轉發 Gas 向量和預留 Gas 向量的多維 CALL 變體。

混合溢出 (Hybrid overflow)

本文提出的兩種方法也可以結合使用,同時允許溢出向量 $\mathbf{o}$ 和通用溢出 $o_u$。當某種資源的常規 Gas 限制耗盡時,協議首先使用該資源溢出向量組件 $o_j$ 中的任何剩餘 Gas,然後才使用通用溢出 $o_u$ 中的 Gas。相應的基礎費用資金檢查將是:

$m \ge \sum_j b_j (g_j + o_j) + o_u b_\text{max} + \sum_i b_i g_i$。

然而,這種混合方案也需要一個傳統可觀測性規則。最直接的規則是 GAS 操作碼僅返回 $o_u$,且傳統 CALL Gas 參數僅控制轉發多少通用溢出。因此,溢出向量不會通過傳統 Gas 可觀測性暴露,並且在傳統 CALL 下,它將保留在調用者手中,用於子調用之後進行的任何處理。

結論

通用溢出提供了一種最小化方式,在保留圍繞 CALL 的傳統標量保留 Gas 模式的同時,避免了將所有聚合 EVM Gas 以最高價 EVM 資源定價的主要效率低下問題。通過將最高價資金要求限制在顯式提供的通用溢出中,它為合約提供了一個熟悉的保留 Gas 緩衝區,而不會放棄對大部分執行的多維度定價。溢出向量和混合解決方案可能會提供有用的改進,但通用溢出為協調 Gas 可觀測性與多維度費用市場提供了一個直觀的基準。

ethresear.ch

相關文章

  1. 支持採用仿射計量與統一 Calldata 價格的可變 PTC 截止日期方案

    9 天前

  2. 為何可變有效載荷截止時間僅能帶來約 6% 的提升

    大約 1 個月前

  3. EVM 堆疊與記憶體使用統計報告

    2 個月前

  4. 以太坊狀態與突發資源價格彈性的實證分析

    2 個月前

  5. 區塊已死,Blob 萬歲

    24 天前