月亮链 月亮链
Ctrl+D收藏月亮链
首页 > 火必 > 正文

UNI:Uniswap V3 路径编码的进一步优化_SWAP

作者:

时间: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

Sunil:Maps/Grebnev对FTX实体提出了3笔4.21亿美元的索赔:金色财经报道,自称FTX债权人Sunil在社交媒体上称,Maps/Grebnev对FTX实体提出了3笔4.21亿美元的索赔,SBF在 Maps 中领投了5000 万美元,使用 FTX 债权人资金向 Oxygen (2021) 领投了4000 万美元,并大规模推广“Samcoins”,OXY/MAPS 从11月份起大约下跌了50%

Sunil认为会影响FTX重启,我认为FTX交易所是一种资产,就像遗产中的任何其他资产一样出售、重新启动等。但是,它确实会影响我们的分配和时间安排,因为遗产将保留我们的资产来覆盖未解决的案件。[2023/8/4 16:17:53]

消耗gas为230*490*16=2360

节省gas为280

UniswapV3优化

从上面两个例子可以看到,solidity编码的最大问题在于padding,即32字节对齐,导致引入了非常多无效的空字节

上述例子中gas为2360,而空字节消耗了230*4=920,无效数据占比为~40%

为了进一步优化,考虑到pool和fee都为定长类型,可以直接拼接而不做padding,在实际使用时才做解码

Uniswap关于“BSL过期后跨链部署和新uniswap.eth子域名创建”的温度检查投票已通过:4月14日消息,Uniswap社区关于“商业源代码许可证(BSL)过期后跨链部署和新uniswap.eth子域名创建”提案的温度检查投票已结束,并以100%的支持率获得通过。

根据该提案,Uniswap基金会新任治理主管Erin Koen表示,BSL到期后,为每条链确定一个官方Uniswap V3部署将是有益的,以便为用户提供安全保障并明确Uniswap治理。此外,为了与在BSL到期后推荐的治理流程保持一致。Uniswap基金会建议创建一个新的ENS子域v3-deployments.uniswap.eth,以跟踪Uniswap v3在L1和L2上的官方部署。

此前消息,Uniswap V3核心代码版权商业保护(BSL)已于4月1日到期。[2023/4/14 14:03:18]

函数原型为

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

数据:Uniswap流动性超10亿美元:8月31日消息。数据显示,Uniswap流动性超过10亿美元,在最近24小时当中流动性上涨近50%。而在8月初该数值不到2亿美元。在流动性方面,以太坊数量居首,约4.88亿美元。[2020/8/31]

是不是有点奇怪,函数原型中没有参数,那么参数从哪里获取呢?

实际上,我的方式是抛弃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。

这里稍微解释下:

新氧万物将于9月8日上线雷盾(LOEX)、Uniswap、热币三大交易所:据官方消息,新氧万物(New oxygen)将于9月8日启动,上线雷盾(LOEX)、Uniswap、热币(Hotcoin)三大交易所。

新氧万物(New oxygen)通过对游戏底层公链的开发,利用区块链技术,打造一个能够击破目前游戏行业痛点的区块链游戏生态平台。有机融合DeFi+雷达技术挖矿+2.0拼团新玩法,其独创的5人拼团新玩法,采用双重奖励机制,即无论几位用户拼团成功,所有参与拼团的用户都将获得NOE奖励。[2020/8/19]

首先通过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

标签:UNIPUTUniswapSWAPuni币最新消息及前景Internet Computer(Dfinity)Uniswap Walletuniswap币最新消息

火必热门资讯
KEX:BKEX Global 关于Staking锁仓挖矿开启CMCX矿池的公告_GLO

尊敬的用户:???????Staking锁仓挖矿将于2021年10月18日20:00开启CMCX矿池.

1900/1/1 0:00:00
coinbase:關於進行Tron网络(TRC20)錢包維護的公告_COIN

親愛的用戶:幣安將於2021年10月19日15:00對Tron網絡錢包進行維護,預計需要2小時.

1900/1/1 0:00:00
COM:XT关于暂停EKARTINU充提的公告_tps币行情

尊敬的XT用户:因EKARTINU钱包维护,XT.COM现已暂停EKARTINU充提业务。给您带来的不便,请您谅解!感谢您对XT.COM的支持与信任.

1900/1/1 0:00:00
SMT:【活動】SMT交易大賽 贏$3,000美金大獎_hotcoinglobal不能用了

尊敬的BitGlobal用戶:為慶祝SMT正式上線BitGlobal,我們將舉行“SMT交易大賽贏$3,000美金大獎”福利活動.

1900/1/1 0:00:00
MEX:MEXC關於KEEP3S、 AXS3S、 LTC5S、 ETH5S、 BTC2S 等 8種 ETF產品進行份額合並的公告_EXC

尊敬的用戶:由於杠桿ETF產品KEEP3S、AXS3S、LTC5S、ETH5S、BTC2S、BTC5S、NEAR3S和BAL3S的單價均低於0.1USDT.

1900/1/1 0:00:00
以太坊:以太坊基金会项目MACI 1.0版本推出,旨在帮助去中心化应用实现防串通_WXBTC价格

巴比特讯,10月12日,ThePrivacy&ScalingExplorations团队发布以太坊基金会项目MACI1.0版本.

1900/1/1 0:00:00