“柏林”硬分叉將在4月15日激活,該硬分叉所包含EIP中的兩個都會影響事務的Gas開銷。本文會解釋“柏林”激活之前,一些操作碼的Gas消耗量是如何計算的,而EIP-2929對此有何影響,以及,2930引入的訪問清單功能應如何使用。
摘要
這篇文章很長,你要是只想知道結論,看完這部分就可以把網頁關掉了:
柏林硬分叉改變了某些操作碼的Gas開銷。如果你在自己的應用中硬編碼了一些操作可使用的Gas數量,這些操作可能會卡死。如果真的出現了這種情況,而你的智能合約又是沒法升級的,用戶就需要使用“訪問清單”功能來使用你的應用。
訪問清單功能可略微減少Gas開銷,但有些時候也可能會提高總的Gas消耗量。
geth客戶端引入了一種新的RPC方法,叫做?eth_createAccessList?來簡化訪問清單的生成。
“柏林”升級以前的Gas開銷
EVM所執行的每一個操作碼都有一個對應的Gas消耗量。大部分操作碼的消耗量都是固定的:PUSH1?總是消耗3gas,而?MUL?消耗5gas,等等。有一些操作碼的消耗量是可變的:舉個例子,SHA3?操作碼的開銷由輸入值的長度決定。
Voyager于5小時前售出1449枚ETH并收到225萬枚USDC:金色財經報道,Lookonchain監測數據顯示,Voyager于5小時前通過Wintermute售出1449枚ETH并收到225萬枚USDC,售價為1553美元。
Voyager仍在出售資產,目前持有:148774枚ETH(2.335億美元);5.17萬億枚SHIB(5778萬美元);144萬枚LINK(1000萬美元);1.17億枚STMX(730萬美元);41萬枚AVAX(670萬美元)等。[2023/3/5 12:43:12]
我們先了解?SLOAD?和?SSTORE?操作碼,因為這兩個操作碼受“柏林”影響最大。后面我們會再談談那些以地址為目標的操作,比如所有的?EXT*?類操作碼和?CALL*?類操作碼,因為它們的Gas開銷也被改變了。
“柏林”以前的?SLOAD
在EIP-2929實施前,SLOAD?開銷的計算方式很簡單:總是消耗800gas。所以,也沒啥可展開的。
“柏林”以前的?SSTORE
要講到Gas消耗量的計算,SSTORE?操作碼可能是最復雜的了。因為消耗多少取決于該存儲項槽當前的值、要寫入的新值、該存儲項是否已經修改過。我們只會分析少數幾種場景,了解個大概。如果你想了解更多,請閱讀本文末尾所附的EIP鏈接。
馬斯克:已經控制住Twitter開支,沒有瀕臨破產:金色財經報道,Twitter首席執行官馬斯克在社交媒體上表示,已經控制住Twitter的開支,但Twitter目前還不夠安全,沒有瀕臨破產,還有很多工作要做。[2022/12/25 22:06:31]
如果存儲項的值從0改為1,Gas消耗量是20000
如果存儲項的值從1改為2,Gas消耗量是5000
如果存儲項的值從1改為0,消耗量也是5000,但你會在事務執行結束后獲得gas補貼。我們這里也不討論gas返還機制,因為它不會受到柏林的影響
在一筆事務中,如果存儲項已不是第一次修改,則后續每一次?SSTORE?都消耗800gas
細節在這里并不重要,重要的是,SSTORE?是昂貴的,具體消耗多少gas則依賴于多個因素。
EIP-2929之后的Gas消耗量
EIP-2929改變了所有這些數值。但在展開之前,我們要先談談該EIP引入的一個重要概念:被訪問過的地址和被訪問過的存儲項的鍵。
當一個地址或者一個存儲項的鍵,在一筆事務中被“使用過”之后,在該筆交易余下的執行過程中,這個地址都會被當成“已被訪問過的”。舉個例子,如果你在一筆事務中?CALL?另一個合約,那么該合約的地址就會被標記為“訪問過的”。類似地,如果你?SLOAD?或者?SSTORE?過一些存儲項槽,在該筆事務余下的執行過程里,這些槽也會被當成已經訪問過的。到底用的哪個操作碼是沒有關系的,即使你只?SLOAD?過某個槽,接下來使用?SSTORE?時該槽也會被當成已訪問過的。
a16z合伙人Chris Dixon:因投資Coinbase而未投資FTX,離岸交易所不受監管本身就是隱患:12月19日消息,a16z 合伙人 Chris Dixon 近日在 The Block 的播客 The Scoop 中談到為什么 a16z 從未投資過 FTX等話題。主持人問 Chris Dixon躲過 FTX 是技巧還是運氣,對此,Chris Dixon 表示,自己只和 SBF 在線上會議上有過對談,并無深交。之所以沒有投資 FTX 主要是因為投資了 Coinbase,而和 Coinbase 合作的經驗告訴他,合規、安全要比靈魂和創新更重要,所以,FTX 這種離岸加密交易所不受監管本身就是一種隱患。
為什么 FTX、Phoenix 等交易所會選擇將總部設立在巴哈馬群島?誰來審計他們?Chris Dixon 說道,沒有投資 FTX 并非完全出于運氣,a16z 在投資領域積累了十多年的經驗,會在投資前做大量的工作,并且認真思考什么是真正的技術創新。[2022/12/19 21:54:14]
注意:存儲項的鍵是“內在于”某些地址中的,一如該EIP所解釋的:
執行事務時,保持一個集合:accessed_addresses:Set?以及?accessed_storage_keys:Set]
Devere Group CEO:正在逢低買入比特幣:金色財經報道,金融咨詢和資產管理公司 Devere Group 的首席執行官 Nigel Green 已確認他正在下跌中買入比特幣。在本周發布的一篇博客文章中,這位高管概述了他在加密市場拋售中購買更多比特幣的各種原因。一個原因是鯨魚是大量加密貨幣的投資者,他們持有足夠的資產,有可能改變貨幣估值。最近幾周,鯨魚一直在拋售,這會降低市場價格,因為其他人會受到驚嚇和恐慌性拋售。我感覺到他們正準備在未來幾周內采取行動購買和補充他們的資產。他補充說:像許多大公司、金融機構、政府、著名大學和家喻戶曉的投資傳奇一樣,我相信數字貨幣是貨幣不可避免的未來。在我們日益技術驅動的全球化世界中,持有數字、無國界、去中心化的貨幣是有意義的,”格林認為。“此外,采用和需求一直在增加,而與此同時,供應卻在減少。(news.bitcoin)[2022/9/11 13:22:22]
也就是說,當我們說某個存儲槽已被訪問過了,我們的實際意思是:(address,storageKey)?已被訪問過了。
搞清楚了這個概念,我們來談談新的Gas消耗量計算模式。
“柏林”以后的?SLOAD
升級前,SLOAD?的Gas消耗量是固定的800。但升級后,Gas消耗量要看這個存儲槽是否已經被訪問過。還沒訪問過的,消耗量就是2100gas;訪問過的,就是100gas。所以,如果某個存儲項槽已經在“已訪問過的存儲項鍵`的集合里了,就可以省掉2000gas。
SIX Digital Exchange 為機構推出以太坊質押:金色財經報道,SIX數字交易所(SDX)宣布推出面向機構的非托管以太坊質押服務。SDX的解決方案使機構能夠通過基于API的基礎設施安全地管理以太坊驗證節點,從而從質押中獲得收益。它正在與瑞士私人財富領域的第一個客戶簽約。
SDX最初于11月推出,目標是股票、債券和現實世界資產的代幣化,今年6月,該公司推出了包括數字資產托管和加密股權的web3服務。(ledgerinsights)[2022/8/25 12:48:14]
“柏林”以后的?SSTORE
我們逐個逐個對比下,在EIP-2929實施后,上面的幾個例子會發生什么樣的變化:
如果存儲項的值從0改為1,Gas消耗量是20000
如果該存儲項鍵還未訪問過,消耗22100gas
若已訪問過,消耗20000gas
如果存儲項的值從1改為2,Gas消耗量是5000
如果該存儲項鍵還未訪問過,消耗5000gas
若已訪問過,消耗2900gas
如果存儲項的值從1改為0,消耗量保持不變,gas返還機制也不變
在一筆事務中,如果存儲項已不是第一次修改,則后續每一次?SSTORE?都消耗100gas
由此可見,如果某個槽此前已訪問過,則對它的第一次?SSTORE?操作會節約2100gas。
匯總一下
上面的文字實在啰嗦,我們就直接做一張表,把上面提到的值都匯總一下:
注意看最后一行:此時已不再需要區分它到底有沒有被訪問過,因為,如果此前已寫入,則必定已被訪問過。
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。
尊敬的用戶: WBF即將在Defi板塊上線QC/USDT交易對,具體上線時間請關注官方公告。項目介紹:Queen''sChess有著強大的技術團隊和致力研究HECO的核心技術團隊提供完善成熟的技.
1900/1/1 0:00:00大家好,我是來自CKcoin平臺首席分析師老崔說幣,也是你們的朋友老崔說幣,老崔說幣專注數字貨幣行情分析,爭取為廣大幣友傳遞最有價值的幣市信息,歡迎廣大幣友的關注與點贊.
1900/1/1 0:00:00幣圈院士投資幣圈十余載,你的眼里是百倍杠桿的利潤,而我考慮的是萬丈深淵的風險,思路決定出路,看待行情不同的角度決定了你會為了利潤鋌而走險,而我會為了避開風險而放過一單的利潤.
1900/1/1 0:00:00本文來自?The?Information,原文作者:KateClark?&AlexHeathOdaily?星球日報譯者?|念銀思唐 摘要: -在新一輪融資中.
1900/1/1 0:00:00Gate.io“理財寶”上線至今推出許多款熱門幣種高年化率鎖倉/活期理財產品,始終緊跟市場步伐推出當下熱門的理財產品,深受用戶的喜愛與支持.
1900/1/1 0:00:00在上線主網一周之后,算法穩定幣協議Fei完成了幾次社區提案投票,但距離Fei何時回到1美元錨定價,依舊是毫無頭緒,而在昨日.
1900/1/1 0:00:00