链资讯 链资讯
Ctrl+D收藏链资讯
首页 > Filecoin > 正文

PRI:Uniswap V3 路径编码的进一步优化_KCAL币

作者:

时间:

本文作者:ripwu

源起

前几天群里有讨论UniswapV3中询价的处理,简单翻了下代码,发现与UniswapV2相比,V3变化真的很大~

其中v3-periphery目录下的Path

functionflashArbs(PoolTiercalldatainput)external;

数据编码为

0000000000000000000000000000000000000000000000000000000000000020//input.offset0000000000000000000000000000000000000000000000000000000000000004//input.length00000000000000000000000055542f696a3fecae1c937bd2e777b130587cfd2d//input00000000000000000000000000000000000000000000000000000000000001f40000000000000000000000009d7076ad0f7fdc5f0f249e97721d36a448d24906//input0000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000006ce15889c141c09ecf76a57795e91214a1f97648//input0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000dfc647c079757bac4f7776cc876746119ac451ea//input0000000000000000000000000000000000000000000000000000000000002710

动态 | Tezos区块链节点TacosFlippin宣布将退出Tezos区块链网络:10月13日,Tezos区块链上第5大节点TacosFlippin宣布将退出 Tezos 区块链网络,用户需要尽快解除对该节点的抵押,相关收益将在未来 7 轮内(大约20天)发放到用户手中。关于本次退出,TacosFlippin 的负责人表示,我们与社区的意见相左,不赞同 Tezos 社区看待问题的方式。[2019/10/14]

消耗gas为230*490*16=2360

节省gas为280

UniswapV3优化

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

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

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

函数原型为

functionflashArbs(bytescalldatainput)external;

动态 | Erste Group和Asfinag发行基于区块链的数字债券融资工具:据bankingtech消息,Erste Group和Asfinag通过区块链平台在欧洲进行了首个端到端数字债券融资工具发行。Erste Group是中欧和东欧最大的金融服务提供商之一;Asfinag是一家为奥地利高速公路计划、融资、建造、维护和收取通行费的奥地利国有公司。[2018/10/26]

数据编码为

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea00271000000000//padding

公告 | EOSflytoMARS节点和支持者捐赠2000EOS支持DAPP早期上链项目:据IMEOS消息,EOSflytoMARS在节点网站发布捐赠信息,近期社区对于RAM价格的上涨产生疑虑,担心价格投机和炒作会影响到生态的发展,社区正在就这一问题进行深入的讨论,我们相信会很快形成共识解决这一问题。在此之前,我们希望通过节点和社区的努力来为这一问题提供支持,并加速DAPP的上链。EOSflytoMARS的一位投票支持者愿意捐赠1000EOS来支持有RAM需求并计划近期上链的项目并委托EOSflytoMARS节点进行遴选,节点也决定按照1:1配比捐赠详情可在官网查看。[2018/7/1]

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

这也是UniswapV3的优化方式

优化

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

函数原型为

functionflashArbs()external;

数据编码为

55542f696a3fecae1c937bd2e777b130587cfd2d0001f49d7076ad0f7fdc5f0f249e97721d36a448d24906000bb86ce15889c141c09ecf76a57795e91214a1f97648002710dfc647c079757bac4f7776cc876746119ac451ea002710

动态 | 涉足区块链领域的风投机构Union Square投资回报率仍为行业最佳之一:据The Information获得的内部数据,涉足区块链领域的风险投资机构Union Square Ventures在近几年依旧保持了不错的投资回报水平,甚至可能是行业内投资回报率最高的风投机构之一。截止去年6月30日,旗下三支分别在 2012、2014和2016年募集的基金,投资回报率分别为 32%、21% 和 32%。据悉,USV是加密货币和区块链创投企业的早期投资者,投资组合包括了Coinbase。在去年的博客中,联合创始人Fred Wilson称该公司在区块链行业的投资占公司所有活跃投资组合的 15%,而且占近期投资的 25%。[2019/11/23]

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

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

动态 | The Community九名成员因通过劫持SIM卡窃取加密货币遭指控:上周,美国当局以电信欺诈和严重身份盗窃向九人提出指控。据悉,这九个人均为一个网络犯罪组织的成员,他们通过劫持SIM卡和电话号码窃取加密货币。该组织被称为“The Community”,由八名美国人和一名爱尔兰人组成。其欺诈活动遍及佛罗里达州、加利福尼亚州、爱荷华州、纽约州、密苏里州、康涅狄格州和亚利桑那州。[2019/5/15]

这里稍微解释下:

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

标签:PRIPRINTINTCALPricetoolsFingerPrintMINTI价格KCAL币

Filecoin热门资讯
HOO:虎符国际新增HOO质押借贷 质押率55%_HSC

10月13日,虎符国际发布了最新公告,虎符国际将支持HOO作为虎符借贷业务中的可质押资产,用户可将HOO划转至「钱包余额」作为质押借贷保证金,进行后续的借出操作,目前HOO质押率为55%.

COIN:关于关闭C2C市场CNY交易区的公告_Kucoin

亲爱的KuCoin用户:为响应当地政府监管政策要求,KuCoin将在保证用户资产安全的前提下完成有序的清退.

PRI:Footprint周报:公链Fantom暴涨,AnySwap贡献超40%成最大第三方跨链桥_OOT

撰文:Footprint分析师Simon() 日期:2021年10月 本周概况: I.TVL 本周据FootprintAnalytics数据显示.

SAFE:SFP(SafePal)_safepal币有什么用

專案簡介: SafePal是一種加密貨幣錢包,旨在為大眾提供安全且用戶友好的加密管理平臺。SafePal提供了硬體錢包和軟體錢包產品線,這些產品線均通過SafePal應用程式進行了配對和管理,用.

TPS:ZT創新板即將上線 RGT_API

親愛的ZT用戶: ZT創新板即將上線RGT,並開啟RGT/USDT交易對。具體上線時間如下:充值:已開啟;交易:2021年10月14日17:00; RGT ZT创新板即将上线BBoxer:据官网.

PAL:迎接第四次工业革命,详解数据和API如何改变未来经济格局_pala币

原文标题:《一文了解数据和API如何驱动未来经济》区块链上的智能合约就像未连接互联网的计算机一样,本身就具有其内在价值,智能合约的内在价值就是创建和交易通证.