多維度Gas定價

進階5/29/2024, 9:57:46 AM
長期以來,人們一直對多維度Gas的概念感興趣,而隨着EIP-4844的推出,我們實際上在今天的以太坊上實現了多維度Gas。本文探討了這種方法的好處以及進一步發展的前景。

在以太坊中,資源直到最近都被限制並通過一種名爲“Gas”的單一資源進行定價。Gas是衡量處理特定交易或區塊所需“計算努力”的量度。Gas將多種類型的“努力”合並在一起,主要包括:

  • 原始計算(例如,ADD,MULTIPLY)
  • 讀取和寫入以太坊存儲(例如,SSTORE,SLOAD,ETH轉帳)
  • 數據帶寬
  • 生成區塊的ZK-SNARK證明的成本

例如,我發送的這筆交易總共消耗了47,085Gas。這分爲:(i)21,000Gas的“基礎成本”,(ii)交易中包含的字節數據需要的1556Gas,(iii)讀寫存儲所需的16,500Gas,(iv) 生成日志所需的2149Gas,其餘用於EVM執行。用戶必須支付的交易費用與交易消耗的Gas成正比。一個區塊最多可以包含30百萬Gas,通過EIP-1559的目標機制不斷調整Gas價格,確保區塊平均包含15百萬Gas。

這種方法有一個主要的優點:因爲所有東西都合並成一個虛擬資源,所以它導致了非常簡單的市場設計。優化交易以最小化成本很容易,優化區塊以收集盡可能高的費用也相對容易(不包括MEV),並且沒有奇怪的激勵機制鼓勵某些交易與其他交易捆綁以節省費用。

但這種方法也有一個主要的缺點:它將不同的資源視爲可以相互轉換,而實際上網路可以處理的潛在限制並不是這樣的。理解這個問題的一種方法是查看下面的圖表:

Gas 限制強制執行以下約束:

𝑥1𝑑𝑎𝑡𝑎+𝑥2𝑐𝑜𝑚𝑝𝑢𝑡𝑎𝑡𝑖𝑜𝑛<𝑁

。實際的底層安全約束通常更接近

𝑚𝑎𝑥(𝑥1𝑑𝑎𝑡𝑎,𝑥2𝑐𝑜𝑚𝑝𝑢𝑡𝑎𝑡𝑖𝑜𝑛)<𝑁

。這種差異導致氣體限制不必要地排除實際安全的區塊,或接受實際不安全的區塊,或兩者的某種混合。

如果有

𝑛

具有不同安全限制的資源,那麼一維氣體可能會降低吞吐量高達一個因子

𝑛

。因此,長期以來,人們對“ 多維氣體, 與 EIP-4844 今天,我們實際上在以太坊上運行了多維氣體。這篇文章探討了這種方法的好處以及進一步增強這種方法的前景。

Blobs:Dencun中的多維度Gas

在今年年初,平均區塊大小爲150 kB。這個大小中的很大一部分是滾動數據:第二層協議在鏈上存儲數據以提高安全性。這些數據很昂貴:即使在滾動上的交易成本比以太坊L1上對應的交易便宜約5-10倍,但即使這個成本對於許多用例來說也太高了。

爲什麼不降低calldataGas成本(當前爲每個非零字節16Gas,每個零字節4Gas),以使滾動更便宜?我們以前做過這樣的事情,我們可以再次做到。這裏的答案是:一個區塊的最壞情況大小是30,000,000/16=1,875,000個非零字節,而網路已經勉強能處理那麼大的區塊。再次將成本降低4倍將將最大值提高到7.5 MB,這將是一個巨大的安全風險。

這個問題最終通過在每個區塊中引入一個單獨的滾動友好數據空間“blobs”來處理。這兩個資源有不同的價格和不同的限制:在Dencun硬分叉後,一個以太坊區塊最多可以包含(i)30百萬Gas,和(ii)6個blob,每個blob可以包含約125 kB的calldata。這兩種資源有不同的價格,由分別調整的類似於EIP-1559的價格機制調整,以實現每個區塊平均使用15百萬Gas和3個blob。

結果,滾動變得便宜了100倍,滾動上的交易量增加了3倍多,而理論上的最大區塊大小只增加了一點點:從約1.9 MB增加到約2.6 MB。

Rollups上的交易費用,由growthepie.xyz提供。引入帶有多維度定價的blobs的Dencun硬分叉發生在2024年3月13日。

多維度Gas和無狀態客戶端

在不久的將來,關於無狀態客戶端的存儲證明將出現類似的問題。無狀態客戶端是一種新型客戶端,能夠在本地不存儲或幾乎不存儲數據的情況下驗證鏈。無狀態客戶端通過接受區塊中交易所需接觸的特定以太坊狀態的證明來實現這一點。

無狀態客戶端接收到一個區塊,以及證明該區塊執行所接觸的特定狀態部分(例如帳戶餘額、代碼、存儲)當前值的證明。這允許節點在沒有任何自身存儲的情況下驗證區塊。

根據讀取類型的不同,存儲讀取成本爲2100-2600Gas,存儲寫入成本更高。平均而言,一個區塊執行大約1000次存儲讀取和寫入(包括ETH餘額檢查、SSTORE和SLOAD調用、合約代碼讀取和其他操作)。然而,理論最大值爲30,000,000 / 2,100 = 14,285次讀取。無狀態客戶端的帶寬負載與此數字成正比。

目前,計劃通過將以太坊的狀態樹設計從Merkle Patricia樹遷移到Verkle樹來支持無狀態客戶端。然而,Verkle樹並不具備抗量子能力,並且對於新一波的STARK證明系統來說並不理想。因此,許多人對通過二進制Merkle樹和STARKs來支持無狀態客戶端更感興趣——要麼完全跳過Verkle,要麼在Verkle過渡後幾年內升級到更成熟的STARKs。

基於哈希的STARK證明二進制哈希樹分支有許多優點,但它們的主要缺點是生成證明需要很長時間:雖然Verkle樹每秒可以證明超過十萬個值,但基於哈希的STARKs通常每秒只能證明幾千個哈希,並且證明每個值需要包含許多哈希的“分支”。

根據今天由超優化的證明系統(如Binius和Plonky3)和專門的哈希(如Vision-Mark-32)投射的數據,似乎在一段時間內實用的證明每秒不超過1000個值,但不是14,285個值。平均區塊是可以接受的,但最壞情況下的區塊,可能由攻擊者發布,將會破壞網路。

我們處理這種情況的“默認”方法是重新定價:使存儲讀取變得更昂貴,以將每個區塊的最大值減少到更安全的水平。然而,我們已經多次這樣做了,再次這樣做會使許多應用程序變得過於昂貴。更好的方法是多維度Gas:分別限制和收費存儲訪問,每個區塊的平均使用量保持在1000次存儲訪問,但設置一個每區塊例如2000次的限制。

更廣泛的多維度Gas

另一個值得考慮的資源是狀態大小增長:增加以太坊狀態大小的操作,從那時起全節點將需要持有這些數據。狀態大小增長的獨特屬性在於,限制其增長的理由完全來自長期的持續使用,而不是突發性增長。因此,對於增加狀態大小的操作(例如零到非零的SSTORE,合約創建),引入一個單獨的Gas維度可能會有價值,但目標不同:我們可以設置一個浮動價格來針對特定的平均使用量,但不設置每區塊的限制。

這展示了多維度Gas的一個強大特性:它讓我們可以分別考慮每種資源的(i)理想平均使用量和(ii)安全的每區塊最大使用量的問題。與其基於每區塊最大值設置Gas價格,並讓平均使用量隨之變化,我們有2𝑛個自由度來設置2𝑛個參數,根據對網路安全的考慮來調整每一個。

更復雜的情況,比如兩個資源的安全性考量部分疊加,可以通過使一個操作碼或資源消耗多種類型的Gas來處理(例如,零到非零的SSTORE可能花費5000無狀態客戶端證明Gas和20000存儲擴展Gas)。

每筆交易的最大值:實現多維度Gas的簡便方法

設( x_1 )爲數據的Gas成本,( x_2 )爲計算的Gas成本,那麼在單維度Gas系統中,我們可以將交易的Gas成本寫成:

[ \text{gas} = x_1 \times \text{data} + x_2 \times \text{computation} ]

在這種方案中,我們定義交易的Gas成本爲:

[ \text{gas} = \max(x_1 \times \text{data}, x_2 \times \text{computation}) ]

即交易的收費基於其消耗的資源中較多的一項,而不是數據加計算的總和。這可以很容易地擴展到更多維度(例如,[ \max(…, x_3 \times \text{storage_access}) ])。

不難看出,這種方法在保持安全性的同時提高了吞吐量。區塊中的數據理論最大量仍然是[ \frac{\text{GASLIMIT}}{x_1} ],與單維度Gas方案完全相同。同樣,計算的理論最大量是[ \frac{\text{GASLIMIT}}{x_2} ],這也與單維度Gas方案相同。然而,任何同時消耗數據和計算的交易的Gas成本都減少了。

這大致是擬議的EIP-7623中採用的方案,用於在減少最大區塊大小的同時進一步增加blob數量。EIP-7623中的具體機制稍微復雜一些:它保持當前的calldata價格爲每字節16Gas,但增加了每字節48Gas的“底價”;交易支付的費用是[ 16 \times \text{bytes} + \text{execution_gas} ]和[ 48 \times \text{bytes} ]中的較高者。結果是,EIP-7623將區塊中理論上的最大交易calldata從約1.9 MB減少到約0.6 MB,同時保持大多數應用的成本不變。該方法的優點在於,它與當前的單維度Gas方案相比變化很小,因此很容易實施。

有兩個缺點:

  1. 對於重資源的交易,即使區塊中的所有其他交易對該資源的使用很少,仍然需要支付大量費用。

  2. 它會激勵數據密集型和計算密集型的交易合並到一個捆綁中以節省成本。

我認爲,盡管存在這些缺點,但EIP-7623風格的規則,無論是對於交易calldata還是其他資源,都能帶來足夠大的好處,使其值得實施。然而,如果我們願意投入(顯著更高的)開發努力,有一種更理想的方法。

多維度EIP-1559:更難但理想的策略

首先讓我們回顧一下“常規”EIP-1559是如何工作的。我們將重點關注在EIP-4844中爲blobs引入的版本,因爲它在數學上更優雅。

我們跟蹤一個參數,excess_blobs。在每個區塊期間,我們設置:

[ \text{excess_blobs} \leftarrow \max(\text{excess_blobs} + \text{len(block.blobs)} - \text{TARGET}, 0) ]

其中TARGET = 3。也就是說,如果一個區塊的blobs數量超過目標值,excess_blobs增加;如果少於目標值,excess_blobs減少。然後我們設置blob_basefee = exp(excess_blobs / 25.47),其中exp是指數函數的近似值[ \exp(x) = 2.71828^x ]。

也就是說,每當excess_blobs增加約25,blob basefee就增加約2.7倍。如果blobs變得過於昂貴,平均使用量下降,excess_blobs開始減少,價格自動再次下降。blob的價格不斷調整,以確保區塊平均填充一半,即每個區塊平均包含3個blobs。

如果使用量在短期內激增,則限制生效:每個區塊最多只能包含6個blobs,在這種情況下,交易可以通過提高優先費用來競爭。然而,在正常情況下,每個blob只需要支付blob_basefee加上一點點的優先費用作爲包含激勵。

這種定價方式在以太坊的Gas中已經存在多年:2020年引入的EIP-1559採用了非常類似的機制。通過EIP-4844,我們現在對Gas和blobs有兩個獨立浮動的價格。

多維度EIP-1559的實現

爲了將多維度EIP-1559應用到其他資源(例如存儲訪問、計算、數據傳輸),我們可以爲每個資源引入類似的機制:

  1. 定義目標值和參數:爲每個資源(例如存儲訪問、計算)定義一個目標值(TARGET)和一個調整參數(類似於25.47)。

  2. 跟蹤多維度參數:跟蹤每個資源的過量使用量(excess_resources),例如excess_storage, excess_computation。

  3. 調整基礎費用:根據過量使用量調整每個資源的基礎費用(basefee),例如:

[ \text{excess_storage} \leftarrow \max(\text{excess_storage} + \text{len(block.storage_accesses)} - \text{TARGET}, 0) ]

[ \text{storage_basefee} = \exp(\text{excess_storage} / \text{ADJUSTMENT_PARAMETER}) ]

  1. 自動調整價格:資源的價格會不斷調整,以確保每個區塊對該資源的平均使用量達到目標值。

  2. 處理短期峯值:如果某個資源在短期內使用量激增,則設置每個區塊的最大值,交易可以通過提高優先費用來競爭。

實施的挑戰與優勢

實施多維度EIP-1559比簡單的每交易最大值方案復雜得多,但其優勢在於能夠更精確地控制每個資源的使用量和價格,確保網路的安全性和效率。

挑戰:

  • 需要更復雜的開發和實現工作。

  • 必須精確設置每個資源的目標值和調整參數。

  • 增加了網路和礦工的計算和處理負擔。

優勢:

  • 更準確的資源使用控制。

  • 通過動態調整基礎費用,確保網路穩定和安全。

  • 減少對個別資源的過度依賴,平衡網路負載。

總之,多維度EIP-1559雖然實現起來更難,但其帶來的控制和優化能力可以大大提升以太坊網路的長期穩定性和可擴展性。

原則上,我們可以爲存儲讀取和其他類型的操作添加更多獨立浮動的費用,不過有一個問題,我將在下一節中詳細說明。

對於用戶來說,體驗與今天非常相似:你支付的不再是一個基礎費用,而是兩個基礎費用,但你的錢包可以將其抽象掉,只顯示你預期的費用和最大可能支付的費用。

對於區塊構建者來說,大多數時候最優策略與今天相同:包含任何有效的交易。大多數區塊並不滿——無論是在Gas還是在blobs上。唯一具有挑戰性的情況是,當有足夠的Gas或足夠的blobs超過區塊限制時,構建者需要解決一個多維度背包問題來最大化其利潤。然而,即使在這種情況下,也存在相當好的近似算法,與MEV(最大可提取價值)相比,使用專有算法優化利潤的收益要小得多。

對於開發者來說,主要的挑戰在於需要重新設計EVM(以太坊虛擬機)及其週邊基礎設施的特性,因爲這些特性目前是圍繞一個價格和一個限制設計的,現在需要適應多個價格和多個限制的設計。對於應用開發者來說,一個問題是優化變得稍微困難了:在某些情況下,你不能再明確地說A比B更高效,因爲如果A使用更多的calldata而B使用更多的執行Gas,那麼當calldata便宜時A可能更便宜,而當calldata昂貴時A可能更貴。然而,開發者仍然可以通過基於長期歷史平均價格進行優化來獲得相當好的結果。

多維度EIP-1559的實施將使以太坊網路在資源使用和價格控制方面更加精確和靈活,盡管這需要更復雜的開發和實現工作。對於用戶來說,體驗變化不大;對於區塊構建者來說,挑戰主要在於處理資源使用超過區塊限制的情況;對於開發者來說,需要適應新的多價格和多限制的設計,並在優化過程中考慮更多因素。盡管有這些挑戰,多維度EIP-1559帶來的控制和優化能力可以大大提升以太坊網路的長期穩定性和可擴展性。

多維度定價、EVM 和子調用

有一個問題並未出現在 blobs 中,也不會出現在 EIP-7623 或針對 calldata 的“全”多維度定價實現中,但如果我們嘗試單獨定價狀態訪問或任何其他資源,則會出現:EVM 中子調用的Gas限制。

EVM 中的Gas限制存在於兩個地方。首先,每個交易設置一個Gas限制,這限制了該交易中可以使用的Gas總量。其次,當一個合約調用另一個合約時,可以設置自己的Gas限制。這允許合約調用它們不信任的其他合約,並且仍然保證在調用後它們會有剩餘的Gas用於執行其他計算。

例如,在一個帳戶抽象交易中,一個帳戶調用另一個帳戶,並只給被調用方一個有限的Gas量,以確保即使被調用方消耗了分配給它的所有Gas,外部調用仍然可以繼續運行。

在不同類型的執行之間使Gas多維度化,似乎要求子調用爲每種類型的Gas提供多個限制,這需要對 EVM 進行深度變更,並且不與現有應用程序兼容。這就是爲什麼多維度Gas提案通常停留在兩個維度:數據和執行。數據(無論是交易 calldata 還是 blobs)僅在 EVM 外部分配,因此爲了使 calldata 或 blobs 單獨定價,不需要對 EVM 內部進行任何更改。

我們可以考慮一種“EIP-7623 風格的解決方案”。這裏有一個簡單的實現:在執行期間,對存儲操作收費提高4倍;爲了簡化分析,假設每次存儲操作收費10000Gas。在交易結束時,退還最小值(7500 * 存儲操作次數,執行Gas)。結果是,在減去退款後,用戶被收費:

[ \text{execution_gas} + 10000 \times \text{storage_operations} - \min(7500 \times \text{storage_operations}, \text{execution_gas}) ]

這等於:

[ \text{execution_gas} + 2500 \times \text{storage_operations} ]

等式結果

[ \max(\text{execution_gas} + 2500 \times \text{storage_operations}, 10000 \times \text{storage_operations}) ]

這反映了 EIP-7623 的結構。另一種方法是實時跟蹤 storage_operations 和 execution_gas,並根據在調用操作碼時 [ \max(\text{execution_gas} + 2500 \times \text{storage_operations}, 10000 \times \text{storage_operations}) ] 的增加情況來收取費用,選擇2500或10000。這避免了交易過度分配Gas,並通過退款大部分收回。

盡管無法爲子調用獲得細粒度的權限控制:子調用可能消耗交易的所有“廉價”存儲操作配額,但我們得到的解決方案足夠好,使合約在進行子調用時可以設置限制,並確保子調用執行完成後,主調用仍有足夠的Gas進行所需的後處理。

我能想到的最簡單的“全多維度定價解決方案”是:我們將子調用Gas限制視爲比例性的。假設有 ( k ) 種不同類型的執行,每個交易設置一個多維度限制 ( L_1, \ldots, L_k )。假設在當前執行點,剩餘Gas爲 ( g_1, \ldots, g_k )。假設調用 CALL 操作碼,子調用Gas限制爲 ( S )。則 ( s_1 = S ),然後 ( s_2 = s_1 \cdot \frac{g_2}{g_1} ),( s_3 = s_1 \cdot \frac{g_3}{g_1} ) 等等。

我們將第一種Gas類型(實際上是 VM 執行)視爲一種特權的“計量單位”,然後分配其他類型的Gas,使子調用在每種類型的可用Gas中獲得相同的百分比。這有些醜陋,但最大化了向後兼容性。如果我們想在不同類型的Gas之間使方案更“中立”,以犧牲向後兼容性爲代價,我們可以讓子調用Gas限制參數表示當前上下文中剩餘Gas的一部分(例如, [ \frac{1, \ldots, 63}{64} ])。

無論哪種情況,都需要強調的是,一旦引入多維度執行Gas,本質上的復雜性就會增加,這似乎難以避免。因此,我們的任務是進行復雜的權衡:我們是否接受 EVM 層面上的更多復雜性,以便安全地解鎖顯著的 L1 可擴展性增益,如果是,哪個具體提案最適合協議經濟學和應用開發者?很可能上述提案都不是最佳方案,仍有空間提出更優雅和更好的解決方案。

聲明:

  1. 本文轉載自[[維塔利克·布特林]],版權歸原作者所有[維塔利克·布特林]。若對本次轉載有異議,請聯系Gate Learn團隊,他們會及時處理。
  2. 免責聲明:本文所表達的觀點和意見僅代表作者個人觀點,不構成任何投資建議。
  3. Gate Learn 團隊將文章翻譯成其他語言。除非另有說明,否則禁止復制、分發或抄襲翻譯文章。

多維度Gas定價

進階5/29/2024, 9:57:46 AM
長期以來,人們一直對多維度Gas的概念感興趣,而隨着EIP-4844的推出,我們實際上在今天的以太坊上實現了多維度Gas。本文探討了這種方法的好處以及進一步發展的前景。

在以太坊中,資源直到最近都被限制並通過一種名爲“Gas”的單一資源進行定價。Gas是衡量處理特定交易或區塊所需“計算努力”的量度。Gas將多種類型的“努力”合並在一起,主要包括:

  • 原始計算(例如,ADD,MULTIPLY)
  • 讀取和寫入以太坊存儲(例如,SSTORE,SLOAD,ETH轉帳)
  • 數據帶寬
  • 生成區塊的ZK-SNARK證明的成本

例如,我發送的這筆交易總共消耗了47,085Gas。這分爲:(i)21,000Gas的“基礎成本”,(ii)交易中包含的字節數據需要的1556Gas,(iii)讀寫存儲所需的16,500Gas,(iv) 生成日志所需的2149Gas,其餘用於EVM執行。用戶必須支付的交易費用與交易消耗的Gas成正比。一個區塊最多可以包含30百萬Gas,通過EIP-1559的目標機制不斷調整Gas價格,確保區塊平均包含15百萬Gas。

這種方法有一個主要的優點:因爲所有東西都合並成一個虛擬資源,所以它導致了非常簡單的市場設計。優化交易以最小化成本很容易,優化區塊以收集盡可能高的費用也相對容易(不包括MEV),並且沒有奇怪的激勵機制鼓勵某些交易與其他交易捆綁以節省費用。

但這種方法也有一個主要的缺點:它將不同的資源視爲可以相互轉換,而實際上網路可以處理的潛在限制並不是這樣的。理解這個問題的一種方法是查看下面的圖表:

Gas 限制強制執行以下約束:

𝑥1𝑑𝑎𝑡𝑎+𝑥2𝑐𝑜𝑚𝑝𝑢𝑡𝑎𝑡𝑖𝑜𝑛<𝑁

。實際的底層安全約束通常更接近

𝑚𝑎𝑥(𝑥1𝑑𝑎𝑡𝑎,𝑥2𝑐𝑜𝑚𝑝𝑢𝑡𝑎𝑡𝑖𝑜𝑛)<𝑁

。這種差異導致氣體限制不必要地排除實際安全的區塊,或接受實際不安全的區塊,或兩者的某種混合。

如果有

𝑛

具有不同安全限制的資源,那麼一維氣體可能會降低吞吐量高達一個因子

𝑛

。因此,長期以來,人們對“ 多維氣體, 與 EIP-4844 今天,我們實際上在以太坊上運行了多維氣體。這篇文章探討了這種方法的好處以及進一步增強這種方法的前景。

Blobs:Dencun中的多維度Gas

在今年年初,平均區塊大小爲150 kB。這個大小中的很大一部分是滾動數據:第二層協議在鏈上存儲數據以提高安全性。這些數據很昂貴:即使在滾動上的交易成本比以太坊L1上對應的交易便宜約5-10倍,但即使這個成本對於許多用例來說也太高了。

爲什麼不降低calldataGas成本(當前爲每個非零字節16Gas,每個零字節4Gas),以使滾動更便宜?我們以前做過這樣的事情,我們可以再次做到。這裏的答案是:一個區塊的最壞情況大小是30,000,000/16=1,875,000個非零字節,而網路已經勉強能處理那麼大的區塊。再次將成本降低4倍將將最大值提高到7.5 MB,這將是一個巨大的安全風險。

這個問題最終通過在每個區塊中引入一個單獨的滾動友好數據空間“blobs”來處理。這兩個資源有不同的價格和不同的限制:在Dencun硬分叉後,一個以太坊區塊最多可以包含(i)30百萬Gas,和(ii)6個blob,每個blob可以包含約125 kB的calldata。這兩種資源有不同的價格,由分別調整的類似於EIP-1559的價格機制調整,以實現每個區塊平均使用15百萬Gas和3個blob。

結果,滾動變得便宜了100倍,滾動上的交易量增加了3倍多,而理論上的最大區塊大小只增加了一點點:從約1.9 MB增加到約2.6 MB。

Rollups上的交易費用,由growthepie.xyz提供。引入帶有多維度定價的blobs的Dencun硬分叉發生在2024年3月13日。

多維度Gas和無狀態客戶端

在不久的將來,關於無狀態客戶端的存儲證明將出現類似的問題。無狀態客戶端是一種新型客戶端,能夠在本地不存儲或幾乎不存儲數據的情況下驗證鏈。無狀態客戶端通過接受區塊中交易所需接觸的特定以太坊狀態的證明來實現這一點。

無狀態客戶端接收到一個區塊,以及證明該區塊執行所接觸的特定狀態部分(例如帳戶餘額、代碼、存儲)當前值的證明。這允許節點在沒有任何自身存儲的情況下驗證區塊。

根據讀取類型的不同,存儲讀取成本爲2100-2600Gas,存儲寫入成本更高。平均而言,一個區塊執行大約1000次存儲讀取和寫入(包括ETH餘額檢查、SSTORE和SLOAD調用、合約代碼讀取和其他操作)。然而,理論最大值爲30,000,000 / 2,100 = 14,285次讀取。無狀態客戶端的帶寬負載與此數字成正比。

目前,計劃通過將以太坊的狀態樹設計從Merkle Patricia樹遷移到Verkle樹來支持無狀態客戶端。然而,Verkle樹並不具備抗量子能力,並且對於新一波的STARK證明系統來說並不理想。因此,許多人對通過二進制Merkle樹和STARKs來支持無狀態客戶端更感興趣——要麼完全跳過Verkle,要麼在Verkle過渡後幾年內升級到更成熟的STARKs。

基於哈希的STARK證明二進制哈希樹分支有許多優點,但它們的主要缺點是生成證明需要很長時間:雖然Verkle樹每秒可以證明超過十萬個值,但基於哈希的STARKs通常每秒只能證明幾千個哈希,並且證明每個值需要包含許多哈希的“分支”。

根據今天由超優化的證明系統(如Binius和Plonky3)和專門的哈希(如Vision-Mark-32)投射的數據,似乎在一段時間內實用的證明每秒不超過1000個值,但不是14,285個值。平均區塊是可以接受的,但最壞情況下的區塊,可能由攻擊者發布,將會破壞網路。

我們處理這種情況的“默認”方法是重新定價:使存儲讀取變得更昂貴,以將每個區塊的最大值減少到更安全的水平。然而,我們已經多次這樣做了,再次這樣做會使許多應用程序變得過於昂貴。更好的方法是多維度Gas:分別限制和收費存儲訪問,每個區塊的平均使用量保持在1000次存儲訪問,但設置一個每區塊例如2000次的限制。

更廣泛的多維度Gas

另一個值得考慮的資源是狀態大小增長:增加以太坊狀態大小的操作,從那時起全節點將需要持有這些數據。狀態大小增長的獨特屬性在於,限制其增長的理由完全來自長期的持續使用,而不是突發性增長。因此,對於增加狀態大小的操作(例如零到非零的SSTORE,合約創建),引入一個單獨的Gas維度可能會有價值,但目標不同:我們可以設置一個浮動價格來針對特定的平均使用量,但不設置每區塊的限制。

這展示了多維度Gas的一個強大特性:它讓我們可以分別考慮每種資源的(i)理想平均使用量和(ii)安全的每區塊最大使用量的問題。與其基於每區塊最大值設置Gas價格,並讓平均使用量隨之變化,我們有2𝑛個自由度來設置2𝑛個參數,根據對網路安全的考慮來調整每一個。

更復雜的情況,比如兩個資源的安全性考量部分疊加,可以通過使一個操作碼或資源消耗多種類型的Gas來處理(例如,零到非零的SSTORE可能花費5000無狀態客戶端證明Gas和20000存儲擴展Gas)。

每筆交易的最大值:實現多維度Gas的簡便方法

設( x_1 )爲數據的Gas成本,( x_2 )爲計算的Gas成本,那麼在單維度Gas系統中,我們可以將交易的Gas成本寫成:

[ \text{gas} = x_1 \times \text{data} + x_2 \times \text{computation} ]

在這種方案中,我們定義交易的Gas成本爲:

[ \text{gas} = \max(x_1 \times \text{data}, x_2 \times \text{computation}) ]

即交易的收費基於其消耗的資源中較多的一項,而不是數據加計算的總和。這可以很容易地擴展到更多維度(例如,[ \max(…, x_3 \times \text{storage_access}) ])。

不難看出,這種方法在保持安全性的同時提高了吞吐量。區塊中的數據理論最大量仍然是[ \frac{\text{GASLIMIT}}{x_1} ],與單維度Gas方案完全相同。同樣,計算的理論最大量是[ \frac{\text{GASLIMIT}}{x_2} ],這也與單維度Gas方案相同。然而,任何同時消耗數據和計算的交易的Gas成本都減少了。

這大致是擬議的EIP-7623中採用的方案,用於在減少最大區塊大小的同時進一步增加blob數量。EIP-7623中的具體機制稍微復雜一些:它保持當前的calldata價格爲每字節16Gas,但增加了每字節48Gas的“底價”;交易支付的費用是[ 16 \times \text{bytes} + \text{execution_gas} ]和[ 48 \times \text{bytes} ]中的較高者。結果是,EIP-7623將區塊中理論上的最大交易calldata從約1.9 MB減少到約0.6 MB,同時保持大多數應用的成本不變。該方法的優點在於,它與當前的單維度Gas方案相比變化很小,因此很容易實施。

有兩個缺點:

  1. 對於重資源的交易,即使區塊中的所有其他交易對該資源的使用很少,仍然需要支付大量費用。

  2. 它會激勵數據密集型和計算密集型的交易合並到一個捆綁中以節省成本。

我認爲,盡管存在這些缺點,但EIP-7623風格的規則,無論是對於交易calldata還是其他資源,都能帶來足夠大的好處,使其值得實施。然而,如果我們願意投入(顯著更高的)開發努力,有一種更理想的方法。

多維度EIP-1559:更難但理想的策略

首先讓我們回顧一下“常規”EIP-1559是如何工作的。我們將重點關注在EIP-4844中爲blobs引入的版本,因爲它在數學上更優雅。

我們跟蹤一個參數,excess_blobs。在每個區塊期間,我們設置:

[ \text{excess_blobs} \leftarrow \max(\text{excess_blobs} + \text{len(block.blobs)} - \text{TARGET}, 0) ]

其中TARGET = 3。也就是說,如果一個區塊的blobs數量超過目標值,excess_blobs增加;如果少於目標值,excess_blobs減少。然後我們設置blob_basefee = exp(excess_blobs / 25.47),其中exp是指數函數的近似值[ \exp(x) = 2.71828^x ]。

也就是說,每當excess_blobs增加約25,blob basefee就增加約2.7倍。如果blobs變得過於昂貴,平均使用量下降,excess_blobs開始減少,價格自動再次下降。blob的價格不斷調整,以確保區塊平均填充一半,即每個區塊平均包含3個blobs。

如果使用量在短期內激增,則限制生效:每個區塊最多只能包含6個blobs,在這種情況下,交易可以通過提高優先費用來競爭。然而,在正常情況下,每個blob只需要支付blob_basefee加上一點點的優先費用作爲包含激勵。

這種定價方式在以太坊的Gas中已經存在多年:2020年引入的EIP-1559採用了非常類似的機制。通過EIP-4844,我們現在對Gas和blobs有兩個獨立浮動的價格。

多維度EIP-1559的實現

爲了將多維度EIP-1559應用到其他資源(例如存儲訪問、計算、數據傳輸),我們可以爲每個資源引入類似的機制:

  1. 定義目標值和參數:爲每個資源(例如存儲訪問、計算)定義一個目標值(TARGET)和一個調整參數(類似於25.47)。

  2. 跟蹤多維度參數:跟蹤每個資源的過量使用量(excess_resources),例如excess_storage, excess_computation。

  3. 調整基礎費用:根據過量使用量調整每個資源的基礎費用(basefee),例如:

[ \text{excess_storage} \leftarrow \max(\text{excess_storage} + \text{len(block.storage_accesses)} - \text{TARGET}, 0) ]

[ \text{storage_basefee} = \exp(\text{excess_storage} / \text{ADJUSTMENT_PARAMETER}) ]

  1. 自動調整價格:資源的價格會不斷調整,以確保每個區塊對該資源的平均使用量達到目標值。

  2. 處理短期峯值:如果某個資源在短期內使用量激增,則設置每個區塊的最大值,交易可以通過提高優先費用來競爭。

實施的挑戰與優勢

實施多維度EIP-1559比簡單的每交易最大值方案復雜得多,但其優勢在於能夠更精確地控制每個資源的使用量和價格,確保網路的安全性和效率。

挑戰:

  • 需要更復雜的開發和實現工作。

  • 必須精確設置每個資源的目標值和調整參數。

  • 增加了網路和礦工的計算和處理負擔。

優勢:

  • 更準確的資源使用控制。

  • 通過動態調整基礎費用,確保網路穩定和安全。

  • 減少對個別資源的過度依賴,平衡網路負載。

總之,多維度EIP-1559雖然實現起來更難,但其帶來的控制和優化能力可以大大提升以太坊網路的長期穩定性和可擴展性。

原則上,我們可以爲存儲讀取和其他類型的操作添加更多獨立浮動的費用,不過有一個問題,我將在下一節中詳細說明。

對於用戶來說,體驗與今天非常相似:你支付的不再是一個基礎費用,而是兩個基礎費用,但你的錢包可以將其抽象掉,只顯示你預期的費用和最大可能支付的費用。

對於區塊構建者來說,大多數時候最優策略與今天相同:包含任何有效的交易。大多數區塊並不滿——無論是在Gas還是在blobs上。唯一具有挑戰性的情況是,當有足夠的Gas或足夠的blobs超過區塊限制時,構建者需要解決一個多維度背包問題來最大化其利潤。然而,即使在這種情況下,也存在相當好的近似算法,與MEV(最大可提取價值)相比,使用專有算法優化利潤的收益要小得多。

對於開發者來說,主要的挑戰在於需要重新設計EVM(以太坊虛擬機)及其週邊基礎設施的特性,因爲這些特性目前是圍繞一個價格和一個限制設計的,現在需要適應多個價格和多個限制的設計。對於應用開發者來說,一個問題是優化變得稍微困難了:在某些情況下,你不能再明確地說A比B更高效,因爲如果A使用更多的calldata而B使用更多的執行Gas,那麼當calldata便宜時A可能更便宜,而當calldata昂貴時A可能更貴。然而,開發者仍然可以通過基於長期歷史平均價格進行優化來獲得相當好的結果。

多維度EIP-1559的實施將使以太坊網路在資源使用和價格控制方面更加精確和靈活,盡管這需要更復雜的開發和實現工作。對於用戶來說,體驗變化不大;對於區塊構建者來說,挑戰主要在於處理資源使用超過區塊限制的情況;對於開發者來說,需要適應新的多價格和多限制的設計,並在優化過程中考慮更多因素。盡管有這些挑戰,多維度EIP-1559帶來的控制和優化能力可以大大提升以太坊網路的長期穩定性和可擴展性。

多維度定價、EVM 和子調用

有一個問題並未出現在 blobs 中,也不會出現在 EIP-7623 或針對 calldata 的“全”多維度定價實現中,但如果我們嘗試單獨定價狀態訪問或任何其他資源,則會出現:EVM 中子調用的Gas限制。

EVM 中的Gas限制存在於兩個地方。首先,每個交易設置一個Gas限制,這限制了該交易中可以使用的Gas總量。其次,當一個合約調用另一個合約時,可以設置自己的Gas限制。這允許合約調用它們不信任的其他合約,並且仍然保證在調用後它們會有剩餘的Gas用於執行其他計算。

例如,在一個帳戶抽象交易中,一個帳戶調用另一個帳戶,並只給被調用方一個有限的Gas量,以確保即使被調用方消耗了分配給它的所有Gas,外部調用仍然可以繼續運行。

在不同類型的執行之間使Gas多維度化,似乎要求子調用爲每種類型的Gas提供多個限制,這需要對 EVM 進行深度變更,並且不與現有應用程序兼容。這就是爲什麼多維度Gas提案通常停留在兩個維度:數據和執行。數據(無論是交易 calldata 還是 blobs)僅在 EVM 外部分配,因此爲了使 calldata 或 blobs 單獨定價,不需要對 EVM 內部進行任何更改。

我們可以考慮一種“EIP-7623 風格的解決方案”。這裏有一個簡單的實現:在執行期間,對存儲操作收費提高4倍;爲了簡化分析,假設每次存儲操作收費10000Gas。在交易結束時,退還最小值(7500 * 存儲操作次數,執行Gas)。結果是,在減去退款後,用戶被收費:

[ \text{execution_gas} + 10000 \times \text{storage_operations} - \min(7500 \times \text{storage_operations}, \text{execution_gas}) ]

這等於:

[ \text{execution_gas} + 2500 \times \text{storage_operations} ]

等式結果

[ \max(\text{execution_gas} + 2500 \times \text{storage_operations}, 10000 \times \text{storage_operations}) ]

這反映了 EIP-7623 的結構。另一種方法是實時跟蹤 storage_operations 和 execution_gas,並根據在調用操作碼時 [ \max(\text{execution_gas} + 2500 \times \text{storage_operations}, 10000 \times \text{storage_operations}) ] 的增加情況來收取費用,選擇2500或10000。這避免了交易過度分配Gas,並通過退款大部分收回。

盡管無法爲子調用獲得細粒度的權限控制:子調用可能消耗交易的所有“廉價”存儲操作配額,但我們得到的解決方案足夠好,使合約在進行子調用時可以設置限制,並確保子調用執行完成後,主調用仍有足夠的Gas進行所需的後處理。

我能想到的最簡單的“全多維度定價解決方案”是:我們將子調用Gas限制視爲比例性的。假設有 ( k ) 種不同類型的執行,每個交易設置一個多維度限制 ( L_1, \ldots, L_k )。假設在當前執行點,剩餘Gas爲 ( g_1, \ldots, g_k )。假設調用 CALL 操作碼,子調用Gas限制爲 ( S )。則 ( s_1 = S ),然後 ( s_2 = s_1 \cdot \frac{g_2}{g_1} ),( s_3 = s_1 \cdot \frac{g_3}{g_1} ) 等等。

我們將第一種Gas類型(實際上是 VM 執行)視爲一種特權的“計量單位”,然後分配其他類型的Gas,使子調用在每種類型的可用Gas中獲得相同的百分比。這有些醜陋,但最大化了向後兼容性。如果我們想在不同類型的Gas之間使方案更“中立”,以犧牲向後兼容性爲代價,我們可以讓子調用Gas限制參數表示當前上下文中剩餘Gas的一部分(例如, [ \frac{1, \ldots, 63}{64} ])。

無論哪種情況,都需要強調的是,一旦引入多維度執行Gas,本質上的復雜性就會增加,這似乎難以避免。因此,我們的任務是進行復雜的權衡:我們是否接受 EVM 層面上的更多復雜性,以便安全地解鎖顯著的 L1 可擴展性增益,如果是,哪個具體提案最適合協議經濟學和應用開發者?很可能上述提案都不是最佳方案,仍有空間提出更優雅和更好的解決方案。

聲明:

  1. 本文轉載自[[維塔利克·布特林]],版權歸原作者所有[維塔利克·布特林]。若對本次轉載有異議,請聯系Gate Learn團隊,他們會及時處理。
  2. 免責聲明:本文所表達的觀點和意見僅代表作者個人觀點,不構成任何投資建議。
  3. Gate Learn 團隊將文章翻譯成其他語言。除非另有說明,否則禁止復制、分發或抄襲翻譯文章。
Начните торговать сейчас
Зарегистрируйтесь сейчас и получите ваучер на
$100
!