优化查询事件方法
This commit is contained in:
parent
79c1f1d9f2
commit
07fa89a7bf
@ -45,82 +45,6 @@ async function divQueryPassEvents({
|
|||||||
})
|
})
|
||||||
return [...firstHalfEvents, ...secondHalfEvents]
|
return [...firstHalfEvents, ...secondHalfEvents]
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* 某些链最多返回99条数据, 针对这种情况, 如下方式处理
|
|
||||||
* 1. 分析现有事件, 对于同一block返回数量超过设定值的, 单独拿出来
|
|
||||||
* 2. 比如 fromBlock: 0, toBlock: 100, 51和54号块事件数量超标
|
|
||||||
* 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({
|
export async function getPastEvents({
|
||||||
contract,
|
contract,
|
||||||
@ -143,14 +67,14 @@ export async function getPastEvents({
|
|||||||
fromBlock,
|
fromBlock,
|
||||||
toBlock,
|
toBlock,
|
||||||
})
|
})
|
||||||
|
logger.debug(`from: ${fromBlock} to: ${toBlock} events: ${events.length}`)
|
||||||
if (events.length >= RESULT_LIMIT_COUNT) {
|
if (events.length >= RESULT_LIMIT_COUNT) {
|
||||||
events = splitQueryEvents({
|
events = await divQueryPassEvents({
|
||||||
contract,
|
contract,
|
||||||
event,
|
event,
|
||||||
fromBlock,
|
fromBlock,
|
||||||
toBlock,
|
toBlock,
|
||||||
options,
|
options,
|
||||||
events,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -159,7 +83,7 @@ export async function getPastEvents({
|
|||||||
(/query returned more than \d+ results/.test(e.message) ||
|
(/query returned more than \d+ results/.test(e.message) ||
|
||||||
/logs matched by query exceeds limit of \d/.test(e.message))
|
/logs matched by query exceeds limit of \d/.test(e.message))
|
||||||
) {
|
) {
|
||||||
events = divQueryPassEvents({
|
events = await divQueryPassEvents({
|
||||||
contract,
|
contract,
|
||||||
event,
|
event,
|
||||||
fromBlock,
|
fromBlock,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user