撰文:Li
撰文:Li
撰文:Li
撰文:Li
Gas費問題是目前以太坊1.0鏈面臨最嚴重的問題之一,儘管以太坊的算力很多,但任務能力因為區塊鏈的結構問題(每個全節點計算同樣的數據,因此任務都在搶單個節點的計算資源),以太坊在處理大量任務的是時候會擁堵,擁堵後,Gas費會很高。
Defi應用爆發式增長,讓這種現象愈演愈烈。這裡要提到的是,以太坊除了打包區塊鏈交易外,智能合約等也是發佈到鏈上的,所以智能合約在鏈上執行的時候要消耗資源,因此用戶在DeFi裡做的幾乎每一步,都需要支付Gas費,這也是Gas模型的一個問題所在。
近日以太坊社區對EIP-1559的討論也是更加激烈,因為有很多的礦池並不同意部署這個提案,這個提案調整了Gas費的構成,雖然無法解決Gas高的問題,但可以提升對Gas費的預期,完善體驗。
還有一個近期的相關消息,3月16日,以太坊的一位開發者Philippe Castonguay提出了另一個提案EIP-3382,提議將區塊Gas限制固定為每區塊12,500,000 Gas。並且更新塊驗證規則,如果Gas限制不等於12,500,000,則區塊無效。這是為了對區塊Gas限制達成共識,並且不受礦工製約。
如果想要理解Gas費,從TXStreet的動態圖像可以很形象去理解。
圖片描述
圖片描述
汽車行駛的道路,是基礎資源,需要支付“過路費”來Cover,而打包需要的Gas費是“Gas費”,羊毛出在羊身上,Gas費用來最終支付“過路費”。所以Gas費(Gas費)就是最終支付以太坊的資源使用的費用。
二級標題
二級標題
二級標題
在這個版本確認前,還有一個較為有趣的細節,在Vitalik設計的以太坊Gas模型裡,是把Gas費支付過程默認在合約裡,也就是一個合約執行過程中,合約中的餘額會減少,如果餘額因為執行消耗不足了,合約會暫停。
圖片描述
而後來Gavin開始參與以太坊,進入後就修改了Gas的付費機制,從這種合約執行支付變成了轉賬人支付,也就是合約執行人支付。 Vitalik描述為,從“合同付款”方式轉變為“發送者付款”方式,以代替每個單獨的交易步驟立即拿走一點ETH。
圖片描述
圖片描述
圖片描述
以太坊早期Vitalik和Gavin在迷你黑客鬆上,中間的大神是Jeffrey
這是比較容易理解的“Gas費支付”。如果解剖更細節的部分,我們要看黃皮書裡Gas的關聯部分。
Gas是以太坊中所有計算量的計價單位,想要在以太坊上進行越多計算,則要支付越多Gas。
這種採取使用者付費的模式,能夠避免資源濫用。可以理解為一旦開發者為每種運算支付費用,就會盡可能將代碼寫得簡潔高效,另外,Gas的存在還能阻止攻擊者通過無效運算(因此執行很多操作都需要花費Gas),對以太坊網路進行泛洪(Flooding)攻擊,下文中統計的一個EIP就是提高了對賬戶訪問的Gas值來減少攻擊可能性的。
另外,GasLimit也可以被定義為預付Gas。當節點在驗證交易時,先將GasPrice乘GasLimit算出交易的固定成本。如果交易發送方的賬戶餘額小於交易固定成本,則該交易視為無效。交易執行完之後,剩餘的Gas會退回至發送方賬戶,這也是為什麼我們在使用MetMask執行合約的時候,預估Gas很貴,但執行完畢價格並沒有那麼高。
圖片描述
圖片描述
固有成本=
固有成本=
Gtransaction+Gtxdatazero*Nzeros+Gtxdatanonzero* Nnonzeros+Gtxcreate
其中:
Gtransaction=21,000Wei
Gtxcreate=32,000Wei
Gtxdatazero=4Wei
其中:
大家可以對以下的操作碼對號入座。
圖片描述
據以上的介紹,我們可以得到的基本理解是,Gas費是因為使用以太坊的鏈上資源產生的,計算越多,Gas越高,在智能合約合約操作裡,每個單獨的步驟都需要支付Gas。另外,補充一點,如果發送者把Gas設置的很高,礦工會優先執行交易,因為礦工可以選擇優先打包某些交易。
二級標題
二級標題
二級標題
20個與Gas費息息相關的EIP
接下來我們就可以詳細看一下關於Gas的EIP提案。提案大約根據時間先後排列。
EIP-5: 調整RETURN 和CALL的Gas用量
此EIP使得調用RETURN 字符串和其他動態大小的數組的函數成為可能。當前,當從以太坊虛擬機內部調用另一個合約/功能時,必須預先指定輸出的大小。還必須為未寫入的內存支付費用,這使得返回動態大小的數據既昂貴又不靈活,以至於實際上無法使用。此EIP中提出的解決方案是僅對CALL返回時實際寫入的內存支付。
EIP-150:大量IO操作的Gas成本變化
將EXTCODESIZE的Gas費用從20增加到700。
將EXTCODECOPY的基礎Gas成本從20增加到700。
將BALANCE的Gas費用從20增加到400。
將SLOAD的Gas成本從50增加到200。
將CALL,DELEGATECALL,CALLCODE的Gas費用從40增加到700。
將SELFDESTRUCT的Gas成本從0增加到5000。
如果SELFDESTRUCT命中一個新創建的帳戶,則會觸發25000的額外Gas費用(類似於CALL)。
將建議的Gas限制目標提高到550萬。
EIP-158:狀態清除
在任何情況下,call餘額等都為0的賬戶都不再消耗25000個帳戶創建Gas的成本。
EIP-1108:降低alt_bn128預編譯Gas成本
橢圓曲線計算預編譯當前價格過高。對預編譯進行重新定價將大大有助於以太坊上的許多隱私解決方案和擴展解決方案。對於基於以太坊的基於zk-SNARK的協議,EIP-1108不僅會大大降低驗證zk-SNARK的Gas成本,而且還可以幫助將多個zk-SNARK證明批量組合在一起。這也是一種可用於將單片zk-SNARK電路拆分為一批具有較小單個電路尺寸的zk-SNARK的技術,這使得zk-SNARK都更易於構造和部署。
目前,這些交易的成本約為6,000,000Gas。此EIP可以將其減少到1,000,000Gas,這使該協議更加實用。
EIP-1283:SSTORE操作碼的Gas調整
該EIP提議對SSTORE操作碼進行計量更改,以實現合同存儲的新用法,並在與大多數實現工作方式不匹配的地方減少過多的Gas成本。這可以作為EIP-1087的替代方案,在EIP-1087中,它嘗試對更改緩存使用不同優化策略的實施更友好。
EIP-2028:減少交易數據用氣成本
EIP-2200:淨Gas計量的結構化定義
EIP-2565:ModExpGas成本
此EIP為SSTORE操作碼提供了淨Gas計量更改的結構化定義,可用於合同存儲的新用法,並在與大多數實現工作方式不匹配的地方降低了過多的Gas成本。這可以當作EIP-1283和EIP-1706的組合。
EIP-2565:ModExpGas成本
為了準確反映ModExp預編譯的實際操作成本,此EIP指定了一種用於計算Gas成本的算法。該算法估算了乘法複雜度成本,並將其乘以執行冪運算所需的迭代次數的近似值。
EIP-1559:ETH 1.0鏈的收費市場變化
以太坊使用簡單的拍賣機制以歷史價格定價交易費用,用戶以出價(“ Gasprices”)發送交易,礦工選擇出價最高的交易,包含在內的交易按照指定的出價支付。這導致效率低下。
此EIP中的建議是從基本費用金額開始,該費用由協議根據網絡的擁擠程度上下調整。當網絡超出每塊Gas的目標使用量時,基本費用會略有增加,而當容量低於目標數量時,基本費用會略有下降。
由於這些基本費用的變化受到限制,因此不同塊之間基本費用的最大差異是可以預測的。然後,這允許錢包以高度可靠的方式為用戶自動設置Gas費。預計即使在網絡活躍期間,大多數用戶也不必手動調整Gas費。對於大多數用戶來說,基本費用將由他們的錢包來估算。
EIP-2929:狀態訪問操作碼的Gas成本增加
增加的Gas成本SLOAD(0x54)至2100,以及*CALL操作碼家族(0xf1,f2,f4,fA)、BALANCE 0x31以及EXT*操作碼家族(0x3b,0x3c,0x3f)、以及2600免CD(ⅰ)預編譯。此外,還可以改革SSTORE計量方式,確保對SELFDESTRUCT這些操作碼中固有的“實際存儲負載”進行正確定價。
通常,操作碼Gas成本的主要功能是估計處理該操作碼所需的時間,目標是使Gas限制對應於處理塊所需時間的限制。然而,存儲訪問操作碼(SLOAD,以及*CALL,BALANCE和EXT*操作碼)在歷史上被低估。在2016年上海DoS攻擊中,修復了最嚴重的客戶端錯誤後,攻擊者使用的一直奏效的策略之一就是簡單地發送可訪問或調用大量帳戶的交易。
提議的EIP將這些操作碼的成本增加了大約3倍,從而將最壞情況下的處理時間減少到大約7-27秒。數據庫佈局的改進涉及重新設計客戶端以直接讀取存儲而不是跳到Merkle樹上,這將進一步降低這種情況,儘管這些技術可能需要很長時間才能完全推出,並且即使採用這種技術,訪問存儲的IO開銷也會保持實質性。
EIP-1077: 合約調用的Gas中繼
採用DApp的主要障礙是需要多個token來執行鍊式操作。允許用戶簽名消息以顯示執行意圖,但允許第三方中繼器執行消息可以避免此問題,儘管以太坊交易始終需要ETH,但智能合約可以採用EIP-191簽名並轉發付款激勵具有ETH的不受信任方執行交易。可以標準化它們的通用格式,以及用戶允許以代幣支付交易的方式,為應用程序開發人員提供了很大的靈活性,並且可以成為應用程序用戶與區塊鏈交互的主要方式。
EIP-1087:用於SSTORE操作的Gas計量
該EIP提議對EVMSSTORE操作的Gas收費方式進行更改,以減少不必要的Gas成本,並為合同存儲提供新的用例。
EIP-1285:在CALL操作碼中增加GcallstipendGas
Gcallstipend將CALL操作碼中的費用參數從2,300增至3,500Gas單位。
EIP-1380:降低了內部調用的Gas成本
降低內部調用的Gas成本將極大地受益於諸如Solidity和Vyper之類的智能合約語言,這樣他們便能夠用CALL代替JUMP內部操作調用使用操作碼。
EIP-1613: Gas站網絡
通過允許合同接受“代收貨款”並為Gas付費,使非ETH用戶可以訪問智能合約(例如dapp)。
與dapp通訊目前需要向ETH支付Gas費,這限制了dapp的採用僅限於以太坊用戶。因此,合同所有者可能希望為Gas支付費用以增加用戶獲取量,或者讓其用戶以法定貨幣支付Gas費用。或者,第三方可能希望補貼某些合同的Gas成本。如EIP-1077中所述的解決方案可以允許來自不包含ETH的地址的交易。
EIP-1930:具有嚴格Gas語義的CALL。如果沒有足夠的Gas,請還原
添加智能合約功能,以使用特定數量的Gas執行CALL。如果無法做到這一點,則應返回執行。
EIP-2045:EVM操作碼的顆粒Gas成本
計算EVM操作碼(ADD,SUB,MUL,等等)通常相對於高估到用於存儲操作碼的I / O( SLOAD,SSTORE等)。當前,最小的Gas成本為1(即一種Gas單位),並且大多數計算操作碼的成本接近1(例如3、5或8),因此可能降低成本的範圍受到限制。一種新的最小Gas單位,稱為“顆粒”,是一種Gas的一部分,將擴大Gas成本的範圍,因此可以降低到當前的最低水平以下。
EIP-2046:降低了對預編譯進行靜態調用的Gas成本
將調用預編譯的基本Gas成本STATICCALL從700降低到40。這將允許更有效地使用預編譯以及總成本低於700的預編譯。
EIP-2542:新的操作碼TXGASLIMIT和CALLGASLIMIT
允許智能合約訪問有關當前交易和執行框架的Gas限制的信息。隨著中繼,元交易,Gas費和帳戶抽像等概念的普及,對於某些合同而言,能夠絕對精確地跟踪Gas支出變得至關重要。
EIP-3322:帳戶Gas存儲操作碼
通過將Gas從需求量較小的區塊移動到需求量較大的區塊,從而帶來了Gas供應彈性和價格穩定性。不幸的是,這獎勵了不必要的狀態增長。通過引入高級的Gas存儲機制,Gas市場將需要較少的存儲和計算。
EIP-2780:減少內部交易Gas
降低內在交易的成本21,000到7,000Gas。
當前21,000交易的Gas內在成本使發送ETH的成本非常高,而小批量(數十美元)的成本通常高得令人望而卻步。雖然其他EIP(例如EIP-1559)也考慮了Gas價格和首次價格拍賣的變化,但如果以安全的方式進行,大幅降低發送ETH的成本並實現更大數量的此類交易將是積極的。
第二個key:Rollup與Gas
早期的Gas故事是關於以太坊Gas費模式的製定,而目前來看,除了對Gas費降低外,最好的擴容和降低Gas費方式還有壓縮交易數據。
這便與Rollup關係很大。


