Was ist proofOfWorkLimit?

Sehen Sie sich den folgenden Code aus der Android-Bitcoin-Brieftasche an:

proofOfWorkLimit = Utils.decodeCompactBits(0x1d00ffffL);

Und schauen Sie sich den Code von Bitcoin Qt Wallet an:

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

Ich nehme an, dass im zweiten Fall ProofOfWorkLimit 32 "0" und 224 "1" (000000 ... 000111111111 .... 11111111) ist?

Ich habe also keine Ahnung, wie ich den ersten Fall "0x1d00ffffL" aus dem zweiten Fall bekomme? Im Binärformat ist "0x1d00ffffL" 11101000000001111111111111111.

PS Ich habe in uint256.h geschaut. Es war nicht hilfreich.

Antworten (1)

Das erste Byte, 1D, ist die Länge. Die nächsten drei Bytes sind die High-Bytes des Hashs. Wir haben also 00ffff, dann fügen wir ffam Ende Bytes hinzu, um 29 Bytes zu erhalten. Dann sind wir fertig.

Am Ende haben wir 3 Bytes mit führenden Nullen, weil 32-29 3 ist. Und wir erhalten ein Byte mit Nullen aus dem zweiten Byte der kompakten Bits. Das Endergebnis ist also 00,00,00,00,ff,ff,ff...

Danke für die Antwort. Ich bin immer noch verwirrt. Können Sie antworten, wie Sie "first case" von "static CBigNum bnProofOfWorkLimit (~uint256 (0) >> 27);" erhalten? ?
~0 bedeutet alle Bits gesetzt. >> 32bedeutet, die Bits um 32 Bits nach links zu verschieben und an ihrer Stelle Nullen einzufügen.
Danke noch einmal. Entschuldigung für die Beharrlichkeit, aber können Sie beantworten, was genau ich hier einfügen soll "Utils.decodeCompactBits(0x1d00ffffL);" im Fall "~uint256(0) >> 27" ?
Sie wollen 27 Nullbits. Das sind 3 Bytes aller Nullbits, gefolgt von 3 weiteren Nullbits. 00011111ist 1F. Da das Ganze 32 Bytes groß ist und wir 3 Null-Bytes benötigen, beträgt die Länge des Nicht-Null-Segments 29 Bytes, was in Hex 1D ist. Wenn ich also keinen Fehler gemacht habe, bekomme ich 0x1D1FFFFF.