优化查询事件方法

This commit is contained in:
CounterFire2023 2023-06-30 14:31:46 +08:00
parent 79c1f1d9f2
commit 07fa89a7bf

View File

@ -45,82 +45,6 @@ async function divQueryPassEvents({
})
return [...firstHalfEvents, ...secondHalfEvents]
}
/**
* 99, ,
* 1. , block返回数量超过设定值的,
* 2. fromBlock: 0, toBlock: 100, 5154
* 3. 0-50, 51-51, 52-53, 54-54, 54-100
* @param param0
* @returns
*/
async function splitQueryEvents({
contract,
event,
fromBlock,
toBlock,
options,
events,
}: {
contract: any
event: string
fromBlock: BN
toBlock: BN
options?: any
events: any[]
}) {
let countMap: Map<string, number> = new Map()
for (let event of events) {
countMap.inc(event.blockNumber, 1)
}
let blockArr: number[] = []
for (let [key, val] of countMap.entries()) {
if (val >= SPLIT_LIMIT_COUNT) {
blockArr.push(parseInt(key))
}
}
blockArr.sort((a, b) => a - b)
let results: any[] = []
let preBlock = fromBlock
for (let i = 0; i < blockArr.length; i++) {
const block = toBN(blockArr[i])
let subFromBlock = preBlock
let subToBlock = block
if (!preBlock.eq(block)) {
const partEvents0 = await getPastEvents({
contract,
event,
fromBlock: subFromBlock,
toBlock: subToBlock.sub(ONE),
options,
})
results = results.concat(partEvents0)
}
let partEvents1 = await getPastEvents({
contract,
event,
fromBlock: subToBlock,
toBlock: subToBlock,
options,
})
results = results.concat(partEvents1)
if (i === blockArr.length - 1) {
if (!subToBlock.eq(toBlock)) {
let partEvents2 = await getPastEvents({
contract,
event,
fromBlock: subToBlock.add(ONE),
toBlock: toBlock,
options,
})
results = results.concat(partEvents2)
}
}
preBlock = block.add(ONE)
}
return results
}
export async function getPastEvents({
contract,
@ -143,14 +67,14 @@ export async function getPastEvents({
fromBlock,
toBlock,
})
logger.debug(`from: ${fromBlock} to: ${toBlock} events: ${events.length}`)
if (events.length >= RESULT_LIMIT_COUNT) {
events = splitQueryEvents({
events = await divQueryPassEvents({
contract,
event,
fromBlock,
toBlock,
options,
events,
})
}
} catch (e) {
@ -159,7 +83,7 @@ export async function getPastEvents({
(/query returned more than \d+ results/.test(e.message) ||
/logs matched by query exceeds limit of \d/.test(e.message))
) {
events = divQueryPassEvents({
events = await divQueryPassEvents({
contract,
event,
fromBlock,