# ELI5: Bitcoin Difficulty

In Bitcoin, difficulty is the measure of how hard it is to mine a block. To ensure constant output, this rate is adjusted every 2016 blocks - anticipating block production to take around ten minutes, we can expect recalculation every two weeks. If more blocks are produced than expected then the difficulty is increased, otherwise it is lowered.

The following formulae can be used to calculate the difficulty rate for any given height - substituting an expected average of 600 seconds (10 minutes) and a base difficulty (introduced at genesis) of `1.0`.

``````expected / actual = rate
currentDifficulty * rate = newDifficulty
``````

If we look at a historical view of difficulty adjustments on mainnet the first recalculation was at height `32,256` with an average block production time of 508 seconds. We can estimate the first difficulty as follows:

``````600 / 508 = 1.18
1 * 1.18 = 1.18
``````

The subsequent adjustment is expected at height `32,256 + 2016 = 34,272`. Taking the new average production rate of 544 seconds we can calculate the following difficulty:

``````600 / 544 = 1.1
1.18 * 1.1 = 1.298
``````

Despite some loss in precision, we can see these figures are roughly accurate.

## Target Threshold

From the Bitcoin Technical Glossary:

The target is the threshold below which a block header hash must be in order for the block to be valid, and nBits is the encoded form of the target threshold as it appears in the block header.

As you may have seen in my previous post, a Bitcoin Block Header contains a field `nBits` which is a 32-bit compact encoding which correlates to the 256-bit target threshold. The miner increments `nNonce` to compute the header’s hash, aiming to find a representation that is less than or equal to the target. The calculation is then taken as follows, where the maximum target is roughly `2^224`:

``````targetMax / difficulty = target
``````

Using block `32,256` again as an example, we can see that `nBits` are registered as `0x1d00d86a`. To analyze how this works, let’s derive the target threshold first. In difficulty encoding we take note of two components, the first byte is the exponent (`0x1d`) and remaining three bytes form the mantissa (`0x00d86a`).

``````mantissa * 2**(8*(exponent - 3)) = target
0x00d86a * 2**(8*(0x1d - 3))
= 22791060871177364286867400663010583169263383106957897897309909286912
``````

If we convert the block hash to an integer we can compare it to the threshold:

``````0x000000004f2886a170adb7204cb0c7a824217dd24d11a74423d564c4e0904967
= 8336342430463410544411468431803888761223874031130229104713497856359
``````

As you can see this is clearly less than the target so is a valid entry.