From 905ddbb363b3f9172eecef9d7d15f2d3dc678193 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 11 Jan 2021 01:51:57 +0700 Subject: [PATCH] Bitcoind: Use mempool as address index when doing address prefix search. --- .../api/bitcoin/bitcoin-api-abstract-factory.ts | 1 + backend/src/api/bitcoin/bitcoin-api.ts | 16 ++++++++++++++++ backend/src/api/bitcoin/esplora-api.ts | 3 +++ backend/src/routes.ts | 7 ++++++- backend/tslint.json | 2 +- 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts index 4dcd4b4d4..951d9576c 100644 --- a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts +++ b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts @@ -10,4 +10,5 @@ export interface AbstractBitcoinApi { $getBlock(hash: string): Promise; $getAddress(address: string): Promise; $getAddressTransactions(address: string, lastSeenTxId: string): Promise; + $getAddressPrefix(prefix: string): string[]; } diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index 3f2b83041..b77b63385 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -90,6 +90,22 @@ class BitcoinApi implements AbstractBitcoinApi { return this.bitcoindClient.getRawMemPool(); } + $getAddressPrefix(prefix: string): string[] { + const found: string[] = []; + const mp = mempool.getMempool(); + for (const tx in mp) { + for (const vout of mp[tx].vout) { + if (vout.scriptpubkey_address.indexOf(prefix) === 0) { + found.push(vout.scriptpubkey_address); + if (found.length >= 10) { + return found; + } + } + } + } + return found; + } + protected async $convertTransaction(transaction: IBitcoinApi.Transaction, addPrevout: boolean): Promise { let esploraTransaction: IEsploraApi.Transaction = { txid: transaction.txid, diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index df566daac..24220da3e 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -50,6 +50,9 @@ class ElectrsApi implements AbstractBitcoinApi { .then((response) => response.data); } + $getAddressPrefix(prefix: string): string[] { + throw new Error('Method not implemented.'); + } } export default ElectrsApi; diff --git a/backend/src/routes.ts b/backend/src/routes.ts index fe6a82a8a..e35164ab0 100644 --- a/backend/src/routes.ts +++ b/backend/src/routes.ts @@ -660,7 +660,12 @@ class Routes { } public async getAddressPrefix(req: Request, res: Response) { - res.status(501).send('Not implemented'); + try { + const blockHash = await bitcoinApi.$getAddressPrefix(req.params.prefix); + res.send(blockHash); + } catch (e) { + res.status(500).send(e.message || e); + } } public getTransactionOutspends(req: Request, res: Response) { diff --git a/backend/tslint.json b/backend/tslint.json index 65ac58f4b..945512322 100644 --- a/backend/tslint.json +++ b/backend/tslint.json @@ -12,7 +12,7 @@ "severity": "warn" }, "eofline": true, - "forin": true, + "forin": false, "import-blacklist": [ true, "rxjs",