From 156963c81afd1814d7c7ce3286332782c7dfd417 Mon Sep 17 00:00:00 2001 From: Ratan Kaliani Date: Fri, 21 Feb 2025 00:29:21 -0800 Subject: [PATCH] feat(query): speed up routes (#79) * feat: add range early terminate, speed up fetching data roots * speed up * cleanup --- query/app/api/route.ts | 42 ++++++++++++++++++++++------------------- query/package-lock.json | 14 -------------- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/query/app/api/route.ts b/query/app/api/route.ts index d0987d8..5ede4c1 100644 --- a/query/app/api/route.ts +++ b/query/app/api/route.ts @@ -6,7 +6,7 @@ import { ApiPromise, initialize, disconnect } from 'avail-js-sdk'; import { getChainInfo, queryLogs } from '@/app/utils/shared'; import { VECTORX_DATA_COMMITMENT_EVENT } from '@/app/utils/abi'; import { AbiEvent } from 'abitype'; -import { CHAIN_TO_WS_ENDPOINT } from '@/app/utils/avail'; +import { CHAIN_TO_WS_ENDPOINT, getBlockRangeAvail } from '@/app/utils/avail'; type DataCommitmentRange = { startBlockNumber: number; @@ -77,21 +77,13 @@ const fetchDataRootsForRange = async ( chainName: string ): Promise => { const api = await initialize(CHAIN_TO_WS_ENDPOINT.get(chainName.toLowerCase()) as string); - const MAX_CONCURRENT_WS_REQUESTS = 100; - - let currBlock = startBlock; - let dataRoots: Uint8Array[] = []; - while (currBlock < endBlock) { - const rangeStartBlock = currBlock; - const rangeEndBlock = Math.min(currBlock + MAX_CONCURRENT_WS_REQUESTS, endBlock); - const blockRange = Array.from( - { length: rangeEndBlock - rangeStartBlock }, - (_, i) => rangeStartBlock + i - ); - const rangeDataRoots = await Promise.all(blockRange.map((x) => fetchDataRoot(api, x))); - dataRoots.push(...rangeDataRoots); - currBlock = rangeEndBlock; - } + + const blockNumbers = Array.from( + { length: endBlock - startBlock }, + (_, i) => startBlock + i + ); + + const dataRoots = await Promise.all(blockNumbers.map(x => fetchDataRoot(api, x))); return dataRoots; }; @@ -371,6 +363,21 @@ export async function GET(req: NextRequest) { console.log('Requested block: ' + requestedBlock); + let blockRange = await getBlockRangeAvail(addressUint8, ethereumChainId); + if (blockRange === undefined) { + return NextResponse.json({ + success: false, + error: 'Getting the block range covered by the VectorX contract failed!' + }); + } + + if (requestedBlock < blockRange.start || requestedBlock > blockRange.end) { + return NextResponse.json({ + success: false, + error: `Requested block ${requestedBlock} is not in the range of blocks [${blockRange.start}, ${blockRange.end}] contained in the VectorX contract.` + }); + } + try { let promises = [ getBlockHash(requestedBlock, chainName!), @@ -403,9 +410,6 @@ export async function GET(req: NextRequest) { dataRoots = dataRoots.concat(additionalRoots); } - // Compute the data commitment hash using dataRoots. - let expectedDataCommitment = computeDataCommitment(dataRoots, commitmentTreeSize); - // Get the merkle branch for the requested block number by computing the Merkle tree branch // of the tree constructed from the data roots. const index = requestedBlock - startBlockNumber - 1; diff --git a/query/package-lock.json b/query/package-lock.json index 15d4873..f0bba57 100644 --- a/query/package-lock.json +++ b/query/package-lock.json @@ -9,7 +9,6 @@ "version": "0.1.0", "dependencies": { "@aws-sdk/client-dynamodb": "^3.596.0", - "@upstash/redis": "^1.31.5", "abitype": "^1.0.2", "avail-js-sdk": "^0.2.12", "next": "14.2.3", @@ -2469,14 +2468,6 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/@upstash/redis": { - "version": "1.31.5", - "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.31.5.tgz", - "integrity": "sha512-2MatqeqftroSJ9Q+pqbyGAIwXX6KEPtUTUna2c/fq09h12ffwvltDTgfppeF+NzJo/SyZfHY8e1RoflduMbz1A==", - "dependencies": { - "crypto-js": "^4.2.0" - } - }, "node_modules/abitype": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.2.tgz", @@ -3034,11 +3025,6 @@ "node": ">= 8" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",