본문 바로가기

블록체인/이더리움

getPastEvents 함수의 방대한 결과값을 순차적으로 처리하는 방법

반응형
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()

 

  • 결과: 모든 블록을 순차적으로 처리한 모습

반응형