多維費用市場的氣體溢出

本文為機器翻譯
展示原文

多維度費用市場的氣體溢出

感謝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相關的任何投資建議。
喜歡
收藏
評論