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

搞懂 “柏林” 之后的合約 Gas 開銷_GAS

Author:

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

“柏林”硬分叉將在4月15日激活,該硬分叉所包含EIP中的兩個都會影響事務的Gas開銷。本文會解釋“柏林”激活之前,一些操作碼的Gas消耗量是如何計算的,而EIP-2929對此有何影響,以及,2930引入的訪問清單功能應如何使用。

摘要

這篇文章很長,你要是只想知道結論,看完這部分就可以把網頁關掉了:

柏林硬分叉改變了某些操作碼的Gas開銷。如果你在自己的應用中硬編碼了一些操作可使用的Gas數量,這些操作可能會卡死。如果真的出現了這種情況,而你的智能合約又是沒法升級的,用戶就需要使用“訪問清單”功能來使用你的應用。

訪問清單功能可略微減少Gas開銷,但有些時候也可能會提高總的Gas消耗量。

geth客戶端引入了一種新的RPC方法,叫做?eth_createAccessList?來簡化訪問清單的生成。

“柏林”升級以前的Gas開銷

EVM所執行的每一個操作碼都有一個對應的Gas消耗量。大部分操作碼的消耗量都是固定的:PUSH1?總是消耗3gas,而?MUL?消耗5gas,等等。有一些操作碼的消耗量是可變的:舉個例子,SHA3?操作碼的開銷由輸入值的長度決定。

我們先了解?SLOAD?和?SSTORE?操作碼,因為這兩個操作碼受“柏林”影響最大。后面我們會再談談那些以地址為目標的操作,比如所有的?EXT*?類操作碼和?CALL*?類操作碼,因為它們的Gas開銷也被改變了。

數據:2023 Q2 NFT市場交易總額降至不足30億美元,環比下跌近40%:金色財經報道,據Dapprader最新分析數據顯示,2023年二季度NFT市場交易總額降至約29億美元,環比跌幅達到38%,此外數據還顯示2023年二季度NFT銷量約為1860萬筆,較一季度減少9.2%。Blur仍然在NFT市場中保持了主導地位,但該交易聚合平臺二季度交易額依然較上一季度下降了34%,相比之下第二大NFT市場OpenSea受到的打擊更大,交易額急劇下降超過56%。不過Immutable X Marketplace和JPG Store兩個NFT市場卻逆勢而上,交易額分別增長了37%和64%。Dapprader指出,交易額與市場興奮程度之間的關聯性并不大,交易額下降并不一定表明市場興趣或活動減弱。[2023/7/11 10:47:24]

“柏林”以前的?SLOAD

在EIP-2929實施前,SLOAD?開銷的計算方式很簡單:總是消耗800gas。所以,也沒啥可展開的。

“柏林”以前的?SSTORE

要講到Gas消耗量的計算,SSTORE?操作碼可能是最復雜的了。因為消耗多少取決于該存儲項槽當前的值、要寫入的新值、該存儲項是否已經修改過。我們只會分析少數幾種場景,了解個大概。如果你想了解更多,請閱讀本文末尾所附的EIP鏈接。

如果存儲項的值從0改為1,Gas消耗量是20000

國際貨幣基金組織:長遠來看加密禁令可能并不有效:6月23日消息,國際貨幣基金組織(IMF)撰文稱,加密資產存在的風險因國家或地區而異。央行數字貨幣(CBDC)如果設計得當,可以降低匯款成本并改善金融包容性。另外,加密資產的采用也帶來了許多挑戰和風險,特別是對于宏觀經濟不穩定、機構可信度低、資本流動量大、腐敗和非正規部門的拉丁美洲和加勒比國家而言。雖然一些國家已經完全禁止加密資產,但從長遠來看,這種方法可能并不有效。相反,這些地區應該專注于解決加密需求的驅動因素,包括數字支付需求,并通過在國家統計數據中記錄加密資產交易來提高透明度。[2023/6/23 21:56:11]

如果存儲項的值從1改為2,Gas消耗量是5000

如果存儲項的值從1改為0,消耗量也是5000,但你會在事務執行結束后獲得gas補貼。我們這里也不討論gas返還機制,因為它不會受到柏林的影響

在一筆事務中,如果存儲項已不是第一次修改,則后續每一次?SSTORE?都消耗800gas

細節在這里并不重要,重要的是,SSTORE?是昂貴的,具體消耗多少gas則依賴于多個因素。

EIP-2929之后的Gas消耗量

EIP-2929改變了所有這些數值。但在展開之前,我們要先談談該EIP引入的一個重要概念:被訪問過的地址和被訪問過的存儲項的鍵。

當一個地址或者一個存儲項的鍵,在一筆事務中被“使用過”之后,在該筆交易余下的執行過程中,這個地址都會被當成“已被訪問過的”。舉個例子,如果你在一筆事務中?CALL?另一個合約,那么該合約的地址就會被標記為“訪問過的”。類似地,如果你?SLOAD?或者?SSTORE?過一些存儲項槽,在該筆事務余下的執行過程里,這些槽也會被當成已經訪問過的。到底用的哪個操作碼是沒有關系的,即使你只?SLOAD?過某個槽,接下來使用?SSTORE?時該槽也會被當成已訪問過的。

Sei Network將重新開放跨鏈橋Sei Bridge測試活動:6月13日消息,Layer1公鏈Sei Network將重新開放跨鏈橋Sei Bridge測試活動,并增加了一些新的變化,該活動旨在跨各種網絡測試Sei Bridge以及收集用戶測試后的反饋。[2023/6/13 21:33:02]

注意:存儲項的鍵是“內在于”某些地址中的,一如該EIP所解釋的:

執行事務時,保持一個集合:accessed_addresses:Set?以及?accessed_storage_keys:Set]

也就是說,當我們說某個存儲槽已被訪問過了,我們的實際意思是:(address,storageKey)?已被訪問過了。

搞清楚了這個概念,我們來談談新的Gas消耗量計算模式。

“柏林”以后的?SLOAD

升級前,SLOAD?的Gas消耗量是固定的800。但升級后,Gas消耗量要看這個存儲槽是否已經被訪問過。還沒訪問過的,消耗量就是2100gas;訪問過的,就是100gas。所以,如果某個存儲項槽已經在“已訪問過的存儲項鍵`的集合里了,就可以省掉2000gas。

“柏林”以后的?SSTORE

我們逐個逐個對比下,在EIP-2929實施后,上面的幾個例子會發生什么樣的變化:

如果存儲項的值從0改為1,Gas消耗量是20000

Coinbase首席法務官:法律不會迫使礦工或任何其他人監控或審查交易:9月5日消息,Coinbase首席法務官paulgrewal.eth 發推特表示,我認為(美國)法律非常明確:沒有任何事情會迫使礦工、質押者或律師中的任何其他人監控或審查交易。

其中法律規定不能與受制裁的個人“交易”,必須“封鎖”美國人“擁有”或“控制”的財產,但這并不是指在底層生成區塊的方式,礦工或其他人“促進”的只是交易記錄。[2022/9/5 13:08:58]

如果該存儲項鍵還未訪問過,消耗22100gas

若已訪問過,消耗20000gas

如果存儲項的值從1改為2,Gas消耗量是5000

如果該存儲項鍵還未訪問過,消耗5000gas

若已訪問過,消耗2900gas

如果存儲項的值從1改為0,消耗量保持不變,gas返還機制也不變

在一筆事務中,如果存儲項已不是第一次修改,則后續每一次?SSTORE?都消耗100gas

由此可見,如果某個槽此前已訪問過,則對它的第一次?SSTORE?操作會節約2100gas。

匯總一下

上面的文字實在啰嗦,我們就直接做一張表,把上面提到的值都匯總一下:

前Blockstream CSO:以太坊向PoS過渡將使監管機構更容易控制網絡:8月21日消息,前 Blockstream 首席戰略官 Samson Mow 近日在社交媒體上發表對以太坊合并相關看法,他認為以太坊的問題在于其往往優先考慮 Token 經濟學,而不是去中心化,因此隨著向權益證明(PoS)網絡過渡,監管機構將更容易控制網絡繼而加劇監管捕獲(regulatory capture)風險。

Samson Mow 表示,將驗證者的最低門檻設置為 32 ETH 會限制驗證者的數量,此外,66% 的驗證者需要遵守 OFAC 規定,他們存入質押的 ETH 無法提取(因為提取功能未被編碼),所以與工作量證明(PoW)共識機制相比,PoS 網絡其實更加中心化。[2022/8/21 12:38:47]

注意看最后一行:此時已不再需要區分它到底有沒有被訪問過,因為,如果此前已寫入,則必定已被訪問過。

EIP-2930:可選“訪問清單”的事務類型

另一個“柏林”升級包含的EIP是2930。該EIP加入了一種新的類型的事務,可以在事務的負載中包含一個“訪問清單”,意思是,你可以在事務執行前就聲明哪些地址和存儲槽應被認為是“訪問過的”。舉個例子,對一個未訪問過的槽執行?SLOAD?需要耗費2100gas,但如果該存儲槽被包含在了事務的“訪問清單”中,則操作的消耗量機會降為100gas。

但如果只要地址和槽被當成“已訪問過的”就可以降低操作的Gas消耗量;而訪問清單可以把地址和槽標記為“已訪問過的”;那豈不是說我們可以把這些東西都放在訪問清單中,來獲得Gas消耗量的減免?真棒,天賜Gas!

額,并不完全如此,因為你每添加一個地址或存儲項鍵,都要支付額外的Gas。

舉個例子。假如我們要向合約?A?發送了一條事務。我們編寫了一條這樣的訪問清單:

這是不是說,每次使用訪問清單我們都能節省gas呢?很遺憾,也不是,因為在訪問清單中填入地址也需要支付gas。

訪問過的地址

迄今為止,我們只討論了?SLOAD?和?SSTORE?操作碼,但“柏林”升級還改變了別的操作碼。舉個例子,CALL?操作碼原來的Gas消耗量為固定的700,但2929實施后,如果所調用的地址不在訪問清單中,消耗量將提高到2600;如果在,則降低為100。而且,就像訪問過的存儲鍵一樣,到底哪個操作碼訪問過那個地址并不重要(比如,如果用戶最先調用的是?EXTCODESIZE,這一個操作的消耗量是2600,但后續的調用,只要是對同一個地址的,無論是?EXTCODESIZE、CALL?還是?STATICCALL?,都只消耗100gas。

那個這個設計對帶有訪問清單的事務有何影響?假設我們向合約A發送一條交易,而合約A調用了合約B,而我們在訪問清單中寫入這樣的內容:

我們首先需要為在這條事務的訪問清單中加入這個地址支付2400gas,但對B使用的第一個操作碼就只需要消耗100gas而不是2600gas,這就剩下了100gas。如果B也需要使用其存儲項,我們又知道它將使用哪個鍵,我們也可以把這些鍵包含在訪問列表中,然后為每個鍵的操作省下100或200gas。

但為啥我們要加多一個合約來舉例子?我們不是可以這樣寫嗎?

你當然可以這樣做,但不值得,因為EIP-2929指明了你一開始調用的合約必定會被包含在?accessed_addresses?列表中,所以你就是額外花了2400gas,什么好處都沒得到。

所以,回頭看我們上面舉的例子:

這樣做其實是浪費,除非你在里面加多幾個存儲項鍵。如果我們假設所有的存儲項鍵的第一個操作都是?SLOAD,那你要至少24個鍵,才能賺回來。

而且,如你所見,自己一五一十地分析這些因素、手動生成訪問清單,顯然是極其繁瑣而令人崩潰的事。好在,還有更好的辦法。

eth_createAccessList?RPC方法

Geth客戶端開始將包含一個新的?eth_createAccessList?RPC方法,你可以用它來生成訪問清單,就像使用?eth_estimateGas?一樣,只不過返回的不是Gas消耗量估計,而是形如這樣的數據:

我估計隨著時間推移,我們會越來越知道怎么利用這個功能,但我個人估計,方法的偽代碼形式會像這樣:

防止合約變磚

值得提醒,訪問清單功能的主要目的不是節省Gas。如該EIP自身所述:

緩解由EIP-2929帶來的合約變磚風險,因為事務可以預先指定、預先支付自身嘗試范文的賬戶和存儲槽,因此,在實際的執行中,SLOAD和EXT*操作碼都只會消耗100gas:這個值低到既足以防止2929打破某些合約,也可以“解封”被EIP-1884封印的合約。

原本,只要一個合約預設了執行的Gas開銷,操作碼的Gas消耗量變動就有可能導致它變磚。比如,如果一個合約預設另一個合約的?someFunction?只會用到34500gas,因此總是用?someOtherContract.someFunction{gas:34500}()?調用那個合約,這個合約就有可能變磚。但只要你在事務中添加合適的訪問清單,這個合約就還能工作。

自己驗證

如果你想自己測試一下,克隆這個倉庫,這里面有很多例子,可以使用Hardhat和Geth客戶端來運行。請仔細閱讀README。

Tags:GASTORSTOSTORGasifyTORONTO幣MSTOHistoria

以太坊價格今日行情
Filecoin、Chia硬盤挖礦風生水起,大投機時代來了?_FIL

原標題:《硬盤缺貨?歡迎來到大投機時代》「感謝《賽博朋克2077》,雖然這個游戲一堆bug,但因為它我才在一年前買了RTX3080,現在價格早已翻倍了,感謝2077讓我學會了理財.

1900/1/1 0:00:00
Libra的“簡化版”Diem或于今年啟動試點_DIE

來源:澎湃新聞,作者:葉映荷社交巨頭臉書Facebook提出并主導的數字貨幣Diem預計將在今年晚些時候推出.

1900/1/1 0:00:00
鑫豐匯智CEO明會:這可能是入局分布式存儲的最后時間窗口_FIL

2021年2月-3月,分布式存儲迎來爆發,賽道龍頭項目Filecoin從20美金直接暴漲至最高238美金,漲幅接近了1900%,目前摸高后跟隨比特幣一起回調.

1900/1/1 0:00:00
巴比特專欄丨劉毅:Web 3.0 是一個必然的趨勢,應用鏈將成為新機遇_WEB

本文來自章魚網絡創始人劉毅在“Near2021上海行”活動上的主題演講的整理。Web3.0是一個必然的趨勢Web3.0是必然的趨勢。如果你率先參與,就能夠分享到趨勢帶來的收益和利益.

1900/1/1 0:00:00
2天議程+20余場周邊活動大曝光,成都這么玩就對了!丨成都算力大會預熱_區塊鏈

4月17-18日,“超算·融合,2021全球區塊鏈算力大會”將在四川成都召開。大會由巴比特、鏈節點、幣印聯合主辦,吳說區塊鏈協辦,算力360總冠名.

1900/1/1 0:00:00
市場FOMO情緒被點燃 SumSwap節點預售預計月底前結束_SUM

區塊鏈誕生十余年之久,每年市場上誕生的區塊鏈項目以成千上萬來計算,但是真正存活下來項目不到10%,而存活的10%的項目里面又會根據項目發展情況進行劃分.

1900/1/1 0:00:00
ads