From 2210ac3451314ec62a921c12c7b917ccb89f6547 Mon Sep 17 00:00:00 2001 From: Capri Date: Sat, 12 Sep 2026 20:32:57 +0000 Subject: [PATCH] Restore per-algo block index tracking --- src/chain.cpp | 12 ++++++++++++ src/chain.h | 5 +++++ src/validation.cpp | 28 +++++++++++++++++++++++----- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/chain.cpp b/src/chain.cpp index 45991a5..2797041 100644 --- a/src/chain.cpp +++ b/src/chain.cpp @@ -33,6 +33,18 @@ CBlockIndex::CBlockIndex(const CBlockHeader& block) } +int CBlockIndex::GetAlgo() const +{ + switch (nVersion & BLOCK_VERSION_ALGO) { + case BLOCK_VERSION_SHA256D: + return ALGO_SHA256D; + case BLOCK_VERSION_RANDOMX: + return ALGO_RANDOMX; + default: + return ALGO_UNKNOWN; + } +} + void CChain::SetTip(CBlockIndex *pindex) { if (pindex == nullptr) { vChain.clear(); diff --git a/src/chain.h b/src/chain.h index 06329d5..6bd206c 100644 --- a/src/chain.h +++ b/src/chain.h @@ -201,6 +201,9 @@ public: //! (memory only) Maximum nTime in the chain up to and including this block. unsigned int nTimeMax{0}; + //! (memory only) Most recent block index for each mining algorithm. + CBlockIndex* lastAlgoBlocks[NUM_ALGOS_IMPL]{}; + /** * Default constructor (no header): */ @@ -264,6 +267,8 @@ public: bool HaveTxsDownloaded() const { return nChainTx != 0; } + int GetAlgo() const; + int64_t GetBlockTime() const { return (int64_t)nTime; diff --git a/src/validation.cpp b/src/validation.cpp index 80af40d..26c899c 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3036,9 +3036,18 @@ CBlockIndex* BlockManager::AddToBlockIndex(const CBlockHeader& block) pindexNew->nHeight = pindexNew->pprev->nHeight + 1; pindexNew->BuildSkip(); } - - // Use memcpy to copy the entire array at once. + // Keep track of the most recent block for each mining algorithm. if (pindexNew->pprev) { + memcpy( + pindexNew->lastAlgoBlocks, + pindexNew->pprev->lastAlgoBlocks, + sizeof(pindexNew->lastAlgoBlocks) + ); + } + + const int algo = pindexNew->GetAlgo(); + if (algo >= 0 && algo < NUM_ALGOS_IMPL) { + pindexNew->lastAlgoBlocks[algo] = pindexNew; } pindexNew->nTimeMax = (pindexNew->pprev ? std::max(pindexNew->pprev->nTimeMax, pindexNew->nTime) : pindexNew->nTime); @@ -3822,11 +3831,20 @@ bool BlockManager::LoadBlockIndex( } if (ShutdownRequested()) return false; CBlockIndex* pindex = item.second; - - // Use memcpy to copy the entire array at once. + // Rebuild the most recent block pointer for each mining algorithm. if (pindex->pprev) { + memcpy( + pindex->lastAlgoBlocks, + pindex->pprev->lastAlgoBlocks, + sizeof(pindex->lastAlgoBlocks) + ); } - + + const int algo = pindex->GetAlgo(); + if (algo >= 0 && algo < NUM_ALGOS_IMPL) { + pindex->lastAlgoBlocks[algo] = pindex; + } + nHeight = pindex-> nHeight; pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) + GetBlockProof(*pindex); pindex->nTimeMax = (pindex->pprev ? std::max(pindex->pprev->nTimeMax, pindex->nTime) : pindex->nTime);