買比特幣 買比特幣
Ctrl+D 買比特幣
ads
首頁 > SAND > Info

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

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

UNI突破20美元關口 日內漲幅為5.9%:火幣全球站數據顯示,UNI短線上漲,突破20美元關口,現報20.0001美元,日內漲幅達到5.9%,行情波動較大,請做好風險控制。[2021/7/4 0:26:24]

消耗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

Gate已開啟投票上幣第155期Unizen:據官方公告,Gate已于6月23日(今日)12:00開啟投票上幣項目第155期—Unizen (ZCX) ,投票截止時間至2021年6月24日10:00。在本輪投票中,ZCX如獲得1000萬票,Gate會上線ZCX/USDT交易,參與投票的用戶均可分享總計4,000 ZCX(5,000美金)空投獎勵。[2021/6/23 0:00:46]

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

這也是UniswapV3的優化方式

優化

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

函數原型為

functionflashArbs()external;

數據編碼為

55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710

UNI突破34美元:火幣全球站數據顯示,UNI短線上漲,突破34美元關口,現報34.0001美元,日內漲幅達到13.53%,行情波動較大,請做好風險控制。[2021/4/13 20:12:16]

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

實際上,我的方式是拋棄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即為參數長度

鏈上云平臺ETF交易專區,UNI3L/USDT,SUSHI3L/USDT今日漲幅超過40%:據BitWind.com數據顯示,鏈上云平臺ETF交易專區中,UNI3L/USDT漲幅超過70%,SUSHI3L/USDT幣對今日漲幅超過40%,兩個幣對均為去中心化交易所發行的的代幣。此外COMP3L、SOL3L、YFI3L、TRX5L漲幅均超過20%

鏈上云平臺,專注提供優質項目和熱門資產。

行情數據僅供參考,投資有風險,入市需謹慎。[2020/9/18]

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

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

題外

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

要知道,即使按UniswapV3傳bytes參數的方式,也是需要拷貝數據到memory,過程是一樣的

如果考究一些,我們甚至可以跳過solidity編譯后的某些opcode

比如上面例子中,我并不檢查input_len的長度是否大于0,因為我不需要

而solidity編譯后的操作碼,勢必包括種種邊界檢查

OM 將于8月18日上線Uniswap,Bithumb?Global以及虎符交易所:據MANTRA DAO官方披露,跨鏈DeFi項目MANTRA DAO即將進入中國市場。據悉MANTRA DAO已經獲得包括 Waterdrip, LD Capital, Plutus VC, 以及 Kenetic Capital等眾多資本青睞,同時也與共識實驗室、NOVA等業內優質資方達成了戰略合作。同時,MANTRA DAO的代幣OM 將于8月18日全球首發Uniswap,Bithumb?Global以及HOO(虎符)交易所。

Bithumb Global 將于2020年8月18日09:00(UTC+8)開啟充值,2020年8月18日10:15(UTC+8)開啟提幣并開啟 OM / USDT 交易對。

虎符將于2020年8月17日17:00(UTC+8)開啟充值,2020年8月18日17:00(UTC+8)開啟交易,2020年8月19日15:00(UTC+8)開啟提幣并開啟OM / USDT 以及 OM / BTC 交易對。

MANTRA DAO是一種基于去中心化社區自治(DAO)并專注于跨鏈資產的配資,質押和借貸的新金融理念,來打造的易用和安全的DeFi產品,MANTRA DAO打通傳統金融和去中心化的區塊鏈體系,由OM代幣聯系在一起,將金融控制權回歸于用戶,為用戶提供經濟激勵、治理投票和其他權益。[2020/8/17]

換句話說,這種方式不僅優化了數據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:PUTUNIDATATABitconch Reputation Heatunisat的logoSmpl foundationDATADOGE

SAND
BOOK:Facebook副總裁:創作者、電商和元宇宙是公司未來愿景的核心_acent幣最新消息

據Campaign10月17日消息,Facebook全球商務副總裁NicolaMenndelsoh在IABUKDigitalUpfronts會議上表示.

1900/1/1 0:00:00
DEFI:AAX DeFi聚合挖礦正式上線,享超高收益_DEFI幣

AAXDeFi聚合挖礦正式上線,享超高收益作者AAXManager一周前已更新 親愛的AAX用戶: AAXDeFi聚合挖礦已于2021年9月23日正式上線.

1900/1/1 0:00:00
Gate.io:Gate.io 已發 “流動性挖礦”競技周,玩法、驚喜不重樣活動獎勵公告_GATE

Gate.io“流動性挖礦”競技周,玩法、驚喜不重樣活動已圓滿結束,根據活動規則,我們已為符合規則的用戶發放了活動獎勵。用戶可進入“錢包—賬單明細”查詢獎勵發放情況。活動詳情及規則請點擊查看.

1900/1/1 0:00:00
HTT:ZT創新板即將上線 TTK_TPS

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

1900/1/1 0:00:00
FUR:比特幣礦企Bitfury首席執行官確認公司正在考慮進行IPO_bitcoin2

10月19日消息,Bitfury首席執行官ValeryVavilov證實,“隨著Bitfury及其公司組合繼續在數字資產領域的全球擴張,Bitfury將考慮IPO.

1900/1/1 0:00:00
GATE:Gate.io博客:【熱點分析】詳解比特幣重回6萬的幕后推手——期貨ETF_gate.io怎么充值人民幣

據《紐約時報》報道,首只比特幣期貨ETF于10月19日在紐約證券交易所上市,這一事件堪稱“整個加密貨幣領域的里程碑”.

1900/1/1 0:00:00
ads