# understanding bits and difficulty in a block header

Shows difficulty at 3,007,383,866,429.73, and bits at 392009692.

If I want to see how many zeros need to be in the hash, I believe I can just do:

``````(log2(3007383866429.73) + 32) / 4) => 18.362911541451258
``````

Which is correct.. But how does bits come from difficulty? How can I calculate the number of zeros from the bits instead of the difficulty?

## 1 Answer

Contrary to popular belief, Bitcoin's proof of work is not actually based on the number of zeroes. Rather the block hash, when interpreted as a 256 bit integer, must be less than the target value. The target value is what actually determines the difficulty. The target value is represented in a compact form in the `nBits` field of the block header.

The `nBits` field of the block header compresses the target from 256 bits into a 32 bits. A description of the format can be found here.

Basically, the `nBits` field, when represented in Big endian, is split into two parts: the first byte, and the last three bytes. The formula for decompressing the `nBits` field is as follows: `(last three bytes) * 256 ^ ((first byte) - 3)`. This gives you a 256 bit integer that has the first 3 most significant bytes of the target.

• I see.. I am working on a project that depicts bitcoin mining at a high level, and so I want my example data to look as accurate as possible. I am looking for some kind of formula where I can say: given difficulty X, the hash that would solve this should start with Y zeros.. And actually my project has a small amount of screen real estate available, so I'd prefer if I could literally use an extremely low difficulty like "25" for example, and have that (as realistically as possible) equate to a hash with a small-ish number of leading 0s. – patrick Feb 28 '18 at 23:29