以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads

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

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

Universal Ledger完成1000萬美元融資:金色財經報道,錢包即服務(wallet-as-a-service)提供商Universal Ledger宣布完成1000萬美元融資,Hard Yaka領投。Universal Ledger旨在幫助用戶自己構建加密錢包,其客戶主要是大型金融機構和行政機構,該公司已構建了一個分級驗證系統,可提供電話號碼、電子郵件等低級別驗證,以及其他身份識別信息的高級別驗證,確保交易安全。[2023/4/19 14:13:55]

消耗gas為230*490*16=2360

節省gas為280

UniswapV3優化

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

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

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

函數原型為

functionflashArbs(bytescalldatainput)external;

游戲引擎Unity新增支持MetaMask、Aptos等區塊鏈SDK開發工具:金色財經報道,Unity游戲引擎開發商Unity Technologies推出了一套新的去中心化技術工具,供希望為游戲添加去中心化功能的游戲開發者使用。Unity表示,游戲環境中的“去中心化”是指“游戲中的所有權模式,允許玩家創建、賺取或獲得游戲內資源,然后他們可以出售或交易這些資源。”從本質上講,開發人員現在可以將游戲內資產轉化為NFT,并將他們的游戲與各種區塊鏈和Web3生態系統集成。

Unity資產頁面上的去中心化類別包括13個經過驗證的解決方案,適用于允許不同功能的游戲開發人員。開發人員可以使用其中一些SDK輕松地將NFT、代幣和鏈上程序集成到他們基于Unity的游戲中。基于Unity的游戲開發人員可以選擇通過SDK在以太坊、Solana、Algorand、Tezos、Aptos和Flow區塊鏈上進行構建。此外,開發人員可以將MetaMask集成到他們的游戲中,這似乎是目前唯一可用的基于錢包的SDK。[2023/3/1 12:35:17]

數據編碼為

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea00271000000000//padding

Uniswap V3 24小時以太坊銷毀量達557ETH:據歐科云鏈鏈上大師數據顯示,當前以太坊銷毀量為124.01萬ETH,24小時Base Fee均值66 Gwei;昨日以太坊銷毀量6424.88ETH,環比上升22.17%。近24小時銷毀量前三的協議分別是Uniswap V3 557 ETH、OpenSea 528 ETH以及Uniswap V2 317 ETH。[2021/12/22 7:55:31]

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

這也是UniswapV3的優化方式

優化

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

函數原型為

functionflashArbs()external;

數據編碼為

55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710

跨鏈NFT平臺Unifty將遷移至去中心化治理:金色財經報道,跨鏈NFT平臺Unifty宣布對其治理模型進行重大更新,將遷移至類似DAO的去中心化治理,并宣布將發布UNT代幣。Unifty將實施四種類型的治理提案,即補助金、Vault、內部治理和一般決議。隨著NIF成為治理資產,其以支付為中心的功能將被新資產UNT繼承。Unifty的治理將通過在治理合約中質押100,000 NIF來激活。[2021/8/3 1:32:07]

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

實際上,我的方式是拋棄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的網站 已有用戶被騙16枚ETH:9月16日,據社群反饋,用戶發現假冒的Uniswap官網,該網站頁面與Uniswap網站完全一致,但域名不同。據反饋已有用戶被騙16枚ETH。(區塊律動BlockBeats)[2020/9/16]

這里稍微解釋下:

首先通過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:PUTUNISWAPUniswapPUT價格Aqua UnicornCAKESWAPuniswap幣排行

酷幣交易所
幣安新增AVAX/AUD、AVAX/BRL、AXS/ETH、FTM/ETH、LUNA/AUD、SOL/ETH、TROY/BUSD交易對_ZER

親愛的用戶:幣安將於2021年10月15日18:00上線AVAX/AUD、AVAX/BRL、AXS/ETH、FTM/ETH、LUNA/AUD、SOL/ETH、TROY/BUSD交易對.

1900/1/1 0:00:00
ELON(Dogelon Mars)_ELON

項目簡介:伊隆·火星是數字加密貨幣領域中發展規模最為龐大的memecoin之一,由我們創作的NFT(非同質化代幣,例如數碼藝術品)網絡系列漫畫中會不斷更新伊隆·火星在火星的探險故事.

1900/1/1 0:00:00
XT關于恢復FIL充提的公告_BTC

尊敬的XT用戶: FIL錢包升級已完成,XT現已恢復FIL充值與提幣業務,暫停期間給您帶來的不便,敬請諒解.

1900/1/1 0:00:00
關於BCH, BTC , LTC, DASH, DOGE變更充值地址的公告_以太坊

親愛的ZT用戶: ZT已恢復BCH,BTC,LTC,DASH,DOGE的充值、提現服務。充值開放後都需要重新獲取新的充值地址,請不要充幣到您之前的ZT充值地址上,以免造成充幣不到賬的情況.

1900/1/1 0:00:00
Lazio Fan Token(LAZIO)項目上線幣安Launchpad,基於投入模式!_BNB

親愛的用戶:幣安即將上線第22個Launchpad項目-LazioFanToken,並開啟BNB專場,此次售賣將基於投入模式,幣安將根據用戶7日的BNB日平均持倉確定用戶可投入額度.

1900/1/1 0:00:00
韓國首批4只元宇宙主題ETF上市_區塊鏈

10月14日消息,韓國首批4只元宇宙主題ETF已于本周三在該國股票市場上市。分別為三星資產管理的KODEXK-MetaverseActive、KBAssetManagement的KBSTARiS.

1900/1/1 0:00:00
ads