0

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

DATSEC
  • 83
  • 5

1 Answers1

2

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.

Nick ODell
  • 29,396
  • 11
  • 72
  • 130