The function is CalculateNextWorkRequired in pow.cpp L#49:
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
{
if (params.fPowNoRetargeting)
return pindexLast->nBits;
// Limit adjustment step
int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
if (nActualTimespan < params.nPowTargetTimespan/4)
nActualTimespan = params.nPowTargetTimespan/4;
if (nActualTimespan > params.nPowTargetTimespan*4)
nActualTimespan = params.nPowTargetTimespan*4;
// Retarget
const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
arith_uint256 bnNew;
bnNew.SetCompact(pindexLast->nBits);
bnNew *= nActualTimespan;
bnNew /= params.nPowTargetTimespan;
if (bnNew > bnPowLimit)
bnNew = bnPowLimit;
return bnNew.GetCompact();
}
Explanation:
1. If retargeting is disabled, return the last difficulty.
2. Calculate the timespan between the last block and 2016 blocks ago
3. Truncate the timespan to no less than 1/4 of the target timespan (3.5 days) or no greater than 4x the target timespan (8 weeks).
4. Multiply the last difficulty target by the ratio actualTimespan:targetTimespan
5. Truncate to the maximum allowed target (bnPowLimit) if the resulting target is too high (very low difficulty)
thank you. When would retargeting be disabled ? How does this pop in ? – fritz – 2018-12-14T06:09:58.563
And where in this code is the legendary broken and unfixed bug that causes updates every 2015 rather than 2016 blocks ? – fritz – 2018-12-14T06:10:34.103
https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/src/chainparams.cpp#L294 – JBaczuk – 2018-12-14T06:18:26.420
https://github.com/bitcoin/bitcoin/blob/v0.17.0.1/src/pow.cpp#L41 – JBaczuk – 2018-12-14T06:20:14.350