木星链 木星链
Ctrl+D收藏木星链
首页 > Gate.io > 正文

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

作者:

时间: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成为首个历史总收入超过10亿美元的DeFi协议:8月11日消息,Uniswap成为首个历史总收入超过10亿美元的DeFi协议,该数据为以太坊主网(未包含Optimism上的数据)上V2和V3的费用收入之和,分别约为7.5亿美元和2.5亿美元。[2021/8/11 1:48:03]

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

UniArts Network为上海文创IP产业中心提供NFT技术支持:据官方消息,UniArts Network生态合作企业熵淼科技与上海文创IP产业中心签订协议,为后者提供基于其艺术品和文创IP产品资源的NFT数字资产开发与销售服务。

据悉,双方首次合作的NFT素材包括:

1.张大千若干幅绘画艺术作品

2.池磊数字艺术作品

3.泰迪珍藏数字艺术作品

上述NFT产品均会在“饭团密画”NFT销售平台上架出售。[2021/5/6 21:28:24]

消耗gas为66*490*16=1704,无效数据占比降至~15%

这也是UniswapV3的优化方式

优化

实际上,我们继续优化,使得有效载荷为100%

函数原型为

functionflashArbs()external;

数据编码为

55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710

UNI跌破35美元关口 日内涨幅为0.03%:火币全球站数据显示,UNI短线下跌,跌破35美元关口,现报34.9917美元,日内涨幅达到0.03%,行情波动较大,请做好风险控制。[2021/4/13 20:14:02]

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

实际上,我的方式是抛弃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增长业务高管抨击YFI创始人言论 并称SushiSwap为“偷来的DApp”:1月13日消息,因发布《不建议成为DeFi开发者》一文,yearn.finance (YFI)创始人Andre Cronje遭到Uniswap增长业务领导者Ashleigh Schap的抨击。在《不建议成为DeFi开发者》一文中,Andre Cronje称“可以开发出更好的产品,但竞争对手可以直接分叉我的代码,和创建一个可以无限铸造的代币,他们将在一周内拥有两倍的用户。”针对该说法,Ashleigh Schap则表示“你抱怨称任何人都可以窃取你的作品。然而YFI选择与SushiSwap合作。当一个合法的dapp验证一个偷来的DApp并进行合作,这只会鼓励这种行为。”此外,Ashleigh Schap还反驳了Andre Cronje把加密领域的社区概念描述为“一派胡言”及“治理和社区扼杀创新”等言论。(Cointelegraph )[2021/1/13 16:03:32]

首先通过calldatasize得到调用数据的长度,减去functionselector的4字节,得到的input_len即为参数长度

然后通过0x40获得空闲指针,拷贝参数到memory

Compound发起治理提案026计划上调UNI借款上限:刚刚Compound Labs官方发推称,Compound联合创始人兼首席技术官Geoffrey Hayes已提交Compound治理提案026,计划将Uniswap的借款上限提高到500万UNI;实施新的(更昂贵的)Uniswap利率模型;授权社区Multi-Sig调整借款上限。[2020/10/9]

最后将参数长度按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

标签:PUTUNISWAPUniswapBitconch Reputation HeatSUNIMakiSwapUniswap Finance

Gate.io热门资讯
MEX:MEXC 關於10月16日合約系統升級的公告

尊敬的MEXC用戶:為了給您提供更好的合約交易體驗,MEXC平台合約市場將於2021年10月16日9:00-13:00(UTC8)進行系統升級維護,預計需要4小時.

1900/1/1 0:00:00
ELE:Element Finance完成3200万美元融资,Polychain Capital领投

10月19日消息,固定利率借贷协议ElementFinance宣布完成3200万美元融资,PolychainCapital领投.

1900/1/1 0:00:00
Gate.io 将进行 BTC 以及USDT 结算永续合约升级公告(周三 23:00)

Gate.io将于2021年10月20日23:00~23:59进行BTC,USDT结算的永续合约引擎升级,时间约为1小时.

1900/1/1 0:00:00
比特币:资管巨头古根海姆 Guggenheim 首席投资官 Scott Minerd 称不再投资比特币

链闻消息,据CoinDesk报道,资管巨头古根海姆的首席投资官ScottMinerd表示,在今年早期预测比特币可能达到60万美元后,他不再投资比特币.

1900/1/1 0:00:00
MEX:MEXC關於 KEEP3S、 SKL3S & LIT3S 3種 ETF產品進行份額合並的公告

尊敬的用戶:由於杠桿ETF產品KEEP3S、SKL3S&LIT3S的單價均低於0.1USDT,觸發了MEXC杠桿ETF產品份額合並機製.

1900/1/1 0:00:00
ALA:Galaxy Digital 旗下 Galaxy Interactive 已筹集 3.25 亿美元投资基金,用于投资加密相关项目

链闻消息,由亿万富翁、加密货币投资者MikeNovogratz创立的GalaxyDigital旗下风险投资部门GalaxyInteractive已筹集3.25亿美元的投资基金.

1900/1/1 0:00:00