比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > 非小號 > Info

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

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

Defi Llama發布針對Optimism進行優化的Uniswap V3路由器Llama Zip:2月28日消息,DefiLlama發布專門針對Optimism進行優化的UniswapV3路由器Llama Zip,相與所有其他聚合器實現了巨大的Gas減少。用戶可在DefiLlama旗下DEX聚合器Llama Swap上切換Optimism網絡獲得體驗。[2023/2/28 12:33:07]

消耗gas為230*490*16=2360

節省gas為280

UniswapV3優化

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

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

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

函數原型為

functionflashArbs(bytescalldatainput)external;

瑞士Unify Platform AG利用智能合約技術推出研發內容Pre-IP認證:12月11日消息,瑞士Unify Platform AG宣布在該公司的在線平臺服務UNIPLAT上推出一項新功能。這項新功能名為Pre-IP,是“Pre (applied) Intelligent Property”(預申請知識產權)的縮寫,是UNIPLAT的一個特有術語。研究及創業人員將他們在平臺上發布的內容(圖片、視頻、文本等)注冊了Pre-IP之后,UNIPLAT將為其發放第三方證書,使用區塊鏈的智能合約技術證明該內容是在相關研究人員或創業人員名下真實注冊的。該Pre-IP認證將從2022年1月14日開始在平臺上啟用。(美通社)[2021/12/11 7:32:03]

數據編碼為

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea00271000000000//padding

Uniswap交易量超越第二大CEX Coinbase Pro:Uniswap本周累計鎖定的總價值(TVL)高達20億美元。周二的數據顯示,在DeFi項目中,Uniswap在110億美元的市場中占據了18%以上的份額。周二交易量數據,第二大CEX CoinbasePro在過去的24小時內交易額為3.43億美元,Uniswap如今以3.98億美元的價格遠高于Coinbase Pro,從而使DEX在9月29日的交易量上成為第二大加密貨幣交易所。[2020/9/30]

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

這也是UniswapV3的優化方式

優化

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

函數原型為

functionflashArbs()external;

數據編碼為

55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710

18.08萬用戶已領取1.1億枚UNI空投代幣:根據Dune Analytics的最新數據顯示,截至今日,已經有大約1.1億枚UNI空投代幣(大約74%可申領的UNI代幣)被18.08萬個用戶認領。[2020/9/21]

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

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

這里稍微解釋下:

IOST鏈上“Uniswap”流水破千萬:據官方消息,近日,IOST鏈上全DeFi生態平臺PowerDeFi正式上線主網。據DappRadar數據,PowerDeFi 7日成交量已突破千萬,達14,718,559.324212 IOST。PowerDeFi平臺由IOST節點合伙人Powermine開發,該平臺不止有極受歡迎的Uniswap交易所端口,還包含了完整的Perpetual生態,如借貸、Staking等。更多創新的新型DeFi玩法即將上線,這將大大增加PER的應用性、交易量及其整體價值。作為領先的區塊鏈技術應用平臺,IOST主網從開發環境的基本面上來講,對開發者極其友好,0手續費也保證了用戶使用IOST鏈上DeFi應用的便捷性。[2020/8/4]

首先通過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:PUTUNISWAPUniswapBitconch Reputation Heatunic幣上線的交易所YuzuSwapuniswap幣

非小號
一文盤點國內外主要的 NFT 發行平臺_PEN

作者|?黎穎恒黃澤圓鄭喬丹李嘉達?編審?|于百程?排版?|?王紀瓏琰今年被稱為NFT的“元年”,藝術家、名人、巨頭公司紛紛入局NFT,屢創新高的NFT價格更是讓其成為大眾關注焦點.

1900/1/1 0:00:00
meme有可能使得NFT和DeFi結合在一起_DOG

無論你對NFT的觀點是積極的還是消極的,你都不會忽視NFT。從流行游戲CryptoKitties開始像野火一樣蔓延的趨勢,全球金融市場都有些反應不過來.

1900/1/1 0:00:00
Matter Labs宣布推出zksync 2.0測試應用 UniSync,zkEVM 實現對 Solidity 的完全兼容_SOL

10月13日消息,以太坊Layer2網絡開發商MatterLabs宣布推出了首個遷移的zksync2.0測試應用UniSync,這標志著zkEVM已實現對Solidity的完全兼容.

1900/1/1 0:00:00
Ribbon 社區投票決定暫不處理空投事件中退回的 719 枚 ETH 和 261 萬枚 RBN_BBO

鏈聞消息,鏈上結構化產品RibbonFinance關于如何處理空投事件退回的719枚ETH和261萬枚的社區投票已結束,48.74%的社區用戶選擇「暫不處理/推遲」,是得票最多的選項.

1900/1/1 0:00:00
a16z 全球政策主管及法律顧問發布 Web3 政策議程,旨在集合各界力量建設「更好的互聯網」_WEB3

鏈聞消息,a16z全球政策主管TomicahTillemann以及法律顧問JamesRathmell聯合發布了Web3政策議程「HowtoWintheFuture」.

1900/1/1 0:00:00
吳說深度:比特幣牛市繼續的可能性有多少 潛在干擾是什么_SOL

吳說作者|劉全凱本期編輯|ColinWu在6月20日,著名比特幣多頭PlanB基于改良后新的S2F模型預測了2021年可能出現的最壞情況:8月>47k,9月>43k,10月>63k.

1900/1/1 0:00:00
ads