How can I get this value, as I understand this complexity
https://github.com/bitcoin/bitcoin/blob/master/src/test/pow_tests.cpp#L55
0x1c0168fd
Bitcoin Stack Exchange is a question and answer site for Bitcoin crypto-currency enthusiasts. It only takes a minute to sign up.
Sign up to join this communityHow can I get this value, as I understand this complexity
https://github.com/bitcoin/bitcoin/blob/master/src/test/pow_tests.cpp#L55
0x1c0168fd
Here's the function that implements this. Each annotation refers to the line below.
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
{
If we're on a network without retargeting, don't retarget.
if (params.fPowNoRetargeting)
return pindexLast->nBits;
Don't adjust up or down by more than 4x.
// 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;
Take the old nBits in compact form, and turn it into 256-bit form. I explain that in more detail here: Difficulty target representation in bitcoin wiki
bnNew.SetCompact(pindexLast->nBits);
Multiply by the timespan (the time between the first block in the retargeting period, and the last block in the retargeting period.) Then, divide by the targeted timespan.
bnNew *= nActualTimespan;
bnNew /= params.nPowTargetTimespan;
If the result would be less than difficulty 1, change to difficulty 1 instead.
if (bnNew > bnPowLimit)
bnNew = bnPowLimit;
Re-encode as compact form for bignums. This is the reverse of SetCompact(int32_t)
.
return bnNew.GetCompact();
}
Let's also work through the example you give. 0x1c05a3f4 should change to 0x1c0168fd.
0x1c05a3f4
1c 05a3f4
^ exponent ^ mantissa
To decimal:
369652 * 256^28
Let's work out the timespans, actual and targeted
Actual: 1279297671 - 1279008237 = 289434
Target: 2016*600 = 1209600
Actual/Target ~= 0.239
Note that Target is more than 4x larger than Actual. We need to cap this, so we don't raise the difficulty too fast.
Capped timespan: Target/4 = 302400
Final calculation:
369652 * 256^28 * (302400/1209600) = 92413 * 256^28
Back to hex:
1c 0168fd
^ exponent ^ mantissa
Re-encode:
0x1c0168fd
...and that is in fact correct.