本文作者:ripwu
源起
前幾天群里有討論UniswapV3中詢價的處理,簡單翻了下代碼,發現與UniswapV2相比,V3變化真的很大~
其中v3-periphery目錄下的Path
functionflashArbs(PoolTiercalldatainput)external;
數據編碼為
0000000000000000000000000000000000000000000000000000000000000020//input.offset0000000000000000000000000000000000000000000000000000000000000004//input.length00000000000000000000000055542f696a3fecae1c937bd2e777b130587cfd2d//input00000000000000000000000000000000000000000000000000000000000001f40000000000000000000000009d7076ad0f7fdc5f0f249e97721d36a448d24906//input0000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000006ce15889c141c09ecf76a57795e91214a1f97648//input0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000dfc647c079757bac4f7776cc876746119ac451ea//input0000000000000000000000000000000000000000000000000000000000002710
Coinbase正將UniSwap和Aave引入Base:金色財經報道,Coinbase 正著手將去中心化金融 (DeFi) 應用程序 UniSwap 和 Aave 引入 Base。一位知情人士表示,Coinbase 正在為 Base 招募很多協議。UniSwap 和 Aave 就是其中的兩個,UniSwap 可能會在幾個月內集成至 Base。
此前報道,2 月 23 日,Coinbase 發布以太坊 L2 網絡Base,Base 是一個安全、低成本、開發人員友好的以太坊 L2,旨在為 Web3 引入下一代十億用戶。Base 將定位為 Coinbase 的鏈上產品家園,同時也是任何人都可以構建的開放生態系統。據悉,Base 的開發將基于 OP Stack 構建,并與 Optimism 合作,目前測試網已經上線,主網將稍后發布。[2023/3/15 13:04:13]
消耗gas為230*490*16=2360
節省gas為280
UniswapV3優化
從上面兩個例子可以看到,solidity編碼的最大問題在于padding,即32字節對齊,導致引入了非常多無效的空字節
鏈游平臺Gala Games與Unity達成2000萬美元專業服務協議:6月9日消息,鏈游平臺 Gala Games 宣布與游戲引擎供應商 Unity Technologies 達成一項 2000 萬美元的專業服務協議。根據這項交易,Unity 將利用其開發和實時 3D 平臺方面的專業知識,支持 Gala Games 開發其元宇宙項目“VOXverse”。(Venture Beat)[2022/6/10 4:15:14]
上述例子中gas為2360,而空字節消耗了230*4=920,無效數據占比為~40%
為了進一步優化,考慮到pool和fee都為定長類型,可以直接拼接而不做padding,在實際使用時才做解碼
函數原型為
functionflashArbs(bytescalldatainput)external;
數據編碼為
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea00271000000000//padding
Uniswap創始人Hayden Adams:Uniswap治理資金庫擁有價值超過90億美元的UNI:官方消息,Uniswap創始人Hayden Adams表示, Uniswap治理資金庫擁有價值超過90億美元的UNI,而GETH是Uniswap的關鍵基礎設施。Hayden Adams詢問,Uniswap治理資金庫是否應該為GETH提供大量資金?據悉,Coin Metrics數據工程師Antoine Le Calvez曾表示,Geth是主流的ETH協議實現,OpenEthereum更常用于分析。[2021/7/10 0:41:39]
消耗gas為66*490*16=1704,無效數據占比降至~15%
這也是UniswapV3的優化方式
優化
實際上,我們繼續優化,使得有效載荷為100%
函數原型為
functionflashArbs()external;
數據編碼為
55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710
比特幣開發者Jeff Garzik:Uniswap V3的資金效率更高:早期比特幣開發人員Jeff Garzik在推特表示:“Uniswap V3的資金效率更高。對TVL有什么影響?代幣需要的流動性遠低于V2。這似乎對用戶和生態系統有好處,但對Uniswap TVL卻不是。”[2021/5/8 21:36:46]
是不是有點奇怪,函數原型中沒有參數,那么參數從哪里獲取呢?
實際上,我的方式是拋棄solidity編碼,直接使用assembly來解析數據,代碼如下
bytesmemoryinput;assembly{letcalldata_len:=calldatasize()letinput_len:=sub(calldata_len,4)input:=mload(0x40)mstore(input,input_len)letinput_data:=add(input,0x20)calldatacopy(input_data,4,input_len)letfree:=add(input_data,input_len)letfree_round:=and(add(free,31),not(31))mstore(0x40,free_round。
Uniswap最新提交代碼顯示:用戶可以通過星際文件系統IPFS的網關訪問Uniswap網站:金色財經報道,Uniswap最新提交代碼顯示,用戶可以通過星際文件系統IPFS的網關訪問Uniswap網站。代碼提交者表示可以通過使用子域IPFS網關或使用別名訪問Uniswap最新版本這兩種方式來避免通過同一IPFS網關訪問的其他站點在未經許可的情況下讀取和修改Uniswap接口設置的問題。[2020/9/25]
這里稍微解釋下:
首先通過calldatasize得到調用數據的長度,減去functionselector的4字節,得到的input_len即為參數長度
然后通過0x40獲得空閑指針,拷貝參數到memory
最后將參數長度按32字節向上取整,修改空閑指針
題外
不要覺得上面的assembly本身消耗了gas,導致優化效果減少
要知道,即使按UniswapV3傳bytes參數的方式,也是需要拷貝數據到memory,過程是一樣的
如果考究一些,我們甚至可以跳過solidity編譯后的某些opcode
比如上面例子中,我并不檢查input_len的長度是否大于0,因為我不需要
而solidity編譯后的操作碼,勢必包括種種邊界檢查
換句話說,這種方式不僅優化了數據gas,還稍微優化了一些opcode
到此為止?
實際上,上面的優化有個小問題,在于memory中消耗了32字節用于保存input的長度,而這個長度,在整個生命周期中是固定的
我選擇將它轉移到棧上,只是使用時稍微麻煩一些,不像bytes方便~
,即
uintinput;uintinput_len;assembly{letcalldata_len:=calldatasize()input_len:=sub(calldata_len,4)input:=mload(0x40)calldatacopy(input,4,input_len)letfree:=add(input,input_len)letfree_round:=and(add(free,31),not(31))mstore(0x40,free_round。
實測
我用大概100多條套利路徑,對UniswapV3編碼方式,以及進一步優化方式,分別跑了自動化測試,平均下來一筆交易可以優化2000gas左右
比預期的優化大了很多,具體原因未查
參考資料
ripwu:https://learnblockchain.cn/people/3911
UniswapV3:https://learnblockchain.cn/article/2302
UniswapV2:https://learnblockchain.cn/article/2611
v3-periphery:https://github.com/Uniswap/v3-periphery/tree/main/contracts/libraries
FormalSpecificationoftheEncoding:https://docs.soliditylang.org/en/v0.8.9/abi-spec.html#mapping-solidity-to-abi-types]
免責聲明:作為區塊鏈信息平臺,本站所發布文章僅代表作者個人觀點,與鏈聞ChainNews立場無關。文章內的信息、意見等均僅供參考,并非作為或被視為實際投資建議。
本文來源于非小號媒體平臺:
登鏈社區
現已在非小號資訊平臺發布105篇作品,
非小號開放平臺歡迎幣圈作者入駐
入駐指南:
/apply_guide/
本文網址:
/news/10417118.html
免責聲明:
1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場
上一篇:
每周編輯精選WeeklyEditors'Picks
Tags:UNIPUTSWAPUniswapBit Union CoinInternet Computer(Dfinity)EDDASwapuniswap幣最新消息
Gate.io將開啟Polkadot插槽拍賣活動。據Polkadot官方消息,118號議案已被Polkadot理事會投票通過,Polkadot第一次平行鏈插槽拍賣將于2021年11月11日正式開.
1900/1/1 0:00:00尊敬的用戶:?????????????BKEXGlobal即將上線DSG,詳情如下:上線交易對:DSG/USDT幣種類型:BEP20?充值功能開放時間:已開放交易功能開放時間:2021年10月1.
1900/1/1 0:00:00平臺幣ZD交易手續費銷毀公示 尊敬的用戶: 2021年9月15日00:00——2021年10月16日00:00期間ZD幣幣交易手續費累積應銷毀數量為56311.
1900/1/1 0:00:00據中國人民銀行10月20日消息,中國人民銀行辦公廳、中央網絡安全和信息化委員會辦公室秘書局、工業和信息化部辦公廳、中國銀行保險監督管理委員會辦公廳、中國證券監督管理委員會辦公廳發布《關于規范金融.
1900/1/1 0:00:00撰文:WilliamM.Peaster,本文編譯自Banklss在今年下半年,我們看到三個主題主導了加密貨幣的炒作周期:NFT、ETH殺手和Layer2.
1900/1/1 0:00:00據PRNewswire消息,10月19日,區塊鏈初創公司Decentology宣布已獲得430萬美元種子資金,計劃建立開放、去中心化的可組合智能合約市場Hyperverse.
1900/1/1 0:00:00