understanding bits and difficulty in a block header

2

1

This block: https://blockchain.info/block/00000000000000000025c089d0a7b2bf6241888c4dd90ab7a4c4baa6a2823551

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?

patrick

Posted 2018-02-28T20:58:36.520

Reputation: 163

Answers

3

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.

Andrew Chow

Posted 2018-02-28T20:58:36.520

Reputation: 40 910

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 2018-02-28T23:29:46.443