比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > ICP > Info

Uniswap V3 路徑編碼的進一步優化_PUT

Author:

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

本文作者: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幣最新消息

ICP
Gate.io 關于支持參與Polkadot插槽拍賣活動公告_GATE

Gate.io將開啟Polkadot插槽拍賣活動。據Polkadot官方消息,118號議案已被Polkadot理事會投票通過,Polkadot第一次平行鏈插槽拍賣將于2021年11月11日正式開.

1900/1/1 0:00:00
BKEX Global 關于上線 DSG(Dinosaur Eggs)并開放充值功能的公告_BAL

尊敬的用戶:?????????????BKEXGlobal即將上線DSG,詳情如下:上線交易對:DSG/USDT幣種類型:BEP20?充值功能開放時間:已開放交易功能開放時間:2021年10月1.

1900/1/1 0:00:00
平臺幣ZD交易手續費銷毀公示_ETHE

平臺幣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
一文概述在 Layer2 上收集 NFT 的主要途徑_以太坊

撰文:WilliamM.Peaster,本文編譯自Banklss在今年下半年,我們看到三個主題主導了加密貨幣的炒作周期:NFT、ETH殺手和Layer2.

1900/1/1 0:00:00
區塊鏈初創公司Decentology獲得430萬美元種子資金,Dapper Labs等參投_區塊鏈

據PRNewswire消息,10月19日,區塊鏈初創公司Decentology宣布已獲得430萬美元種子資金,計劃建立開放、去中心化的可組合智能合約市場Hyperverse.

1900/1/1 0:00:00
ads