買以太坊 買以太坊
Ctrl+D 買以太坊
ads

NBS:搞懂 “柏林” 之后的合約 Gas 開銷_Philosoraptor

Author:

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

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

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

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

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

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

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

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

Open Campus:今日向Binance轉入的416萬枚EDU將用于提供流動性:5月30日消息,Web3 教育協議 Open Campus 針對今日早些時候將解鎖的約 416 萬枚 EDU 轉入 Binance 一事發文表示,根據公布的歸屬時間表,目前已解鎖 2100 萬枚 EDU,錢包中仍有 1700 萬枚 EDU 尚未移動或出售,400 萬枚已于今天早間轉移至 Binance 用于提供流動性。[2023/5/30 11:48:46]

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

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

如果存儲項的值從 0 改為 1(或者任意非零的值),Gas 消耗量是 20000

如果存儲項的值從 1 改為 2(或者任意非零的值),Gas 消耗量是 5000

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

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

Future FinTech Group重新符合納斯達克上市要求:金色財經報道,加密公司 Future FinTech Group 宣布于 2023 年 4 月 21 日收到納斯達克股票市場上市資格人員的書面通知,表明公司已重新遵守納斯達克股票市場的定期備案要求上市規則 5250(c)(1)。

2023 年 4 月 18 日,公司收到員工的來信,稱由于未及時提交 10-K 表格的年度報告,公司不符合納斯達克上市規則 5250(c)(1) 的規定。根據公司 2022 年12 月 31 日結束的財政年度 10-K 表格于 2023 年 4 月 19 日提交的文件。[2023/4/24 14:23:55]

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

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

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

FRAX現報價0.8947美元,24小時跌幅達10.4%:金色財經報道,據CoinGecko最新數據顯示,FRAX現報價0.894788美元,24小時跌幅達10.4%。行情波動較大,請做好風險控制。[2023/3/11 12:56:36]

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

執行事務時,保持一個集合:accessed_addresses: Set[Address] 以及 accessed_storage_keys: Set[Tuple[Address, Bytes32]]

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

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

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

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

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

若已訪問過,消耗 20000 gas

巴西Bitpreco交易所計劃擴展功能,提供銀行服務:11月23日消息,巴西加密交易所Bitpreco計劃擴展其功能,通過一個名為Bitybank的新平臺提供銀行服務。該公司還將開放支付和數字賬戶服務,計劃通過現金返還計劃吸引更多用戶使用加密貨幣,并消除用戶對購買加密貨幣的擔憂。

據了解,Bitpreco是巴西最大的比特幣交易平臺之一,過去三個月市場占比達到13%;從2020年到2021年,該公司注冊用戶數量已經增長了5倍。Bitpreco預計新計劃將使其用戶基數增加50%。(news.bitcoin)[2022/11/23 8:00:16]

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

若已訪問過,消耗 2900 gas

如果存儲項的值從 1(或任意非零的值) 改為 0,消耗量保持不變,gas 返還機制也不變

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

由此可見,如果某個槽此前已訪問過,則對它的第一次 SSTORE 操作會節約 2100 gas(相比于從未訪問過)。

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

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

NBA球星杜蘭特提交26項元宇宙與NFT商標申請:金色財經報道,美國國家籃球協會(NBA)布魯克林網隊的職業籃球運動員凱文·杜蘭特與他的風險投資公司Thirty Five Ventures LLC一起,于5月19日向美國專利和商標局(USPTO)提交了多達26項元宇宙與NFT商標申請。(finbold)[2022/5/24 3:38:46]

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

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

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

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

這是不是說,每次使用訪問清單我們都能節省 gas 呢?很遺憾,也不是,因為在訪問清單中填入地址也需要支付 gas。(也就是我們示例中的 "<address of A>")

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

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

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

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

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

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

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

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

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

防止合約變磚

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

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

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

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

Tags:NBSBSPGASTORnbs幣發行量BSPNetworkugas幣怎么找不到了Philosoraptor

狗狗幣最新價格
META:Metis Rollup為何能在Layer2賽道脫穎而出?_ETI

DAO概念近日收獲了不少市場關注,并有望成為Web3風口下最具潛力的熱門賽道。實際上,DAO并不是新鮮概念,只是真正實現落地應用的DAO項目寥寥無幾.

1900/1/1 0:00:00
BAS:coinbase家的$coin可不可以買?_Wrapped ILCOIN

特別注明:$COIN雖然叫coin但不是幣哈,是coinbase家的股票,一切告訴你有相關空投的都是騙子!!! 大家好,我是佩佩,今天是大餅跌進熱搜的一天[捂臉],比特幣跌去11個點.

1900/1/1 0:00:00
加密貨幣:拜登加稅為何引發幣價大跌中國炒幣是否需要納稅?_CFT

1.美國加密貨幣稅收情況4月22日一則新聞引發美股與加密貨幣市場暴跌。美國總統拜登提議對于富人加稅,將資本利得稅最高提高到39.6%,幾乎相當于現有最高稅率的2倍,這一提議使得標普500指數下跌.

1900/1/1 0:00:00
CAP:一文讀懂歐易OKEx旗下OKEx Blockdream Ventures投資版圖(推薦收藏)_TAL

2021年,加密市場繼續高歌猛進,熱門賽道頻獲融資。據鏈捕手不完全統計,今年一季度全球加密市場共發生255起投融資事件(不包括IDO),是去年同期的3倍以上,涵蓋波卡生態、DeFi、NFT、加密.

1900/1/1 0:00:00
DEF:DeFi:如何把金融用一個“if then”邏輯自動實現?_Yearn DeFi Fork

本期嘉賓 Alex Yang,北大數學系學霸,美國西北大學數學博士,現任VSYS首席執行官 01 DeFi是個幣嗎?它是個網絡嗎?它是以太坊上的應用嗎?它到底是個啥? 02 區塊鏈整個產業鏈里哪.

1900/1/1 0:00:00
DEFI:NFT熱潮真的是泡沫嗎?看20余位業內外專家如何評說_EFI

3月11日,藝術家Beeple的NFT藝術品EVERYDAYS: THE FIRST 5000 DAYS以6934萬美元(約4.5億人民幣)拍賣成交,刷新了虛擬藝術品的拍賣成交價記錄.

1900/1/1 0:00:00
ads