Bitcoin has a weired representation for the target encoded into field `nBits`

of each block header

## Definition

The target value is the limit that a miner need to find a lower block hash than in a PoW

## Remarks

- The target is set so that a block is mined roughly every 10 minutes
- The initial target was set as
`00000000ffff0000000000000000000000000000000000000000000000000000`

or`0x1d00ffff`

which can be checked from here

- This original value is the highest a target value can have
- As mining get faster the target adjusts before every 2016th block roughly 2 weeks
- difficulty = original target / target
- Based on the difficulty we can say it is now
`difficulty`

(value) times harder to mine bitcoin - The difficulty value is just a metric which is not used internally on the software
- If the blocks have been mined in less than 10 mins. the difficult increases (target decreases)
- If the blocks have been mined in more than 10 mins. the difficult decreases (target increases)
- Why isn't
`ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`

the maximum target ?

Because it will essentially mean that every hash is lower than this value, very large number

## Representation

The target is packed a custom floating point type with limited precision **Mantissa Exponent** number

The first 2 hex digits are the coefficients and the following 6 hex digits are the exponent

## Formula

Assuming the packed target is `0x1b0404cb`

then the hexadecimal target can be derived as

`target = coefficient * 2**(8*(exponent-3))`

`target = 0x0404cb * 2**(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000`

## Storage

Each block stores the packed target into the block header `nBits`

field for the actual hexadecimal target