在北京時間4月15日下午18:00左右,以太坊的柏林硬分叉升級將會發生,這次升級將納入4個新的EIP改進提案,而其中兩個將會影響交易的gas成本計算。
本文解釋了在這次硬分叉升級前后的gas成本計算,這將如何隨EIP-2929而發生改變,以及如何使用EIP-2930引入的訪問列表功能,原文作者是NomicLabs軟件開發者FrancoVictorio。
注:文章篇幅較長,以下是其中的一些要點:
柏林硬分叉改變了一些opcode操作碼的gas成本。如果你在dapp或智能合約中有一個硬編碼的gas值,它們可能會停止工作。如果發生這種情況,并且智能合約是不可升級的,則用戶將需要使用訪問列表來啟用它。
訪問列表可用于稍稍降低gas成本,但在某些情況下,它們實際上會增加gas消耗總量。
geth包含了一個新的RPC方法來簡化訪問列表的創建。
柏林硬分叉前的gas成本
EVM執行的每個opcode操作碼都有一個相關的gas成本。對于大多數操作碼而言,這個成本是固定的:PUSH1總是消耗3個單位的gas,MUL則消耗5個單位的gas,等等。而對于其他操作碼來說,它是可變的:例如,SHA3操作碼的成本取決于其輸入的大小。
ZK Rollup擴容方案StarkNet Alpha上線以太坊主網:11月29日消息,StarkWare推出的以太坊Rollup擴容方案StarkNet Alpha今日上線以太坊主網。StarkNet是一個無需許可的以太坊L2網絡去中心化Rollup擴容方案。StarkNet允許任何dApp實現其計算規模,而不會影響可組合性和安全性,它依賴于安全和具可擴展性的加密證明系統——STARK。StarkNet建立在Cairo編程語言之上,Cairo和STARK均由 StarkWare內部開發,并為生產級應用程序提供支持。除其他功能外,StarkNet Alpha支持通用計算智能合約,支持與其他StarkNet合約以及通過 L1<>L2 消息與L1合約的可組合性。StarkNet Alpha在Rollup模式下運行,所有狀態差異數據都在鏈上發送。
StarkNet Alpha上線以太坊主網意味著開發者可以在StarkNet上部署他們的合約,用戶可以向這些合約發送交易,每個StarkNet區塊都在鏈上被證明和驗證,應用程序獲得無限擴展并保持L1安全性。這是一個Alpha版本,該網絡仍在開發中。團隊不斷添加功能、修復錯誤并對其進行改進。在接下來的幾周和幾個月內,團隊將在以下功能上升級Alpha:合約升級機制;收費機制;添加系統調用(get_block_number、get_block_timestamp 等)。[2021/11/30 12:39:57]
我們將重點討論SLOAD和SSTORE操作碼,因為它們是受柏林硬分叉影響最大的操作碼。我們稍后將討論那些以地址為目標的操作碼,就像所有的EXT*和CALL*操作碼,因為它們的gas成本也會發生變化。
數據:10.54萬枚ETH在近一周被質押至以太坊2.0合約:據歐科云鏈鏈上大師數據顯示,當前以太坊2.0存款合約地址已收到658.86萬ETH,占以太坊供應量的5.64%,近一周新增質押105440 ETH,新增質押量環比增長62.71%。近一周驗證人收入7838 ETH,環比增長0.32%。[2021/8/9 1:43:15]
柏林硬分叉之前的SLOAD
如果沒有EIP-2929,SLOAD的成本很簡單:它總是會消耗800gas。
柏林硬分叉之前的SSTORE
就gas而言,SSTORE可能是最復雜的操作碼,因為它的成本取決于存儲slot的當前值、新值以及它是否以前被修改過。我們將只分析一些場景以獲得基本的理解。如果你想了解更多,請閱讀本文末尾鏈接的eip。
如果slot的的值從0更改為1,則成本為20000;
如果slot的的值從1更改為2,則成本為5000;
如果slot的的值從1更改為0,則成本也為5000,但在交易結束時你將獲得gas退款。這篇文章中,我們不會詳細討論退款,因為它們不受柏林硬分叉的影響;
如果以前在同一事務中修改了該值,則所有后續sstore的成本為800;
這里的細節有些枯燥,重要的一點是,SSTORE是非常昂貴的,其成本取決于幾個因素。
本周五將有19億美元的以太坊期貨及期權到期:金色財經報道,本周五將有19億美元的以太坊期貨及期權到期。盡管以太坊期貨未平倉合約為62億美元,但周五到期的僅占16%(約9.8億美元)。因為大多數操作都發生在永續合約和6月合約上。[2021/5/28 22:51:24]
實施EIP-2929之后的gas成本
EIP-2929改變了所有這些值,但在此之前,我們需要先談談這個EIP引入的一個重要概念:已訪問地址和已訪問存儲密鑰。
如果地址或存儲密鑰以前在交易期間被“使用”,則該地址或存儲密鑰就被視為已訪問。例如,當你調用另一個合約時,該合約的地址會被標記為已訪問。類似地,當你SLOAD或SSTORE某些slot時,它將被視為在交易的其余部分已被訪問。不管是哪個操作碼做的:如果一個SLOAD讀取了一個slot,那么它將被認為對接下來的SLOAD以及SSTORE都是已訪問的。
這里需要注意的一點是,存儲密鑰位于某個地址的“內部”。正如EIP所解釋的:
“執行事務時,維護一組accessed_addresses:Set和accessed_storage_keys:Set]”
也就是說,當我們說一個存儲slot被訪問時,我們實際上是說一對(address,storageKey)被訪問了。
話雖如此,我們還是來談談新的gas成本吧。
1.16%的以太坊已被抵押至ETH2.0存款合約:金色財經消息,據歐科云鏈OKLink數據顯示,截至下午2時,以太坊2.0存款合約地址已收到1316609ETH,占以太坊當前供應量的1.16%,余額在所有的以太坊地址中排名第六,近24小時新增余額37888ETH。[2020/12/10 14:47:44]
柏林硬分叉之后的SLOAD
在柏林硬分叉之前,SLOAD的固定成本是800gas,現在,這取決于是否已訪問了存儲slot。如果未訪問,則成本為2100gas,如果已訪問,則成本為100gas。因此,如果slot在已訪問的存儲密鑰列表中,則一次SLOAD的成本會降低2000gas。
柏林硬分叉之后的SSTORE
讓我們在部署EIP-2929的環境下回顧一下之前的SSTORE示例:
如果slot的值從0更改為1,則成本為:22100,20000;
如果slot的值從1更改為2,則成本為:5000,2900;
如果slot的值從1更改為0,則成本與上一項相同,然后加上退款;
如果以前在同一交易中修改了該值,則所有后續SSTORE的成本為100;
如你所見,如果要修改的slot以前被訪問過,那么第一次SSTORE的成本將降低2100gas。
下面的表總結了目前為止所有改變的值:
Unitimes社區合伙人:以太坊layer2方案規避了單一layer2所帶來的潛在的風險和壟斷:金色財經報道,在今日OKEx礦池與以太坊中國社區主辦的ETH 2.0 AMA中,Unitimes社區合伙人Jason表示,首先是選擇性的問題。以太坊layer2方案的繁榮給予開發者和用戶更多的選擇,同時規避了單一layer2所帶來的潛在的風險和壟斷。比如大家討論得熱火朝天的ZK-Rollup和Optimistic Rollup,從token交易的角度來看,ZK-Rollup的交易速度更快,結算時間更短,對于DEX類應用更加友好,體驗更加絲滑,所以Loopring選擇了ZK-Rollup。而Optimistic Rollup對智能合約邏輯實現的支持更加友好,允許開發者去構建更加復雜的DeFi應用,所以你看Synthetix選擇了Optimistic Rollup。這是第一個好處,生態內有了更加豐富的選擇,然后這些選擇反哺生態,讓生態變得更加繁榮。第二個是從整體的角度來看,以太坊的安全性和可擴展性都得到了提升。我們知道,layer1,也就是我們所說的主鏈,是以太坊數據最終的安全性保障。一方面,layer1的擴展提升了鏈上數據處理的效率,同時也極大地降低了發生垃圾交易攻擊的可能性。第三個是價值捕獲和網絡效應。layer1和layer2的結合使得以太坊可以滿足絕大多數的金融以及其他領域的應用需求。隨著PoS的到來以及DeFi的繁榮,以太坊上質押的資產形式會越來越多,最終也許真的就成為了大家夢寐以求的“結算層”。同時,這種金融繁榮會帶來更大的網絡效應,推動包括DeFi在內的以太坊生態進一步發展,這是一個強正反饋。更多內容見原文鏈接。[2020/6/17]
請注意,在最后一行中,談論是否訪問了slot是沒有意義的,因為如果它以前被寫入過,則表明其也被訪問過。
EIP-2930
我們在文章開頭提到的另一個EIP就是EIP-2930,這個改進提案添加了一種新類型的事務,該事務可以在事務負載中包括訪問列表。這意味著你可以在事務開始執行之前預先聲明哪些地址和slot應被視為是已訪問的。例如,一個未訪問slot的SLOAD成本為2100,但是如果該slot包含在事務的訪問列表中,則相同的操作碼成本就為100。
但是,如果當地址或存儲密鑰已被訪問時,gas成本變更低了,這是否意味著我們可以將所有內容添加到事務的訪問列表中并降低gas成本呢?不完全是這樣,因為你還需要為添加的每個地址和每個存儲密鑰支付gas。
讓我們看一個例子,假設我們正在向合約A發送一筆交易,訪問列表可能如下所示:
如果我們用這個訪問列表發送了一筆交易,并且第一個使用0x0slot的操作碼是SLOAD,則它將花費100gas,這就降低了2000gas的消耗量。但事務訪問列表中包含的每個存儲密鑰的成本為1900gas,所以我們只省了100gas。
這是否意味著我們在使用帶有訪問列表的交易時總是能節省gas消耗?并非如此,因為我們還要為訪問列表中的地址支付gas成本
已訪問地址
以上,我們只討論了SLOAD和SSTORE操作碼,但這些并不是柏林硬分叉之后唯一改變的操作碼。例如,原先調用操作碼的固定成本為700gas。但是在實施EIP-2929之后,如果地址不在訪問列表中,則開銷就是2600gas,但如果是在已訪問列表中,則開銷就是100gas。而且,與已訪問存儲密鑰一樣,之前訪問該地址的操作碼并不重要。
這是如何受到訪問列表交易的影響的?例如,如果我們將一筆交易發送至合約A,而該合約調用另一個合約B,那么我們可以包含如下訪問列表:
我們必須支付2400gas的費用才能將這個訪問列表包含在交易中,但是第一個使用B地址的操作碼將花費100gas。所以我們這樣做就節省了100gas,如果B以某種方式使用它的存儲,并且我們知道它將使用哪些密鑰,那么我們還可以將它們包括在訪問列表中,并為每個密鑰節省100/200的gas。
但我們為什么要談另一個合約呢?我們調用的合約怎么了?我們為什么不這樣做?
我們可以這樣做,但這是不值得的,因為EIP-2929指定了被調用的合約地址總是包含在accessed_addresses列表中,因此這只會白白浪費2400gas。
讓我們再次分析上一節的示例:
這實際上是浪費,除非我們包含多個存儲密鑰。如果我們假設一個SLOAD總是首先使用一個存儲密鑰,那么我們至少需要24個存儲密鑰才能實現收支平衡。
顯然,分析并創建這樣的一個訪問列表是沒有意義的。幸運的是,我們有更好的方法。
eth_createAccessListRPC方法
Geth包含了一個新的eth\ucreateAccessListRPC方法,其可以用來生成訪問列表。它的用法類似于eth_estimateGas,但它不是用于估算gas,而是返回如下內容:
也就是說,它為你提供了該交易將使用的地址和存儲密鑰的列表,以及如果包含訪問列表,則會消耗的gas。
我想,隨著時間的推移,我們會發現執行此操作的正確方法是什么,而我的偽代碼猜測是:
激活合約
必須要指出的是,訪問列表的主要目的不是使用gas,正如EIP所解釋的:
“EIP-2929所引入的是減輕合約破壞風險,因為交易可預先指定和支付交易計劃訪問的帳戶和存儲slot。因此,在實際執行中,SLOAD和EXT*操作碼只需要100gas,這已經足夠低了,它不僅可防止因該EIP而導致的破壞,還可以“激活”由于EIP1884而卡住的任何合約。”
這意味著,如果一個合約對執行某些操作的成本做出假設,那么gas成本的增加可能會導致它無法工作。例如,一個合約調用另一個合約因為它假設某個函數正好使用34500gas,那么它就會中斷,但如果在事務中包含適當的訪問列表,那么合約將再次工作。
如果你想自己測試這些EIP,你可以復制這個repo,它有幾個可使用Hardhat和geth執行的示例。有關說明,請查看README文件。
相關資料:
1、EIP-2929?和EIP-2930?
2、EIP-2930依賴于柏林硬分叉的另一組成部分:EIP-2718?;
3、EIP-2929引用了大量EIP-2200?的內容,所以如果你想更深入地了解gas成本,你應該從EIP-2200開始;
4、有關比較gas使用量變化的更復雜示例?;
作者:芝麻 美東時間4月14日,美國最大的加密貨幣交易所Coinbase在納斯達克直接上市。股價高開低走,最高價429.54美元,最終收于328.28美元,較參考價250美元上漲31.31%,總.
1900/1/1 0:00:00摘要:WillyWoo在Unchainedpodcast上表示,因為比特幣,我們都在見證一個新的貨幣體系的誕生.
1900/1/1 0:00:004月份對于數字資產而言整體是一段利好時期,這一資產類別在過去24小時內面臨了本月的第一次重大調整。比特幣被推低到達了3月25日的價格水平,以太坊短暫地跌破了2000美元.
1900/1/1 0:00:00盡管過去幾天出現了較大幅度回調,但自4月初以來,ETH的價值從1,800美元升至2,480美元的峰值,增長了近30%。以太坊在網絡擁塞和交易成本上升的批評聲中逐漸崛起.
1900/1/1 0:00:00最近,Sequoia、AndreesenHorowitz、SocialCapital、CoinbaseVentures、PanteraCapital和Reddit聯合創始人AlexisOhani.
1900/1/1 0:00:00免責聲明:由于Kusama的拍賣細節尚未完全披露,因此此信息可能還會隨時更改。總體而言,我們為Kusama網絡拍賣預留了30%的儲備金。對于第一次拍賣,我們將使用15%的SDN令牌.
1900/1/1 0:00:00