本文作者: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
10月13日,虎符国际发布了最新公告,虎符国际将支持HOO作为虎符借贷业务中的可质押资产,用户可将HOO划转至「钱包余额」作为质押借贷保证金,进行后续的借出操作,目前HOO质押率为55%.
亲爱的KuCoin用户:为响应当地政府监管政策要求,KuCoin将在保证用户资产安全的前提下完成有序的清退.
撰文:Footprint分析师Simon() 日期:2021年10月 本周概况: I.TVL 本周据FootprintAnalytics数据显示.
專案簡介: SafePal是一種加密貨幣錢包,旨在為大眾提供安全且用戶友好的加密管理平臺。SafePal提供了硬體錢包和軟體錢包產品線,這些產品線均通過SafePal應用程式進行了配對和管理,用.
親愛的ZT用戶: ZT創新板即將上線RGT,並開啟RGT/USDT交易對。具體上線時間如下:充值:已開啟;交易:2021年10月14日17:00; RGT ZT创新板即将上线BBoxer:据官网.
原文标题:《一文了解数据和API如何驱动未来经济》区块链上的智能合约就像未连接互联网的计算机一样,本身就具有其内在价值,智能合约的内在价值就是创建和交易通证.