Die Schwierigkeit passt sich durch sehr granulare Prozentsätze an das Ziel für 10-Minuten-Blöcke an. Aber das Hinzufügen einer weiteren Null am Ende der Kette von Nullen aus der Header-Hash-Anforderung für einen gültigen Block würde die Schwierigkeit exponentiell erhöhen. Wie also zielt der Algorithmus nur durch die Verwendung von "Nullen" so genau auf die richtige Schwierigkeit?
Die Schwierigkeit wird tatsächlich durch den Zielschwellenwert dargestellt, der im nBits
Wert im Blockheader codiert ist. Wo die Schwierigkeit die menschenlesbare Darstellung darstellt ("wie oft müssen wir versuchen, eine Lösung zu finden"), definiert der Zielschwellenwert das Präfix, das ein Block unterschreiten muss, um gültig zu sein. Dies bedeutet, dass der als Zahl interpretierte 256-Bit-Block-Hash kleiner als der Zielschwellenwert sein muss. Obwohl nBits
es sich nur um einen 4-Byte-Wert handelt, handelt es sich um eine komprimierte Darstellung einer 256-Bit-Zahl (32-Byte). Das erste Byte definiert den Exponenten, die restlichen drei Bytes ergeben eine 24-Bit-Mantisse für das Ziel.
Während dadurch der größte Teil der 32 Bytes im Zielschwellenwert nur noch aus Nullen besteht, kann die Schwierigkeit viel granularer angepasst werden, als nur führende Nullen hinzuzufügen.
David Harding hat die vollständigen Details in Wie wird der Zielabschnitt eines Blockheaders berechnet? .
nBits
ist eine kompakte Codierung des Ziels.Als Ergänzung zur Antwort von @Murch möchte ich ein Beispiel aus Grokking Bitcoin zitieren :
Das Ziel wird in den Blockheader als 4 Bytes geschrieben,
ABCD
; das 32-Byte-Ziel wird alsBCD
× 2^(8*(A-3)) berechnet. Das istBCD
mitA-3
null Bytes danach. Es ist so umständlich, weil wir in der Lage sein müssen, eine breite Palette von Zielen, 1–2^256, mit nur 32 Bit auszudrücken. Das Ziel in Qis Block [ein Zeichen im Buch] wird als geschrieben1c926eb9
, was926eb9
mit 25 Null-Bytes nach (1c–3 = 19
, Hexadezimalcode für 25) bedeutet.
FrownyFrog