From 2e54f4ca94cd403ec07da2036d065e7f1f6096c4 Mon Sep 17 00:00:00 2001 From: Rishabh Date: Mon, 19 Jul 2021 04:56:16 +0530 Subject: [PATCH] Added missing block header API (#630) * header API frontend * Block Header API endpoint added to Node.js backend * updated package-lock.json Co-authored-by: Rishabh --- .../bitcoin/bitcoin-api-abstract-factory.ts | 1 + backend/src/api/bitcoin/bitcoin-api.ts | 4 ++++ backend/src/api/bitcoin/esplora-api.ts | 5 +++++ backend/src/index.ts | 1 + backend/src/routes.ts | 9 +++++++++ .../api-docs/api-docs.component.html | 20 +++++++++++++++++++ .../components/api-docs/api-docs.component.ts | 10 +++++++++- .../app/components/block/block.component.html | 5 +++++ 8 files changed, 54 insertions(+), 1 deletion(-) diff --git a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts index 697c68e43..906cc0f95 100644 --- a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts +++ b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts @@ -6,6 +6,7 @@ export interface AbstractBitcoinApi { $getBlockHeightTip(): Promise; $getTxIdsForBlock(hash: string): Promise; $getBlockHash(height: number): Promise; + $getBlockHeader(hash: string): Promise; $getBlock(hash: string): Promise; $getAddress(address: string): Promise; $getAddressTransactions(address: string, lastSeenTxId: string): Promise; diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index 48119d709..0af44d2a8 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -60,6 +60,10 @@ class BitcoinApi implements AbstractBitcoinApi { return this.bitcoindClient.getBlockHash(height); } + $getBlockHeader(hash: string): Promise { + return this.bitcoindClient.getBlockHeader(hash,false); + } + async $getBlock(hash: string): Promise { const foundBlock = blocks.getBlocks().find((block) => block.id === hash); if (foundBlock) { diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 5aa9f7fec..86d4179ad 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -35,6 +35,11 @@ class ElectrsApi implements AbstractBitcoinApi { .then((response) => response.data); } + $getBlockHeader(hash: string): Promise { + return axios.get(config.ESPLORA.REST_API_URL + '/block/' + hash + '/header', this.axiosConfig) + .then((response) => response.data); + } + $getBlock(hash: string): Promise { return axios.get(config.ESPLORA.REST_API_URL + '/block/' + hash, this.axiosConfig) .then((response) => response.data); diff --git a/backend/src/index.ts b/backend/src/index.ts index 0685b5e61..2d1ed5456 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -238,6 +238,7 @@ class Server { .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/status', routes.getTransactionStatus) .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/outspends', routes.getTransactionOutspends) .get(config.MEMPOOL.API_URL_PREFIX + 'block/:hash', routes.getBlock) + .get(config.MEMPOOL.API_URL_PREFIX + 'block/:hash/header', routes.getBlockHeader) .get(config.MEMPOOL.API_URL_PREFIX + 'blocks', routes.getBlocks) .get(config.MEMPOOL.API_URL_PREFIX + 'blocks/:height', routes.getBlocks) .get(config.MEMPOOL.API_URL_PREFIX + 'blocks/tip/height', routes.getBlockTipHeight) diff --git a/backend/src/routes.ts b/backend/src/routes.ts index a40a23895..718f492f9 100644 --- a/backend/src/routes.ts +++ b/backend/src/routes.ts @@ -506,6 +506,15 @@ class Routes { } } + public async getBlockHeader(req: Request, res: Response) { + try { + const blockHeader = await bitcoinApi.$getBlockHeader(req.params.hash); + res.send(blockHeader); + } catch (e) { + res.status(500).send(e.message || e); + } + } + public async getBlocks(req: Request, res: Response) { try { loadingIndicators.setProgress('blocks', 0); diff --git a/frontend/src/app/components/api-docs/api-docs.component.html b/frontend/src/app/components/api-docs/api-docs.component.html index 9c7fe0e65..fe5708997 100644 --- a/frontend/src/app/components/api-docs/api-docs.component.html +++ b/frontend/src/app/components/api-docs/api-docs.component.html @@ -190,6 +190,26 @@ + + + GET Block Header + + + + + +
+
Description
+
Returns the hex-encoded block header.
+
+ + +
+
+ GET Block Height diff --git a/frontend/src/app/components/api-docs/api-docs.component.ts b/frontend/src/app/components/api-docs/api-docs.component.ts index 2d0948084..27f4b0fdf 100644 --- a/frontend/src/app/components/api-docs/api-docs.component.ts +++ b/frontend/src/app/components/api-docs/api-docs.component.ts @@ -175,7 +175,15 @@ export class ApiDocsComponent implements OnInit { bits: 404111758, difficulty: 49402014931 }`, - }, + }, + blockHeader: { + codeSample: { + esModule: `//to be added`, + commonJS: `//to be added`, + curl: `curl -X GET "https://mempool.space/api/block/:hash/header"`, + }, + responseSample: `040000202c04d4c450187d1da9b1bc23ba47d67fe028d22486fd0c00000000000000000059a3a33d4642c799af9f54a4dd351fff9130e6a89d4e251130c60064878616e906b5ea60ce9813173a25caf3`, + }, blockHeight: { codeSample: { esModule: `const { %{1}: { blocks } } = mempoolJS(); diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index b26922bef..999c4fcff 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -114,6 +114,11 @@ Nonce {{ block.nonce | decimal2hex }} + + Block Header Hex + view + +