上面几篇文章有用到web3.js 获取合约里的事件,发现有时候事件多的话会报超出访问限制,我用ethers.js的 JsonRpcBatchProvider解决了这个问题。
JsonRpcBatchProvider他是把多个访问rpc的请求组装成一个请求返回数据, 减少了rpc的调用次数, 降低了rpc响应时间
安装环境
电脑要安装node 环境
npm install ethers
yarn add ethers
主要代码
import { providers, utils} from 'ethers'
import path from 'path'
import fs from 'fs'
class Model {
introBindAbi: any
provider: any
constructor () {
this.initWeb3()
}
async initWeb3 () {
this.introBindAbi = JSON.parse((fs.readFileSync(path.resolve(__dirname, '../abi/introBindAbi.json'))).toString())
this.provider = new providers.JsonRpcBatchProvider(config.rpcUrl);
}
getBlockNumber () {
return this.provider.getBlockNumber()
}
async getIntroBindLogData (localBlock: Number, endBlock: Number) {
let Interface = new utils.Interface(this.introBindAbi)
let filter = {
address: config.introBindContractAddress,
fromBlock: localBlock,
toBlock: endBlock,
}
let logs = await this.provider.getLogs(filter)
console.log(logs.length, 'logs.length')
for(let i = 0; i < logs.length ;i++) {
let item = logs[i]
try {
let data = Interface.parseLog({topics:item.topics, data: item.data})
switch(data.name) {
case 'BindIntroLog':
break
}
} catch (error) {
}
}
}
}