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
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.
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
targetMax / difficulty = target
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 (
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.