Move our custom fields to a BlockExtension sub object of the IEsploraApi.Block interface

This commit is contained in:
nymkappa
2022-02-04 12:51:45 +09:00
parent e5b5551d79
commit a49cc9a2fa
19 changed files with 124 additions and 77 deletions

View File

@@ -96,14 +96,20 @@ class Blocks {
*/
private getBlockExtended(block: IEsploraApi.Block, transactions: TransactionExtended[]): BlockExtended {
const blockExtended: BlockExtended = Object.assign({}, block);
blockExtended.reward = transactions[0].vout.reduce((acc, curr) => acc + curr.value, 0);
blockExtended.coinbaseTx = transactionUtils.stripCoinbaseTransaction(transactions[0]);
blockExtended.extra = {
reward: transactions[0].vout.reduce((acc, curr) => acc + curr.value, 0),
coinbaseTx: transactionUtils.stripCoinbaseTransaction(transactions[0]),
};
const transactionsTmp = [...transactions];
transactionsTmp.shift();
transactionsTmp.sort((a, b) => b.effectiveFeePerVsize - a.effectiveFeePerVsize);
blockExtended.medianFee = transactionsTmp.length > 0 ? Common.median(transactionsTmp.map((tx) => tx.effectiveFeePerVsize)) : 0;
blockExtended.feeRange = transactionsTmp.length > 0 ? Common.getFeesInRange(transactionsTmp, 8) : [0, 0];
blockExtended.extra.medianFee = transactionsTmp.length > 0 ?
Common.median(transactionsTmp.map((tx) => tx.effectiveFeePerVsize)) : 0;
blockExtended.extra.feeRange = transactionsTmp.length > 0 ?
Common.getFeesInRange(transactionsTmp, 8) : [0, 0];
return blockExtended;
}
@@ -197,7 +203,14 @@ class Blocks {
const block = await bitcoinApi.$getBlock(blockHash);
const transactions = await this.$getTransactionsExtended(blockHash, block.height, true);
const blockExtended = this.getBlockExtended(block, transactions);
const miner = await this.$findBlockMiner(blockExtended.coinbaseTx);
let miner: PoolTag;
if (blockExtended?.extra?.coinbaseTx) {
miner = await this.$findBlockMiner(blockExtended.extra.coinbaseTx);
} else {
miner = await poolsRepository.$getUnknownPool();
}
const coinbase: IEsploraApi.Transaction = await bitcoinApi.$getRawTransaction(transactions[0].txid, true);
await blocksRepository.$saveBlockInDatabase(blockExtended, blockHash, coinbase.hex, miner);
} catch (e) {
@@ -262,7 +275,12 @@ class Blocks {
const coinbase: IEsploraApi.Transaction = await bitcoinApi.$getRawTransaction(transactions[0].txid, true);
if (['mainnet', 'testnet', 'signet'].includes(config.MEMPOOL.NETWORK) === true) {
const miner = await this.$findBlockMiner(blockExtended.coinbaseTx);
let miner: PoolTag;
if (blockExtended?.extra?.coinbaseTx) {
miner = await this.$findBlockMiner(blockExtended.extra.coinbaseTx);
} else {
miner = await poolsRepository.$getUnknownPool();
}
await blocksRepository.$saveBlockInDatabase(blockExtended, blockHash, coinbase.hex, miner);
}

View File

@@ -380,7 +380,9 @@ class WebsocketHandler {
mBlocks = mempoolBlocks.getMempoolBlocks();
}
block.matchRate = matchRate;
if (block.extra) {
block.extra.matchRate = matchRate;
}
this.wss.clients.forEach((client) => {
if (client.readyState !== WebSocket.OPEN) {

View File

@@ -76,7 +76,8 @@ export interface TransactionStripped {
vsize: number;
value: number;
}
export interface BlockExtended extends IEsploraApi.Block {
export interface BlockExtension {
medianFee?: number;
feeRange?: number[];
reward?: number;
@@ -84,6 +85,10 @@ export interface BlockExtended extends IEsploraApi.Block {
matchRate?: number;
}
export interface BlockExtended extends IEsploraApi.Block {
extra?: BlockExtension;
}
export interface TransactionMinerInfo {
vin: VinStrippedToScriptsig[];
vout: VoutStrippedToScriptPubkey[];

View File

@@ -31,9 +31,18 @@ class BlocksRepository {
)`;
const params: any[] = [
block.height, blockHash, block.timestamp, block.size,
block.weight, block.tx_count, coinbaseHex ? coinbaseHex : '', block.difficulty,
poolTag.id, 0, '[]', block.medianFee,
block.height,
blockHash,
block.timestamp,
block.size,
block.weight,
block.tx_count,
coinbaseHex ? coinbaseHex : '',
block.difficulty,
poolTag.id,
0,
'[]',
block.extra ? block.extra.medianFee : 0,
];
await connection.query(query, params);