📢 #Gate观点任务# 第五十期精彩啟程!調研Ola (OLA)項目,在Gate.io動態發佈您的看法觀點,瓜分$100 OLA獎勵池!
💰️ 選取10名幸運參與用戶,每人輕鬆贏取 $10 等值 $OLA 獎勵!
👉 參與方式:
1.調研Ola (OLA)項目,並發表你對項目的見解。
2.帶上Ola (OLA)交易鏈接:https://www.gate.io/trade/OLA_USDT 並註明$OLA上線日期:2024/11/15 18:00 (UTC+8)
3.推廣Ola (OLA)活動:
-推廣Ola (OLA) “Startup新幣挖礦”,質押USDT或BTC瓜分2,100,8
詳述EIP-7706並梳理最新的Ethereum的Gas機制
原文作者:@Web3 Mario
引言:Vitalik 在 2024 年 5 月 13 日發佈了 EIP-7706 提案,提出了對現有 Gas 模型的補充方案,將 calldata 的 gas 計算單獨剝離出來,並定製了類似 Blob gas 的 base fee 定價機制,進一步降低 L2 的運行成本。與之相關的提案還需要追溯到 2022 年 2 月提出的 EIP-4844 ,相隔時間甚久,因此查閱相關資料,希望對最新的 Ethereum Gas 機制做一個綜述,方便大家快速瞭解。
當前已支持的 Ethereum Gas 模型——EIP-1559 和 EIP-4844
在最初的設計中,Ethereum 採用了一個簡單的拍賣機制對交易費用進行定價,這需要用戶主動爲自己的交易出價,也就是設置 gas price,通常情況下,由於用戶付出的交易費將歸屬於礦工,所以礦工將根據經濟最優的原則,按照出價高低來決定交易打包順序,注意這是在忽略 MEV 的情況下。在當時核心開發者看來這個機制面臨着以下四個方面的問題:
直到 EIP-1559 的提出與執行,Gas 模型有個第一次迭代,EIP-1559 時 Vitalik 等核心開發者在 2019 年 4 月 13 日提出的,並在 2021 年 8 月 5 日的 London 升級中被採用,該機制摒棄了拍賣機制,轉而採用了一種 Base fee 和 Priority fee 的雙定價模型,其中 Base fee 將根據父區塊中已產生的 gas 消耗情況與一個浮動且遞歸的 gas target 之間的關係通過一個既定的數學模型定量計算,直觀的效果爲若上一個區塊中 gas 使用情況超過了預定的 gas target 時,則上調 base fee,若不及 gas target,則下調 base fee,這樣做既可以比較好的反應供需關係,又可以使得對於合理 gas 的預測變得更加精準,不至於出現由於誤操作導致的天價 Gas Price,因爲 base fee 的計算是直接由系統決定的而非用戶自由指定。具體的代碼如下:
其中可知當 parent_gas_used 大於 parent_gas_target 時,那麼當前區塊的 base fee 將相比於上一個區塊的 base fee 加上一個偏移值,至於偏移值則是取 parent_base_fee 乘以上一個區塊 gas 總用度相對 gas target 的偏移量並對 gas target 與一個常量取餘與 1 的最大值。反之邏輯類似。
另外 Base fee 將不再作爲獎勵分配給礦工,而是直接銷燬,從而時 ETH 的經濟模型處於通縮的狀態,有利於價值的穩定。而另一方面 Priority fee 則相當於用戶給礦工的打賞,可以自由定價,這一定程度上可以讓礦工的排序算法得到一定程度的複用。
隨着時間推進到 2021 年,那時 Rollup 的發展逐漸進入佳境,我們知道無論 OP Rollup 還是 ZK Rollup 都意味着需要將 L2 的數據做壓縮處理後的某些證明數據通過 calldata 上傳至鏈上實現數據可用性(Data Available)或者直接交由鏈上做驗證。這就讓這些 Rollup 解決方案在維護 L2 的最終性時面臨着很大的 Gas 成本,而這些成本最終都將轉嫁到用戶的身上,因此那時大部分的 L2 協議使用成本並沒有想象那麼低。
與此同時 Ethereum 也面臨着區塊空間競爭的窘境,我們知道每個區塊存在一個 Gas Limit,這意味着當前區塊中的所有交易的 Gas 消耗加總不可以超過該值,按當前的 Gas Limit 爲 30000000 來計算,理論上存在 30, 000, 000 / 16 = 1, 875, 000 字節的限制,其中 16 指的是 EVM 處理每個 calldata 字節需要消耗 16 單位的 Gas,也就意味着單個區塊最多可以承載的數據規模約爲 1.79 MB。而 L2 排序器所產生的 Rollup 相關數據通常數據規模較大,這就使其與其他主鏈用戶的交易確認產生競爭,導致單個區塊可以打包的交易量變小,進而影響主鏈的 TPS。
爲了解決這個窘境,核心開發者們於 2022 年 2 月 5 日提出了 EIP-4844 提案,並在 2024 年二季度初的 Dencun 升級後得到了實施。該提案提出了一種新的交易類型,名爲 Blob Transaction,相比於傳統類型的 Transaction,Blob Transaction 的核心思想是補充了一個新的數據類型,即 Blob data。區別於 calldata 類型,blob data 不可以被 EVM 直接,而只能訪問其 hash,也被稱爲 VersionedHash。此外還有兩個相伴而來的設計,其一相較於普通交易,blob transaction 的 GC 週期更短,從而保證區塊數據不至於過於臃腫,其二 blob data 的具有原生的 Gas 機制,總體上呈現的效果於 EIP-1559 類似,但在數學模型上選擇自然指數函數,使其在應對交易規模波動時穩定性上表現更好,因爲自然指數函數的斜率亦爲自然指數函數,這意味着無論此時網絡交易規模處在什麼狀態,當交易規模快速飆升時,blob gas 的 base fee 反應的更充分,從而有效遏制交易活躍度,同時該函數還有一個重要的特性,當橫座標爲 0 使,函數值爲 1 。
base_fee_per_blob_gas = MIN_BASE_FEE_PER_BLOB_GAS * e**(excess_blob_gas / BLOB_BASE_FEE_UPDATE_FRACTION)
其中 MIN_BASE_FEE_PER_BLOB_GAS 和 BLOB_BASE_FEE_UPDATE_FRACTION 爲兩個常量,而 excess_blob_gas 則由父區塊中總的 blob gas 消耗於一個 TARGET_BLOB_GAS_PER_BLOCK 常量之間的差值來決定,當總的 blob gas 消耗超過目標值,即差值爲正時,e**(excess_blob_gas / BLOB_BASE_FEE_UPDATE_FRACTION) 大於 1 ,則 base_fee_per_blob_gas 變大,反之則變小。
這樣對於一些只希望利用 Ethereum 的共識能力爲某些規模較大的數據做存證以保證可用性的場景就可低成本的執行,同時不會擠佔區塊的交易打包能力。以 Rollup 排序器爲例,可以通過 blob transaction 將 L2 的關鍵信息封裝到 blob data 中,並在 EVM 中通過精巧的設計,利用 versionedHash 實現鏈上驗證的邏輯。
需要補充的是當前 TARGET_BLOB_GAS_PER_BLOCK 和 MAX_BLOB_GAS_PER_BLOCK 的設置爲主網帶來了一個限制,即每個區塊的平均處理 3 個 blob ( 0.375 MB) 的目標和最多 6 個 blob ( 0.75 MB) 的限制。這些初始限制旨在最大限度地減少該 EIP 對網絡造成的壓力,並且隨着網絡在較大區塊下展現出可靠性,預計會在未來的升級中增加。
對於執行環境 Gas 消耗模型的再細化——EIP-7706
在明確了當前 Ethereum 的 Gas 模型後,我們來看下 EIP-7706 提案的目標與實施細節。該提案由 Vitalik 在 2024 年 5 月 13 日提出。與 Blob data 類似,該提案對另一個具有特殊性的數據字段對應的 Gas 模型進行了剝離,這個數據字段即爲 calldata。並且優化了相應的代碼實現邏輯。
從原理上 calldata 的 base fee 計算邏輯與 EIP-4844 中 base fee for blob data 相同,均採用了指數函數並根據父區塊中的實際 gas 消耗值與目標值的偏差值來計算對當前 base fee 的縮放比例。
值得注意的是一個新的參數設計,LIMIT_TARGET_RATIOS=[ 2, 2, 4 ],其中 LIMIT_TARGET_RATIOS[ 0 ]表示了執行操作類 Gas 的目標比率,LIMIT_TARGET_RATIOS[ 1 ]表示 Blob data 類 Gas 的目標比率,LIMIT_TARGET_RATIOS[ 2 ]表示 calldata 類 Gas 的目標比率,這個向量用於計算父區塊中三類 gas 對應的的 gas target 值,計算邏輯如下,即分別使用 LIMIT_TARGET_RATIOS 對 gas limit 做整除操作:
其中 gas_limits 的設定邏輯如下:
gas_limits[ 0 ]必須遵循現有的調整公式
gas_limits[ 1 ]必須等於 MAX_BLOB_GAS_PER_BLOCK
gas_limits[ 2 ]必須等於 gas_limits[ 0 ] // CALLDATA_GAS_LIMIT_RATIO
我們知道當前 gas_limits[ 0 ]爲 30000000 ,CALLDATA_GAS_LIMIT_RATIO 被預設爲 4 ,這就意味着當前 calldata gas target 約爲 30000000 // 4 // 4 = 1875000 ,又因爲按當前的 calldata gas 計算邏輯,每個非零 Bytes 消耗 16 Gas,零 Bytes 消耗 4 Gas,假設某段 calldata 中非零與零 Bytes 的分佈各佔 50% ,則平均處理 1 Bytes 的 calldata 需要消耗 10 Gas。因此當前的 calldata gas target 應對應 187500 bytes 的 calldata 數據,約爲當前平均用量的 2 倍,
這樣做的好處在於大大減少了 calldata 達到 gas limit 的情況發生的概率,通過經濟模型使 calldata 的用量保持在一個較爲始終的狀態,同時也杜絕了對 calldata 的濫用。之所以做這樣的設計還是爲 L2 的發展掃平障礙,搭配 blob data,使得排序器成本進一步降低。