# How to Get Bits 0x1c0168fd?

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

## 1 Answer

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.