xDeFi Labs:以太坊Gas面面觀
二級標題
二級標題
二級標題
1. 以太坊區塊鏈Gas的消耗邏輯:GasPrice和GasLimit
Eth的區塊在2017年底1CO狂熱和2020年初312大崩潰時經歷了了兩次暫時的“滿塊”,就是用戶使用時需要為了區塊空間進行競爭,用戶過多,報價過低而無法打包交易,一定時間後交易失敗,但是因為2019年ERC-20USDT的廣泛使用和2020年Uniswap的廣泛使用,導致了常態性的滿塊(總的gas消耗gasLimit超過了一塊所能承受的12500000。
二級標題
二級標題
二級標題
2. 在Solidity編程計算層面如何保證更低的Gas
Solidity的書寫風格有些像javascript,具體執行層面依賴於編譯成EVM可運行的操作碼。我們先不論他被編譯成什麼樣的操作碼能夠節省gas,至少在Solidity這一層面做計算,你可以找機會節省盡可能多的gas。
A 整數計算思維
Solidity並沒有IEEE-754所定義的浮點數:這類浮點數計算本來是指導了CPU的寄存器設計,若為了共識的“通用性、確定性、一致性”考慮,最常見的數據類型是uint256,以及用整數先模擬小數,再模擬浮點數的行為,但整體來看,需要編程者有整數思維。
假設你有方便的數學庫,你會發現a.div(2)其實是不如a>>1來的快,因為數學庫的乘除法依然是調用此類消耗較小的操作完成的。好在eth開發的先驅者(比如openzeppellin,gnosis,balancer等)在實現項目的過程中產出了一些數學庫方便別人使用,這些操作包括四則運算,乘方開方,以及指數對數操作。
這裡有一篇不錯的四則運算以外的計算方案介紹
網頁鏈接
B 規避循環,除非你清楚你的計算複雜度當循環條件是開放的時候,比如for循環第二個條件為空,或者while語句判斷條件為真的時候,很容易無法估計循環體內計算對gas是怎樣的消耗,會讓gas消耗不可接受,或者metamask(以及其他工具)無法正確估計gasLimit導致eth合約調用失敗。二級標題二級標題
根據
根據根據根據
網頁鏈接
給出的線索,以太坊黃皮書給出了詳細的費用明細。
這篇文章中提到了Gtxdatazero和Gtxdatanonzero的費用差別,這個核心差別的邏輯就是:eth地址裡面的00越多(注意,是成對出現的0),不管這個地址是合約的,還是普通人轉入轉出地址,都或多或少的節省0.4-5%的gas費用。網頁鏈接二級標題
二級標題
二級標題
4. GasToken家族:另一種實操
1inch CHI gastoken在GST2之上,增加了token地址中包含的00數量,但因為1inch更加積極的商業化運營,也讓這種操作正逐漸變的廣為人知。
二級標題
二級標題
二級標題
5. 案例xDeFi&Labs如何優化gas
考慮到上百萬美金的zksnarks layer2方案審計成本,xDeFi&Labs團隊暫時選擇了先驗證產品邏輯。
在產品優化過程中,用戶的交易已經涉及了a**b的邏輯,其中b是用uint256表示的decimal變相承擔小數的作用。在金融產品設計過程中,對池的平衡性設計可以將b的取值由[1,49]之間任意的小數,迅速的縮減到{1,2,3,4,6,8,12}等一組正整數上,節省數千到數萬gas成本。在調用數學庫時,Balancer數學庫bpow的小數部分並沒有被真正調用,而只有bpowi被調用了。


