parse dmnd stratum v2 tags

This commit is contained in:
mononaut 2026-06-25 11:54:34 +00:00
parent d63a8b6358
commit 265fec4639
No known key found for this signature in database
GPG key ID: BFD16BE592A9CD8D
3 changed files with 30 additions and 3 deletions

View file

@ -37,7 +37,7 @@ import { calculateGoodBlockCpfp } from './cpfp';
import blockProcessor, { BlockProcessingResult, detectTemplateAlgorithm, saveCpfpDataToCpfpSummary } from './block-processor';
import mempool from './mempool';
import CpfpRepository from '../repositories/CpfpRepository';
import { parseDATUMTemplateCreator } from '../utils/bitcoin-script';
import { parseDATUMTemplateCreator, parseDMNDTemplateCreator } from '../utils/bitcoin-script';
import database from '../database';
import { getBlockFirstSeenFromLogs, getOldestLogTimestampFromLogs, scanLogsForBlocksFirstSeen } from '../utils/file-read';
@ -359,6 +359,8 @@ class Blocks {
if (extras.pool.name === 'OCEAN') {
extras.pool.minerNames = parseDATUMTemplateCreator(extras.coinbaseRaw);
} else if (extras.pool.name === 'DMND') {
extras.pool.minerNames = parseDMNDTemplateCreator(extras.coinbaseRaw);
}
}

View file

@ -14,7 +14,7 @@ import chainTips from '../api/chain-tips';
import blocks from '../api/blocks';
import BlocksAuditsRepository from './BlocksAuditsRepository';
import transactionUtils from '../api/transaction-utils';
import { parseDATUMTemplateCreator } from '../utils/bitcoin-script';
import { parseDATUMTemplateCreator, parseDMNDTemplateCreator } from '../utils/bitcoin-script';
import poolsUpdater from '../tasks/pools-updater';
interface DatabaseBlock {
@ -1374,6 +1374,8 @@ class BlocksRepository {
if (extras.pool.name === 'OCEAN') {
extras.pool.minerNames = parseDATUMTemplateCreator(extras.coinbaseRaw);
} else if (extras.pool.name === 'DMND') {
extras.pool.minerNames = parseDMNDTemplateCreator(extras.coinbaseRaw);
}
blk.extras = <BlockExtension>extras;

View file

@ -224,4 +224,27 @@ export function parseDATUMTemplateCreator(coinbaseRaw: string): string[] | null
tagString = tagString.replace('\x00', '');
return tagString.split('\x0f').map((name) => name.replace(/[^a-zA-Z0-9 ]/g, ''));
}
}
/** Extracts miner names from a DMND coinbase transaction */
export function parseDMNDTemplateCreator(coinbaseRaw: string): string[] {
try {
if (!coinbaseRaw || coinbaseRaw.length % 2 !== 0 || !/^[0-9a-fA-F]+$/.test(coinbaseRaw)) {
return [];
}
const bytes = Buffer.from(coinbaseRaw, 'hex');
const blockHeightLength = bytes[0];
const tagDelimiterIndex = 1 + blockHeightLength;
if (bytes.length <= tagDelimiterIndex || bytes[tagDelimiterIndex] !== 0x00) {
return [];
}
const tagStart = tagDelimiterIndex + 1;
const tagEnd = bytes.indexOf(0x00, tagStart);
const tags = bytes.subarray(tagStart, tagEnd === -1 ? undefined : tagEnd);
return tags.toString('utf8').split('/').slice(1, -1);
} catch {
return [];
}
}