2

The bitcoin wiki describes difficulty target representation as follows:

How is difficulty stored in blocks? Each block stores a packed representation (called "Bits") for its actual hexadecimal target. The target can be derived from it via a predefined formula. For example, if the packed target in the block is 0x1b0404cb, the hexadecimal target is

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

Note that the 0x0404cb value is a signed value in this format. The largest legal value for this field is 0x7fffff. To make a larger value you must shift it down one full byte. Also 0x008000 is the smallest positive valid value.

Why 0x008000 is the smallest positive valid value?

hello.wjx
  • 121
  • 2

1 Answers1

2

To explain that, let's look at the code that unpacks the compact format into a 256 bit int.

arith_uint256& arith_uint256::SetCompact(uint32_t nCompact, bool* pfNegative, bool* pfOverflow)
{
    int nSize = nCompact >> 24;
    uint32_t nWord = nCompact & 0x007fffff;
    if (nSize <= 3) {
        nWord >>= 8 * (3 - nSize);
        *this = nWord;
    } else {
        *this = nWord;
        *this <<= 8 * (nSize - 3);
    }
    if (pfNegative)
        *pfNegative = nWord != 0 && (nCompact & 0x00800000) != 0;
    if (pfOverflow)
        *pfOverflow = nWord != 0 && ((nSize > 34) ||
                                     (nWord > 0xff && nSize > 33) ||
                                     (nWord > 0xffff && nSize > 32));
    return *this;
}

The first 8 bits here are the exponent. The next bit is a sign bit, with 1 being negative. The next 23 bits are the mantissa.

So, 0x00800000 is equal to 0x00000000.

Nick ODell
  • 29,396
  • 11
  • 72
  • 130
  • Yes 0x00800000 is equal to 0x00000000, but I think the wiki is referring to the part after the Bits removed the first byte, and it says 0x008000 instead of 0x800000 is the smallest positive valid value. – hello.wjx Sep 22 '16 at 12:03
  • 0x008000 is also equal to zero, because it is right shifted three times. For that matter, 0x01008000 would equal zero too. – Nick ODell Sep 22 '16 at 17:57
  • Then 0x007000, 0x006000 ... all equal to zero, and all are smaller than 0x008000 – hello.wjx Sep 23 '16 at 15:08