批处理多个读取函数调用以太坊区块链的不同块



我正在开发一个简单的Dapp,其中将显示折线图,并将获得每天的数据。然而,当获取数据时,我意识到从不同时间挖掘的不同块中获取历史数据真的很慢。

我的第一个天真的解决方案只是让read函数调用在给定的一天挖掘的每个块,但我很快意识到这是非常缓慢的。我使用RPC提供程序。

const blocksPerDay = 20 * 60 * 24;
const startingBlock = 1446905; 
const lastBlock = await provider.getBlockNumber();
let day = (await provider.getBlock(startingBlock)).timestamp;
const secondsPerDay = 60 * 60 * 24;
const result: LineChartData = [];
for (
let currentBlock = startingBlock;
currentBlock <= lastBlock;
currentBlock += blocksPerDay
) {
const valueAtBlock = await contract.getData({ blockTag: currentBlock });
result.push({x: day, y: fromWeiNumber(valueAtBlock)});
day += secondsPerDay;
}
return result;

然后我做了一点研究,找到了Multicall.js。不幸的是,我没有找到一种方法来批读函数调用不同块使用Multicall(因为这可能是不可能的)。

是否有办法在一个函数调用中为不同的块发送多个读调用或使其更快?显示图表的web应用程序(如poocoin)如何做到这一点?我需要获取自己的存档节点吗?

您将需要访问一个允许这些功能的节点,但是为了回答您的批处理问题,您可以使用graphql端点对读取请求进行批处理,对请求和响应进行批处理,或者使用json-rpc-batch-provider

最新更新