mempool/backend/src/repositories/BlocksRepository.ts

73 lines
2.1 KiB
TypeScript
Raw Normal View History

import { IEsploraApi } from "../api/bitcoin/esplora-api.interface";
import { BlockExtended, PoolTag } from "../mempool.interfaces";
import { DB } from "../database";
import logger from "../logger";
import bitcoinApi from '../api/bitcoin/bitcoin-api-factory';
class BlocksRepository {
/**
* Save indexed block data in the database
* @param block
* @param blockHash
* @param coinbaseTxid
* @param poolTag
*/
public async $saveBlockInDatabase(
block: BlockExtended,
blockHash: string,
coinbaseHex: string | undefined,
poolTag: PoolTag
) {
const connection = await DB.pool.getConnection();
try {
const query = `INSERT INTO blocks(
height, hash, timestamp, size,
weight, tx_count, coinbase_raw, difficulty,
pool_id, fees, fee_span, median_fee
) VALUE (
?, ?, ?, ?,
?, ?, ?, ?,
?, ?, ?, ?
)`;
const params: any[] = [
block.height, blockHash, block.timestamp, block.size,
block.weight, block.tx_count, coinbaseHex ? coinbaseHex : "", block.difficulty,
poolTag.id, 0, "[]", block.medianFee,
];
await connection.query(query, params);
} catch (e) {
console.log(e);
logger.err('$updateBlocksDatabase() error' + (e instanceof Error ? e.message : e));
}
connection.release();
}
/**
* Check if a block has already been indexed in the database. Query the databse directly.
* This can be cached/optimized if required later on to avoid too many db queries.
* @param blockHeight
* @returns
*/
public async $isBlockAlreadyIndexed(blockHeight: number) {
const connection = await DB.pool.getConnection();
let exists = false;
try {
const query = `SELECT height from blocks where blocks.height = ${blockHeight}`;
const [rows]: any[] = await connection.query(query);
exists = rows.length === 1;
} catch (e) {
console.log(e);
logger.err('$isBlockAlreadyIndexed() error' + (e instanceof Error ? e.message : e));
}
connection.release();
return exists;
}
}
export default new BlocksRepository();