以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads

柏林硬分叉對 Gas 影響幾何?_GAS:STOR價格

Author:

Time:1900/1/1 0:00:00

柏林硬分叉已于4月14日在主網上線,引入了四份EIP。其中的兩份(EIP-2929?和?EIP-2930)對交易的gas成本有影響。本文將解釋部分gas成本在柏林前是如何計算的,加入了EIP-2929后會如何變化,以及如何使用EIP-2930引入的訪問列表。

要點速覽

這篇文章很長,這是它的概要:

柏林硬分叉改變一些操作碼的gas成本。如果在一個dapp或一個智能合約里gas費的值是硬編碼的,它們可能會中止運行。如果這種情況發生了,且智能合約是不可更新的,消費者將需要用EIP-2930的訪問列表才能使用那部分的操作碼。

訪問列表可以用作減少少量的gas成本,但實際上它們在一些情況下是會增加總gas消耗量的。

geth?增加了一個叫?eth_createAccessList?的新RPC方法,用以簡化訪問列表的創建。

柏林硬分叉前的gas成本

EVM執行的每個操作碼都有一筆相關的gas成本。它們大多數的成本是固定的:PUSH1?總是消耗3個單位的gas,MUL?消耗5個,等等。其他一些是會變化的:比如?SHA3?的操作碼成本依賴于它的輸入大小。

我們主要討論操作碼?SLOAD?和?SSTORE,因為它們是最受柏林硬分叉影響的。我們以后會討論針對地址的操作碼,比如所有的?EXT*?和?CALL*?,因為它們的gas成本也改變了。

柏林Subway開設比特幣支付試點提供10%的折扣:金色財經報道,餐廳專營店Subway正在德國首都柏林的三家Subway試行比特幣支付。在過去的幾個月里,柏林Subway特許經營店的老板Daniel Hinze記錄了超過120筆比特幣交易。Hinze鼓勵用比特幣支付,對所有用BTC支付的footlongs, meatball marinaras和sucookies提供10%的折扣。(cointelegraph)[2022/11/10 12:41:10]

柏林前SLOAD的gas成本

在沒有EIP-2929之前,SLOAD?的gas消耗很簡單:它總是消耗800gas。所以沒有什么可說的。

柏林前SSTORE的gas成本

在gas消耗方面,SSTORE?可能是最復雜的操作碼了,因為它的成本取決于像存儲slot的當前值、新值、以及它是否之前被修改過。我們僅對一些情況進行分析以獲得一個基本理解;如果你想了解更多,請閱讀文末的EIP鏈接。

如果存儲slot的值從0變成1(或任何非0的值),gas消耗量是20000。

如果存儲slot的值從1變成2(或任何其他非0的值),gas消耗量是5000。

如果存儲slot的值從1(或任何非0的值)變成0,gas消耗量也是5000,但在交易的最后你會獲得1筆gas費返還。本文不會討論gas費返還,因為它們在柏林硬分叉中不受影響。

以太坊基金會:柏林硬分叉解決了以太坊長期存在的威脅:以太坊基金會表示,柏林硬分叉中,修正 gas 費、增加交易類型等更新將解決以太坊長期存在的一個漏洞威脅。這一由random trie lookups觸發的漏洞會被惡意交易利用導致分鐘級別區塊時間的封鎖,該漏洞早在 2019 年 10 月 4 日以太坊安全研究員 Hubert Ritzdorf 和 Matthias Egli 提交以太坊漏洞懸賞計劃就已被揭示。[2021/5/23 22:33:41]

如果存儲slot的值在之前相同的交易中被修改了,往后所有?SSTORE?的gas消耗量都是800。

這部分的細節并不有趣,重要的是?SSTORE?很貴,而它的消耗取決于幾個因素。

EIP-2929后的gas消耗

EIP-2929對上述所有操作碼的gas消耗都有影響。但在深入這些變化前,我們需要先談談這份EIP引入的一個重要概念:訪問過的地址(accessedaddresses)與訪問過的存儲密鑰(accessedstoragekeys)。

如果一個地址或一個存儲密鑰在之前的交易中被“使用”過,那么它們就會被視為“訪問過的”。例如,當你?CALL一個其他合約,該合約的地址就會被標為“accessed(訪問過的)”。同樣地,當你?SLOAD或?SSTORE一些slot的時候,交易的其他部分也會被視為訪問過的。哪個操作碼執行它并不重要:如果一個?SLOAD?讀取了一個slot,接下來的?SLOAD?和SSTORE?都會被視為訪問過的。

以太坊API服務供應商Infura已為柏林硬分叉升級準備就緒:2月25日消息,以太坊API服務供應商Infura宣布已為柏林硬分叉升級做好了準備,Infura的用戶無需采取任何措施。Infura團隊表示,如果用戶是自己運行的以太坊節點客戶端,就需要自己及時升級客戶端。此前在以太坊核心開發者會議上,開發者決定將于4月14日在區塊高度12244000處進行柏林硬分叉升級,升級內容包括對合約的各種優化,涵蓋Gas效率、對以太坊虛擬機(EVM)讀取代碼方式的更新以及防范DDOS攻擊的其他更改等。此次升級包括至少五個EIP,EIP-2565(ModExpGas成本)、EIP-2315(EVM的簡單子程序)、EIP-2929(狀態訪問操作碼的Gas成本增加)、EIP-2718(定義一個新的事務類型)和EIP-2930(可選的訪問列表),并將在部署前在四個以太坊測試網絡上進行發布。[2021/2/25 17:51:28]

這里值得注意的是,存儲密鑰是“內置于“一些地址的。就如這份EIP所解釋:

在執行交易時,維持一組?accessed_addresses:Set?和accessed_storage_keys:Set]

也就是說,當我們說一個存儲slot被訪問了,我們實際上說的一對?(address,storageKey)?被訪問了。

接下來談談新的gas消耗。

以太坊柏林硬分叉或于明年1月進行:金色財經報道,根據周五舉行的核心開發人員電話會議,以太坊“柏林”(Berlin)硬分叉最多還需要幾個月,目前已制定了在明年1月份進行的軟目標。據悉,“柏林”是當前Eth1.x工作量證明(PoW)區塊鏈的硬分叉。該系統范圍的升級原定于7月進行。[2020/10/31 11:17:00]

柏林后的SLOAD

在柏林硬分叉之前,SLOAD固定消耗800gas。現在,它取決于該存儲slot是否被訪問過。如果它沒有被訪問過,gas消耗是2100;如果被訪問過了,則是100。因此,如果該slot是在訪問過的存儲密鑰列表里的,SLOAD?的gas消耗會少于2000。

柏林后的SSTORE

讓我們在EIP-2929語境下重溫前面的?SSTORE?例子:

如果存儲slot的值從0變成1(或任何非0的值),gas消耗量是:

如果存儲密鑰沒有被訪問過,22100

如果被訪問過了,20000

如果存儲slot的值從1變成2(或任何其他非0的值),gas消耗量是:

如果存儲密鑰沒有被訪問過,5000

如果被訪問過了,2900

如果存儲slot的值從1(或任何非0的值)變成0,gas消耗與上一種情況一樣,再加上返還。

柏林區塊鏈公司Madana電子數據保護專利獲批:金色財經獨家獲悉,柏林區塊鏈公司Madana此前提交的“支持透明且不間斷報酬的第三方數據處理電子數據自動保護流程”專利已經獲批,并于3月2日正式激活,預計專利到期時間為2038年3月23日。根據介紹,每個人都是數據創建者,尤其是使用數字服務(比如應用程序、瀏覽器)或使用社交網絡(比如Facebook、Twitter)的時候,另外,溫度傳感器、銑床、脈沖計數器之類對人有幫助的電子設備也會生成可以評估的電子數據,因此非常有價值。但是,數據生成方通常不能自由地確定其數據,通常必須同意服務提供者的非透明條款和條件才能使用其服務,從而將數據權利移交給服務提供者。金色財經了解到,Madana的專利提供了一種用于保護電子數據的方法和系統,在第三方進行數據處理之后,允許數據接收者在不知道數據生成者身份的情況下為他們提供補償。

此外,Madana也是Lisk上首個側鏈項目,在遵守《通用數據保護條例》“Privacy-by-Design隱私設計”要求的基礎上為跨行業數據共享和數據分析提供透明平臺,讓用戶自己掌握自己的“數據主權”。[2020/3/3]

如果存儲slot的值在之前相同的交易中被修改了,往后所有?SSTORE?的gas消耗量都是100。

如你所見,如果?SSTORE?正在修改的slot是之前被訪問過的,第一個SSTORE?消耗少于2100gas。

總結

下表對上述的值進行了比較:

請注意,在最后一行沒有必要談論slot是否已經被訪問過,因為如果它之前就被寫入,那它就被訪問過了。

EIP-2930:可選訪問列表交易

我們一開始提及的其他EIP就是EIP-2930。這份EIP增加了一種新的交易類型,它可以在交易里加入一個訪問列表。這意味著你可以在交易執行開始前,事先聲明哪些地址和slot應被視為訪問過的。例如,一個未被訪問過的slot的一個?SLOAD?需要消耗2100gas,但如果該slot被加入到交易訪問列表里,同一個操作碼只需消耗100gas。

但如果已經被訪問過的地址或存儲密鑰會消耗更少gas,這是否意味著我們可以把所有東西都添加到交易訪問列表來降低gas消耗了?棒!不用給gas費了!然而,不盡然是這樣,因為你每次添加地址和存儲密鑰的時候還是需要支付gas費的。

我們來看一個例子。假如我們正在向合約A發送一筆交易,訪問列表可能如下:

如果我們發送一筆附有這個訪問列表的交易,使用slot?0x0?的第一個操作碼是SLOAD,它消耗的是100而不是2100gas。這減少了2000gas。但每次把存儲密鑰添加到交易的訪問列表中都需要消耗1900gas。因此我們只省了100gas。(如果訪問該slot的第一個操作碼是?SSTORE而不是?SLOAD,我們可以省2100gas,也就是說如果我們考慮的是存儲密鑰的消耗的話,我們總共節省200gas。)

這是否代表只要我們使用交易訪問列表就能節省gas?不是的,因為我們還需要支付添加地址到訪問列表(即我們的例子中的?""?)的gas。

訪問過的地址

到目前為止,我們只討論了操作碼?SLOAD?和?SSTORE,但柏林升級后不是只有這些操作碼有變化。例如,操作碼?CALL?之前的固定消耗量是700。但EIP-2929后,如果地址不在訪問列表里,它的消耗量變成了2600,如果在,則是100。還有,像訪問過的存儲密鑰,無論之前訪問的是什么操作碼(例如,如果EXTCODESIZE?是第一次被調用,那么該操作碼將消耗2600gas,而往后任何使用同一個地址的?EXTCODESIZE、?CALL?還是STATICCALL都只消耗100gas)。

這是如何影響有訪問列表的交易的呢?例如,假如我們給合約A發送一筆交易,而該合約調用另一個合約B,那么我們可以加入這樣一個列表:

我們將需要支付2400gas以把這個訪問列表加入到交易里,但之后使用?B?地址的第一個操作碼只消耗100gas,而不是2600。因此,我們通過這樣做節省了100gas。如果?B?以某種方式使用它的存儲,且我們知道使用的是哪個密鑰,那么我們也可以把它們加入到訪問列表里,這樣可以為每個密鑰節省100~200gas(取決于你的第一個操作碼是?SLOAD?還是?SSTORE?)。

但是為什么我們要談論另一個合約?我們正在調用的合約呢?為什么不對這個合約進行這些操作?

我們可以這樣做,但這樣不劃算,因為EIP-2929明確規定正在被調用的合約(即tx.to)地址會默認加入到?accessed_addresses?列表里。因此我們無須支付多余的2400gas。

讓我們再對之前的例子進行分析:

除非我們要加入多幾個存儲密鑰,否則這其實很浪費。如果我們預設?SLOAD?總是首先使用存儲密鑰,那么我們起碼需要24個存儲密鑰能保本。

你可以想象一下,做分析與手動創建一個訪問列表并不那么有趣。幸運的是,其實有更好的方法。

eth_createAccessListRPC方法

Geth(從1.10.2版本開始)加入了一個新的?eth_createAccessList?RPC方法,你可以用它來生成訪問列表。它的使用與?eth_estimateGas?相似,但它返回的不是gas估值,而是像下面這樣的結果:

也就是它給你該交易會用到的地址與存儲密鑰的列表,加上訪問列表被加入情況下所消耗的gas。但,這并不代表gas消耗量會低于在沒有訪問列表情況下發送同一筆交易所消耗的!

我想我們會隨著時間推移發現使用它的正確方法,但我猜的偽代碼如下:

給合約松綁

值得一提的是,訪問列表的主要目的不在于使用gas。如EIP所解釋:

減輕由EIP-2929引入的合約斷裂風險,因為交易可以提前指定交易計劃訪問的賬戶和存儲slot并提前支付;最終在實際執行中,操作碼SLOAD和EXT*只消耗100gas:這個低gas消耗不僅可以防止由該EIP引起的斷裂,還可以“松開”任何因EIP-1884而受限的合約。

這意味著如果一個合約對執行某事務的成本做了假設,gas成本的增加就可能使它停止運作。例如,一個合約調用另一個合約,像這樣someOtherContract.someFunction{gas:34500}(),因為它假設someFunction?會準確消耗34500gas,這樣它會出問題。但如果你添加了一個合理的訪問列表,那么合約會再次運作。

自己做檢驗

如果你像自己去測試,復制這個代碼庫,里面由多個可以用?Hardhat?和geth執行的實例。在README查看說明。

參考文獻

EIP-2929?和?EIP-2930?是與本文相關的兩個柏林硬分叉EIP。

EIP-2930依賴于柏林硬分叉的另一部分:?EIP-2718,它又叫類型交易。

EIP-2929參考了很多?EIP-2200,因此如果你想深入了解gas成本,你可以從那里開始。

Tags:GASSLOTLOTTORuGAS-JUN21 Token Expiring 30 Jun 2021AlphaslotPILOT幣STOR價格

POL幣最新價格
幣圈小蝶:炒幣的4大思維誤區_DEFI:UltronGlow

?炒幣,暴富!錢的吸引力,特別是快速賺大錢,令人無限向往,甚至瘋狂!從而就會進入夢境,失去理智,進入各種各樣的誤區!今天就聊聊它!炒幣,有兩個收獲!一個是修行!一切的激情彭拜,魅力四射.

1900/1/1 0:00:00
虎符關于Ethereum(ETH)網絡升級完成的公告(2021/04/15)_EGR:Integrate Into One

尊敬的虎符用戶, 虎符支持Ethereum網絡升級,Ethereum于2021年04月15日進行網絡升級.

1900/1/1 0:00:00
浩然論幣:2021.4.15比特幣合約行情思路分析建議_ANK:SBANK價格

大家好,我是你們的朋友浩然論幣HR12818,浩然論幣公眾號同步專注數字貨幣行情分析,爭取為廣大幣友傳遞最有價值的幣市信息,歡迎廣大幣友的關注與點贊.

1900/1/1 0:00:00
XCUR-60D鎖倉活動上線,年化收益12%!_CUR:ING

親愛的Pool-X用戶,Pool-X平臺將聯合Curate項目方于2021年04月15日18:00:00(UTC8)上線XCUR-60D鎖倉挖礦活動.

1900/1/1 0:00:00
Jade Zhang:復雜的NFT應用場景需要有更針對性的基礎設施來支撐_ARV:Marvel

4月8日19:00,MixMarvel創始人兼CEO?Jade?Zhang做客抹茶社區就NFT鏈游分享觀點.

1900/1/1 0:00:00
Gate.io 上線 Boson Token(BOSON) 杠桿交易和幣幣理財服務_TPS:gate.io怎么提現人民幣

Gate.io一直秉承真實,透明的理念,不造假數據,不干預市場交易,為用戶提供真實自由的市場工具和穩定健康的市場服務。杠桿交易提供做多和做空機制,可以有效穩定市場到合理價值.

1900/1/1 0:00:00
ads