BSC PancakeSwap交易对合约调用返回-32602错误求助
问题:Quiknode免费BSC节点请求10块范围日志却触发10000块限制报错
问题详情
我使用Quiknode免费BSC节点,搭配Node.js Web3库加载PancakeSwap某BSC交易对的所有Sync事件,代码如下:
const blocksPerRequest = 10; const reserves = await pairContract.getPastEvents('Sync', { filter: {}, fromBlock: blockNumber - BigInt((i +1) * blocksPerRequest), toBlock: blockNumber - BigInt(i * blocksPerRequest), });
变量i设为0,但返回-32602错误,提示getMultipleAccounts, eth_getLogs, and eth_newFilter are limited to a 10000 range,可我明明只请求了10块的范围,且该功能数月前可正常运行。错误详情:
innerError: { code: -32602, message: 'getMultipleAccounts, eth_getLogs, and eth_newFilter are limited to a 10000 range' }, code: 101, data: undefined, request: { jsonrpc: '2.0', id: '96ec05fe-b8ad-4cfa-8abf-9eaf7fb22c69', method: 'eth_getLogs', params: [ { fromBlock: '0x20793fc', toBlock: '0x2079406', topics: [ '0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1' ], address: '0x8ff7115defd48165aa3f70153a644e8f58e71f42' } ] }
原因分析与解决方案
1. 节点服务商规则变更
数月前正常现在报错,核心原因是Quiknode调整了免费节点的eth_getLogs限制。虽然提示是10000块范围,但实际可能是免费节点新增了单请求日志条目数量上限,或是对小范围请求的误判,也可能是他们悄悄收紧了免费节点的权限。
2. 可行解决办法
- 进一步缩小请求区块范围:把
blocksPerRequest改成5甚至1,避免单请求返回过多日志触发限制。有些节点服务商的限制不是看区块数,而是日志条目数,哪怕1个区块内日志量过大也会报错。 - 格式化区块号参数:Web3.js对BigInt的处理偶尔会有异常,把计算后的区块号转成字符串再传入试试:
const blocksPerRequest = 10; const fromBlock = (blockNumber - BigInt((i + 1) * blocksPerRequest)).toString(); const toBlock = (blockNumber - BigInt(i * blocksPerRequest)).toString(); const reserves = await pairContract.getPastEvents('Sync', { filter: {}, fromBlock, toBlock, });
- 更换免费节点:试试BSC官方公共节点等其他免费BSC节点,不同服务商的限制规则不同。
- 升级付费节点:如果需要稳定的日志查询服务,Quiknode付费节点的限制会宽松很多,适合高频或大量日志请求场景。
另外,手动计算请求中的区块范围:0x2079406 - 0x20793fc = 10,确实是10个区块,所以你的范围计算没有问题,问题出在节点服务商的限制变更上。
内容的提问来源于stack exchange,提问作者theburouc
相关产品推荐
相关产品推荐

