以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads
首頁 > Polygon > 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

Uniswap或將于近期為NFT聚合平臺Genie歷史用戶發放空投:金色財經報道,Uniswap NFT產品負責人Scott在社交媒體上發文表示,Uniswap針對NFT聚合平臺Genie歷史用戶的空投仍在計劃中;很快將會到來。

此前報道,今年6月,Uniswap Labs宣布收購NFT聚合平臺Genie,并將對4月15日之前多次使用過Genie的歷史用戶或持有Genie Genesis NFT的用戶進行USDC空投。[2022/11/24 8:02:18]

消耗gas為230*490*16=2360

節省gas為280

UniswapV3優化

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

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

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

函數原型為

functionflashArbs(bytescalldatainput)external;

WAGMI United NFT近24小時交易額跌幅超70%:金色財經消息,據OpenSea數據顯示,WAGMI United NFT近24小時交易額為60.62ETH,24小時交易額跌幅為77.85%。目前地板價為0.34ETH。近24小時交易額排名OpenSea第47名。

此前報道,阿迪達斯與英格蘭克勞利鎮足球俱樂部合作的NFT項目“WAGMI United”已募集超300萬英鎊。[2022/7/10 2:03:25]

數據編碼為

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea00271000000000//padding

Vitalik Buterin:UNI 應成為預言機代幣:以太坊創始人 Vitalik Buterin 在 Uniswap 治理論壇發起提案討論,建議 Uniswap 能夠為 ETH/USD 提供預言價格數據,以及提議 UNI 成為預言機代幣,而不是像其它預言機一樣使用 ETH/USDC 喂價。

Vitalik Buterin 解釋稱,算法穩定幣需要針對鏈下法定貨幣提供資產喂價,而非鏈上美元穩定幣。預言機需要有一個代幣來預防女巫攻擊(Sybil Attack),這種攻擊的成本是代幣總市值的一半減去不參與投票的代幣價值,而以太坊上市值最高的兩個項目代幣是 LINK 和 UNI,但 Chainlink 是一個具有許多功能的復雜系統,需要有一個簡單的替代方案來對 Chainlink 進行補充,以優化激勵措施和最大程度地降低成本。[2021/5/12 21:53:03]

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

這也是UniswapV3的優化方式

優化

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

函數原型為

Huobi DeFi Labs投資總監Unica:中心化業務在多鏈生態中,也占有一席之地:5月11日,在以《跨界腦暴:眺望Solana生態大宇宙》為主題的AMA中,Huobi DeFi Labs投資總監Unica表示,中心化業務在可以預見的多鏈生態中,因為跨鏈可交互性和效率的優勢,也占有一席之地。所以我們充分開放與各方的合作,為多鏈拓撲結構的生成助力。Solana具有獨特的技術優勢和旺盛的生態生命力,所以我們以此為始來進行探索。[2021/5/11 21:49:19]

functionflashArbs()external;

數據編碼為

55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710

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

動態 | UNICEF利用區塊鏈為吉爾吉斯斯坦學校接入互聯網:據coindesk報道,聯合國兒童基金會(UNICEF)正在與吉爾吉斯斯坦政府進行談判,以利用區塊鏈技術為該國的每所學校提供互聯網接入。據悉,被稱為Project Connect的項目預計為全球超過15萬所學校接入互聯網。其中有1560所學校位于吉爾吉斯斯坦,其中近一半被確定為沒有互聯網連接或沒有相關數據。[2019/3/7]

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

然后通過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:PUTUNIUniswapSWAPInternet Computer(Dfinity)Unirealchainuniswap幣總量SWAP幣

Polygon
GATE:Gate.io ITGR/USDT、ITGR/ETH流動性礦池今日各新增額外限時獎勵24,130 ITGR

為鼓勵更多用戶積極參與Gate.io流動性挖礦,今日中午11:00,ITGR/USDT、ITGR/ETH流動性礦池獎勵各新增額外24.

1900/1/1 0:00:00
APP:火星云礦將在12月31日前清退關中國大陸挖礦資產和服務

10月18日,火星云礦發布《關于有序清退中國大陸挖礦資產和服務的公告》,宣布12月31日前完成中國境內礦機托管和租賃服務的清退工作.

1900/1/1 0:00:00
SPA:ZT創新板即將上線HCT

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

1900/1/1 0:00:00
加密貨幣:巴西國會正在討論有關“加強對加密資產的反洗錢監管”法案

據STEP10月20日消息,巴西國會目前正在討論針對第2303/15號法案的修正案。該法案最近由巴西眾議院的一個特別委員會批準,旨在加強對數字貨幣的反洗錢監管.

1900/1/1 0:00:00
HEM:ALCX(Alchemix)

項目簡介:AlchemixFinance是一個以未來收益為支撐的合成資產平臺和社區DAO。該平臺通過合成代幣讓您獲得挖礦收益,該代幣可兌換Alchemix協議中任何基礎抵押品.

1900/1/1 0:00:00
HTT:XT關于上線WSPP的公告

尊敬的XT用戶: XT即將上線WSPP(WolfSafePoorPeople),并在創新區開放WSPP/USDT交易對.

1900/1/1 0:00:00
ads