買以太坊 買以太坊
Ctrl+D 買以太坊
ads
首頁 > UNI > Info

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

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

Uniswap發布Uniswap v4代碼草稿,并邀請社區提供反饋:金色財經報道,Uniswap宣布發布Uniswap v4代碼草稿,以便可以公開構建v4。Uniswap v4的愿景是允許任何人通過引入掛鉤(hooks)來做出這些權衡決定。hooks是在池操作生命周期的各個點運行的合約,池可以做出與v3相同的權衡,或者可以添加全新的功能。例如,v4將允許池本身支持動態費用,添加鏈上限價單,或充當時間加權平均做市商(TWAMM)以隨時間分散大訂單。此外,v4池將存在于單一合約中,這將使創建礦池的成本降低99%。

Uniswapv4代碼將根據Business Source License1.1發布,這將在4年內限制v4源代碼在商業或生產環境中的使用,屆時它將永久轉換為GPL許可證。協議費用機制也將仿照v3。治理層將能夠投票決定向任何資金池添加協議費用,但不超過上限金額。[2023/6/13 21:34:27]

消耗gas為230*490*16=2360

節省gas為280

UniswapV3優化

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

過去24小時Symbolic Capital合伙人利用Uniswap完成近10億美元交易量:金色財經報道,Arkham監測顯示,鏈上套利者的活動往往揭示了他們利用無效市場,Symbolic Capital合伙人通過鏈上套利策略運行了大量的資金。僅在過去 24 小時內,他們就利用 Uniswap 完成了近 10 億美元的交易量。

截止目前,Binance交易所24小時BTC交易量9.26億美元。[2023/5/16 15:05:56]

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

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

函數原型為

functionflashArbs(bytescalldatainput)external;

數據編碼為

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea00271000000000//padding

Boba基金會承諾為該網絡的Uniswap V3提供100萬美元的BOBA代幣激勵:金色財經報道,Boba基金會已承諾提供價值100萬美元的BOBA代幣,以促進Uniswap V3在Boba網絡上的采用。此前,將Uniswap V3將部署至Boba Network的鏈上投票以近95%的贊成率通過,目前該提案已完成執行。[2023/2/7 11:52:14]

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

這也是UniswapV3的優化方式

優化

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

函數原型為

functionflashArbs()external;

數據編碼為

55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710

Robinhood上線Uniswap代幣UNI:金色財經消息,在線經紀平臺Robinhood周四宣布支持Uniswap(UNI)代幣交易,使該平臺支持的加密貨幣達到13種。[2022/7/15 2:14:32]

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

實際上,我的方式是拋棄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。

這里稍微解釋下:

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

幣贏CoinW平臺DeFi幣種 UNIFI領漲:據幣贏行情數據顯示,截止今日10:00(GMT+8),平臺內DeFi幣種今日UNIFI領漲,今日漲幅為48.66%,現價4.85USDT;DGVC今日漲幅22.29%,現價2.6607USDT;STOMK今日漲幅18.95%,現價0.0111USDT;TRADE今日漲幅為18.72%,現價1.3527USDT。行情波動較大,請注意風險控制。[2020/9/2]

然后通過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:PUTUNIUniswapSWAPBitconch Reputation HeatUNICORN幣uniswapwallet教程DSWAP價格

UNI
CRYP:Crypto.com 的 EVM 兼容鏈 Cronos 主網發布日期推遲至 11 月 8 日_CRY

鏈聞消息,Crypto.com的首席執行官Kris在推特表示,Crypto.com的EVM兼容鏈Cronos在Cassini激勵測試網期間.

1900/1/1 0:00:00
SEA:萬字長文解析 OpenSea 崛起之路:起源、發展和前景_OPEN

本文編譯自TheGeneralist,以下為編譯部分。現在去哪里投資1萬美元?如今,投資者面臨著一個兩難境地。通貨膨脹正在上升.

1900/1/1 0:00:00
HTT:AOFEX於10月18日上線ROOK(KeeperDAO)_https://etherscan.io

尊敬的用戶:AOFEX將於2021年10月18日上線ROOK,具體時間安排如下:充提業務已開啟交易時間:10月18日18:30提示:以下內容來源于公告發布時的網絡現有資料,AOFEX已盡力核對.

1900/1/1 0:00:00
DEFI:NEAR Staking特別活動:享54.49%高年化收益,瓜分4,600 NEAR大獎!_Interfinex

親愛的用戶:幣安Staking平臺將於2021年10月15日20:00推出多重NEAR高收益鎖倉活動,多重收益,任您選擇!活動一:10、30、60、90天週期任您選.

1900/1/1 0:00:00
GATE:Gate.io 關于推遲合約升級公告_Gate.io

受行情影響,為減少對用戶和量化機構的影響,Gate.io將推遲原定于2021年10月20日23:00~23:59的BTC,USDT結算的永續合約引擎升級,新的升級時間將重新設定并提前公告.

1900/1/1 0:00:00
GLO:ZT創新板即將上線BRKL_數字資產

親愛的ZT用戶: ZT創新板即將上線BRKL,並開啟BRKL/USDT交易對。具體上線時間如下:充值:已開啟;交易:2021年10月18日17:00; BRKL 項目簡介:Brokoli是第一個.

1900/1/1 0:00:00
ads