반응형
Error: Returned error: query returned more than 10000 results
- Infura API 를 통해 조회시 결과가 10000개 이상이면 에러가 발생한다.
- 대표적으로 getPastEvents 함수로 토큰의 모든 트랜스퍼 이벤트를 조회할 때 발생한다.
- 아래 링크에서는 이 에러를 우회하기 위해 결과값이 10000개 이상일 때 이분 탐색을 제시한다.
Infura returns strange error: `query returned more than 10000 results`
The purpose of the function below is to track USDT that is transferred to and from Yearn and Fulcrum. When I call search_liquidity(_toBlock), I get an error that says Returned error: query returned...
ethereum.stackexchange.com
- 이는 성능적으로는 문제가 없으나 이벤트를 순차적으로 처리하고 싶을 때는 web3 함수가 비동기식으로 처리되기 때문에 순서를 보장하지 못한다.
- Promise 객체를 통해 async 함수 호출에 대한 순서를 보장하도록 수정했다.
const readEventsRange = (start, end) => new Promise((resolve, reject) => {
(async () => {
contract.getPastEvents('Transfer', {fromBlock: start, toBlock: end}, async (errors, events) => {
if (!errors) {
console.log('starts processing blocks',start,'..',end)
// program logic
console.log('done processing blocks',start,'..',end)
resolve();
} else {
if (errors.message === 'Returned error: query returned more than 10000 results') {
const middle = Math.round((start + end) / 2);
console.log('Infura 10000 limit [' + start + '..' + end + '] ' +
'-> [' + start + '..' + middle + '] ' +
'and [' + (middle + 1) + '..' + end + ']');
await readEventsRange(start, middle);
await readEventsRange(middle + 1, end);
resolve();
} else {
reject('uncaught error!');
}
}
});
})()
});
async function main() {
console.time("elapsed time:")
await readEventsRange(START_BLOCK, END_BLOCK);
console.log("total transfers:", totalTransfers);
console.timeEnd("elapsed time:")
}
main()
- 결과: 모든 블록을 순차적으로 처리한 모습
반응형
'블록체인 > 이더리움' 카테고리의 다른 글
msg.sender vs _msgSender() (0) | 2022.05.02 |
---|---|
오픈씨는 왜 WETH 를 사용할까? (0) | 2022.04.28 |
이더리움 화이트리스트 추출 방법 (0) | 2022.03.16 |
이더스캔에서 ERC721 토큰을 추적하는 방식 (2) | 2022.03.16 |
솔리디티의 Safe Math 기능과 Counters 객체 (0) | 2022.03.16 |