From 265fec4639de4d5d371238f0c0e818a72cd259c6 Mon Sep 17 00:00:00 2001 From: mononaut Date: Thu, 25 Jun 2026 11:54:34 +0000 Subject: [PATCH] parse dmnd stratum v2 tags --- backend/src/api/blocks.ts | 4 +++- backend/src/repositories/BlocksRepository.ts | 4 +++- backend/src/utils/bitcoin-script.ts | 25 +++++++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 0d3631928..be247f571 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -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); } } diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index bb0e4f6c5..faa8fce74 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -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 = extras; diff --git a/backend/src/utils/bitcoin-script.ts b/backend/src/utils/bitcoin-script.ts index 117fa61a7..2a88477b8 100644 --- a/backend/src/utils/bitcoin-script.ts +++ b/backend/src/utils/bitcoin-script.ts @@ -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, '')); -} \ No newline at end of file +} + +/** 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 []; + } +}