使用 Multicall 加速 DeFi 查询调用_ALL:COM

译文出自:登链翻译计划

译者:翻译小组

校对:Tiny熊

背景介绍

有时,从区块链获取数据的成本可能会非常高,不管是从请求花费的时间还是从发送的请求数量上来说,都是这样。如果我们想同时获取大量数据,用来在仪表板上显示或进行分析,我们必须调用合约的不同函数或者用不同参数调用相同函数,这些都可能会导致查询时间很长。另外,当我们使用像Infura这样的节点提供商,也很容易达到发送请求数量的限额。

什么是Multicall?

Multicall是一个npm软件包,可将多个HTTP调用分为一个组。用这个方式,之前想从_n_个不同的请求中获取的数据,现在可以在发送HTTP请求之前对它们进行分组,然后进发送一个请求,从而缩短了请求响应时间,并降低了eth_call调用的次数。

用测试了解运作方式

比特币市占率回升至46.8%,以太坊市占率暂报18.32%:8月6日消息,CoinGecko数据显示,比特币市占率回升至46.8%,以太坊市占率暂报18.2%。此外,USDT、USDC、BUSD三种稳定币市占率分别为6.94%、2.16%、0.28%。

当前全网加密货币总市值为1,211,561,849,482美元,24小时涨幅0.3%。[2023/8/6 16:21:07]

为了了解这种机制的工作原理以及相对于传统方法是否确实有所改进,我们将通过一个对比测试来验证。分别在不使用Multicall和使用Multicall的情况下,对每个函数调用_n_次,然后分析结果。为此,我们通过调用函数getAccountLiquidity来查询Compound协议。我们将使用1,000个不同的地址来获取所有地址的信息。

创建项目

安装依赖

为了进行测试,先创建一个Node项目,并将安装依赖项:ethers

BKEX Global支持FIL(IPFS Filecoin)主网上线:据BKEX Global官网公告,BKEX Global将第一时间支持FIL(IPFS Filecoin)主网并开启充值提现,具体时间请留意后续公告。另据IPFS Filecoin官方消息,Filecoin主网将于2020年10月15日左右上线。

在Filecoin主网上线后的6个月内,BKEX将完成所推出FIL6与FIL(IPFS Filecoin)主网代币1:1兑换。兑换方式为每月线性兑换,每月具体兑换的比例届时将通过公告展示,请用户保持关注。同时,FIL6代币将在每月兑换后进行销毁。[2020/10/5]

calculatetime.js

调用合约

常规循环调用

先使用传统方法进行测试,我们将遍历1,000个的地址数组(在map循环中),逐个获取每个查询的结果,执行方法如下:

多位Filecoin矿工反映长时间接不到机器人提出的交易:在Slack社区当中有多位矿工反映长时间没有接收到订单机器人提出的交易,从挖矿排行榜上可以看到在最近的24小时当中,有超过半数的矿工没有出块奖励,而基础手续费在昨晚达到高点之后近12小时一直处于较低水平。

此前报道,今天下午2点到9月1日下午2点为维护窗口期,订单机器人将不会提出新的交易。(哔哔News)[2020/8/30]

constgetLiquidity=()=>{constcompoundContract=newethers.Contract(compound.comptroller.address,compound.comptroller.abi,provider)returnPromise.all(accounts.map(account=>{letdatatry{data=compoundContract.getAccountLiquidity(account.id。catch(error){console.log(`Errorgettingthedata${error}`。returndata})。

上面实例化compoundcomptroller合约,并在每个地址上调用流动性函数。

使用Multicall调用

使用Multicall调用时,调用函数必须稍作更改,形式如下:

constgetLiquidity=async()=>{constethcallProvider=newProvider(provider);awaitethcallProvider.init();constcompoundContract=newContract(compound.comptroller.address,compound.comptroller.abi,)constcontractCalls=accounts.map(account=>compoundContract.getAccountLiquidity(account.id))constresults=awaitethcallProvider.all(contractCalls);returnresults}

利用Multicall包中的Provider和Contract类。首先,初始化provider,并传递web3、合约地址及其合约ABI。

创建完成后,执行则和之前类似。在map里,调用帐户流动性函数。但是现在它不会发送到网络,而是将它们分组到一个数组中。创建此数组后,将调用创建好的MulticallProvider的all函数,并进行网络调用。

对比分析结果

要查看是否确实有重大改进,只需要对比两个调用消耗的时间。

传统循环方法消耗的时间:

Timetoprocessinmilliseconds:124653Timetoprocessinseconds:124.653Numberofentriesintheresult:1000

使用Multicall调用

Timetoprocessinmilliseconds:9591Timetoprocessinseconds:9.591Numberofentriesintheresult:1000

结论

通过结果对比,发现使用Multicall调用时间的减少是非常可观的,从124秒减少到9.5,花费的时间减少大约十倍。

另外,如果比较eth_callRPC调用的数量,同样是非常明显的减少,从一千个减少到只有一个。

因此,如果我们依赖第三方的节点提供商,而在该提供商中对API的调用是有限额,则这一点也同样重要。

本翻译由CellNetwork赞助支持。

来源:https://medium.com/better-programming/speed-up-your-defi-queries-using-multicall-d4cf652d8ab6

参考资料

登链翻译计划:https://github.com/lbc-team/Pioneer

翻译小组:https://learnblockchain.cn/people/412

Tiny熊:https://learnblockchain.cn/people/15

Infura:https://infura.io/

Multicall:https://github.com/cavanmflynn/ethers-multicall#readme

ethers.js:https://docs.ethers.io/v5/

money-legos:https://money-legos.studydefi.com/#/

CellNetwork:https://www.cellnetwork.io/?utm_souce=learnblockchain

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/9579148.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

币安为何推出第三条链?这对BNB意味着什么?

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金宝趣谈

[0:31ms0-3:443ms