比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads
首頁 > 幣贏 > Info

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

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

印度億萬富翁企業家Sunil Mittal:世界將轉向加密貨幣:4月21日消息,印度億萬富翁企業家Sunil Mittal:世界將轉向加密貨幣。(金十)[2022/4/21 14:38:49]

消耗gas為230*490*16=2360

節省gas為280

UniswapV3優化

從上面兩個例子可以看到,solidity編碼的最大問題在于padding,即32字節對齊,導致引入了非常多無效的空字節

上述例子中gas為2360,而空字節消耗了230*4=920,無效數據占比為~40%

為了進一步優化,考慮到pool和fee都為定長類型,可以直接拼接而不做padding,在實際使用時才做解碼

函數原型為

functionflashArbs(bytescalldatainput)external;

數據編碼為

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea00271000000000//padding

Uniswap為烏克蘭捐贈構建便捷界面,任意ERC-20代幣均可自由捐贈:3月1日消息,Uniswap 官方發推稱,已構建了一個界面,可以將任意 ERC-20 代幣換成 ETH,然后在一次交易中直接將其發送給烏克蘭政府。因為此前“烏克蘭政府共享的地址是一個只接受 USDT 和 ETH 的中心化交易所,因此我們構建了這個界面,任何想要捐贈但持有其他 ERC-20 代幣的人都可以一鍵完成支持”。[2022/3/1 13:30:27]

消耗gas為66*490*16=1704,無效數據占比降至~15%

這也是UniswapV3的優化方式

優化

實際上,我們繼續優化,使得有效載荷為100%

函數原型為

functionflashArbs()external;

數據編碼為

55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710

Uniswap ETH/ Stablecoin交易對24小時交易量占交易平臺首位:1月22日消息,近日,Uniswap創始人Hayden Adams在社交媒體上發文表示,Uniswap ETH/Stablecoin現貨交易對(包括ETH/USDC + ETH/USDT + ETH/DAI) 24 小時交易量達12.5億美元,已超越Binance (10 億美元)、Coinbase (5 億美元)以及FTX (4.3 億美元),位列所有DEX+CEX排行首位。[2022/1/22 9:05:42]

是不是有點奇怪,函數原型中沒有參數,那么參數從哪里獲取呢?

實際上,我的方式是拋棄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 創始人在推特發起是否向以太坊客戶端 Geth 捐款的投票:此前以太坊核心開發者、以太坊客戶端Geth開發者PéterSzilágyi在推特抱怨稱,復制其代碼的人依靠積極地營銷獲得了高估值,但他的團隊卻無法負擔招募新人的開銷。Uniswap創始人HaydenAdams回復稱Uniswap可以并愿意永久贊助以太坊客戶端Geth開發,并表示如果通過治理投票完成該提案,Uniswap可以贊助更多。隨后HaydenAdams給出了Uniswap治理提案的鏈接,并表示Uniswap財政部有90億美元的UNI儲備,Geth是Uniswap的關鍵基礎設施,希望PéterSzilágyi在社區提出向Geth客戶端開發者發起贊助的提案。[2021/7/10 0:41:34]

這里稍微解釋下:

首先通過calldatasize得到調用數據的長度,減去functionselector的4字節,得到的input_len即為參數長度

然后通過0x40獲得空閑指針,拷貝參數到memory

最后將參數長度按32字節向上取整,修改空閑指針

題外

不要覺得上面的assembly本身消耗了gas,導致優化效果減少

DEX月交易量超過100億美元,Uniswap創最高日交易量:金色財經報道,據Dune Analytics數據,去中心化交易所(DEX)的月交易量已飆升至超過100億美元,八月份的交易量比七月份增加了一倍以上。此外,Uniswap在上周末創下有史以來最高的每日交易量,交易額超過4.5億美元,首次超過了Coinbase Pro的每日交易量。[2020/9/1]

要知道,即使按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:PUTUNISWAPUniswapPUT幣Uni ApeAlphaSwapuniswap幣為什么漲不起來

幣贏
GATE:Gate.io NFT魔盒上線變異猿NFT(Mutant Ape Yacht Club),充值瓜分5000美金獎勵

Gate.ioNFT魔盒已于10月18日上線變異猿系列NFT作品,該系列作品已支持充值交易,同時,變異猿系列也通過了官方認證.

1900/1/1 0:00:00
LIB:習近平:隨著區塊鏈等技術加速創新,應不斷做強做優做大我國數字經濟

據新華社消息,中共中央局10月18日下午就推動我國數字經濟健康發展進行第三十四次集體學習。中共中央總書記習近平在主持學習時強調,近年來,互聯網、大數據、云計算、人工智能、區塊鏈等技術加速創新.

1900/1/1 0:00:00
GATE:Gate.io芝麻開門全球招聘:馳騁新世界

比特幣的誕生,加速了區塊鏈世界的進程,Gate.io芝麻開門相信,通過科學、智能、領先的區塊鏈應用,可以促進世界經濟、社會發展和人們生活的進步.

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

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

1900/1/1 0:00:00
STE:Steam禁止NFT和區塊鏈游戲,或利好競爭對手Epic Games

本文來自Cryptodaily,原文作者:AmaraKhatriOdaily星球日報譯者|余順遂游戲巨頭EpicGames向TheVerge表示.

1900/1/1 0:00:00
區塊鏈:去中心化圖片網絡 Numbers Protocol 完成 600 萬美元私募輪和種子輪融資,Protocol Labs、幣安等參投

鏈聞消息,Web3.0去中心化圖片網絡NumbersProtocol完成600萬美元私募輪和種子輪融資,其中私募投資方為ProtocolLabs和DAOMaker.

1900/1/1 0:00:00
ads