diff --git a/src/pow.cpp b/src/pow.cpp index 39adfa9d7..90d34b4fb 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -14,31 +14,20 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params) { unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact(); - // Genesis block if (pindexLast == NULL) return nProofOfWorkLimit; - // Only change once per difficulty adjustment interval - if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0) + if (params.fPowAllowMinDifficultyBlocks) { - if (params.fPowAllowMinDifficultyBlocks) - { - // Special difficulty rule for testnet: - // If the new block's timestamp is more than 2* 10 minutes - // then allow mining of a min-difficulty block. - if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2) - return nProofOfWorkLimit; - else - { - // Return the last non-special-min-difficulty-rules-block - const CBlockIndex* pindex = pindexLast; - while (pindex->pprev && pindex->nHeight % params.DifficultyAdjustmentInterval() != 0 && pindex->nBits == nProofOfWorkLimit) - pindex = pindex->pprev; - return pindex->nBits; - } + // Special difficulty rule for testnet: + // If the new block's timestamp is twice the target block time + // then allow mining of a min-difficulty block. + // This is to prevent the testnet from gettig stuck when a large amount + // of hashrate drops off the network. + if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2){ + return nProofOfWorkLimit; } - return pindexLast->nBits; } // Go back the full period unless it's the first retarget after genesis.