4

Look at the code below from android bitcoin wallet:

proofOfWorkLimit = Utils.decodeCompactBits(0x1d00ffffL);

And look at the code from bitcoin qt wallet:

static CBigNum bnProofOfWorkLimit(~uint256(0) >> 32);

I assume that in second case ProofOfWorkLimit is 32 "0" and 224 "1" (000000...000111111111....11111111)?

So I don't have an idea how to get first case "0x1d00ffffL" from second case? In binary "0x1d00ffffL" is 11101000000001111111111111111.

P.S. I have looked in uint256.h. It wasn't helpful.

Murch
  • 71,155
  • 33
  • 180
  • 600

1 Answers1

4

The first byte, 1D, is the length. The next three bytes are the high bytes of the hash. So we have 00ffff, then we add ff bytes onto the end to get to 29 bytes. Then we're done.

We wind up with 3 bytes of leading zeroes because 32-29 is 3. And we get one byte of zeroes from the second byte of the compact bits. So the final result is 00,00,00,00,ff,ff,ff...

David Schwartz
  • 51,308
  • 6
  • 106
  • 177
  • Thanks for reply. I am still confused. Can your answer how to get "first case" from "static CBigNum bnProofOfWorkLimit(~uint256(0) >> 27);" ? – Vitali Grabovski Apr 18 '14 at 09:02
  • ~0 means all bits set. `>> 32` means to shift the bits left by 32 bits, shifting in zeroes in their place. – David Schwartz Apr 18 '14 at 09:16
  • Thanks again. Sorry for insistence but can you answer what exactly should I put here "Utils.decodeCompactBits(0x1d00ffffL);" in case "~uint256(0) >> 27" ? – Vitali Grabovski Apr 18 '14 at 10:35
  • 1
    You want 27 zero bits. That's 3 bytes of all zero bits, followed by 3 more zero bits. `00011111` is `1F`. Since the whole thing is 32 bytes, and we need 3 zero bytes, the length of the non-zero segment is 29 bytes, which in hex is 1D. So unless I made a mistake, I get `0x1D1FFFFF`. – David Schwartz Apr 19 '14 at 20:27