Wir werden hier etwas tiefer in die Materie eindringen. Deshalb ist es wichtig, dass du bereits die Grundlagen zu Proof-of-Work verstanden hast bzw. weißt was eine Hashing- oder Einwegfunktion ist. Die Difficulty gibt die Schwierigkeit an einen Block zu finden. Bitcoin benutzt den SHA-256 Hashing-Algorithmus. Die Ausgabe dieses Algorithmus umfasst 2256 mögliche Hashs, von denen für jeden Block nur eine gewisse Menge gültig ist. Die gültige Menge wird alle 2016 Blöcke so angepasst, dass das Netzwerk im Schnitt alle zehn Minuten einen Block findet.
Grundlagen
Um die Bitcoin Difficulty und die Einträge im Blockheader zu verstehen, machen wir einen kleinen Abstecher in die Mathematik, nämlich die Zahlensysteme. Sollte dir bereits geläufig sein was das Binärsystem bzw. das Hexadezimalsystem ist, überspringe den Teil einfach.
Für die uns geläufige Darstellung von Zahlen (Dezimalsystem) benutzen wir ein Zahlensystem mit 10 verschiedenen Zeichen (0-9). Die Anzahl der Zeichen eines Zahlensystems nennt man auch Basis. Bei der Erhöhung der Zahl um 1 wird das Zeichen ganz rechts erhöht. Kommt es nach dem Erreichen des höchstwertigen Zeichens zu einem Überlauf, wird das Zeichen an entsprechender Stelle wieder auf null gesetzt und das links angrenzende um eins erhöht und so weiter.
In der Informatik rechnet man mit zwei Zuständen, die mit Strom an und Strom aus dargestellt werden. Wenn man das auf ein Zahlensystem überträgt, gibt es nur zwei Zeichen (0-1). Die Darstellungsregeln dieses, als Binärsystem bezeichneten, Zahlensystems sind dieselben wie bei dem Dezimalsystem. Ein Byte entspricht einer 8 Stelligen Binärzahl bzw. einer Zahl mit 8 Bits. Mit 8 Bit lassen sich 28 = 256 verschiedene Zahlen oder Zustände darstellen und damit alle Schriftzeichen kodieren. Deshalb die Zusammenfassung von 8 Bits zu einem Byte.
Da das Binärsystem zur Darstellung von Zahlen sehr viel Platz braucht (je weniger Zeichen, desto mehr Stellen) benutzt man zur Veranschaulichung meist Zahlensysteme, die die binären Zahlen kompakter auszudrücken vermögen. Diese müssen idealerweise als Basis ein Vielfaches von 2 haben, also 2x. Das Hexadezimalsystem hat die Basis 16 (0-F). Nach der 9 kommen die Buchstaben A-F. So ist die Dezimalzahl 10 Hexadezimal A, 11 ist B und so weiter. Mit einer Stelle im Hexadezimalsystem lassen sich genau alle Zustände von 4 Bits darstellen.
8 Bits oder ein Byte kann man mit zwei Stellen des Hexadezimalsystems abbilden. So ist dezimal 255 hexadezimal FF und binär 11111111.
Die gültigen Hashes
Im Blockheader gibt es ein vier Byte großes Feld mit dem Namen Bits. Dieses Feld beschreibt den Zielhash. Das heißt ein Hash ist dann gültig, wenn er kleiner ist als die Zahl in diesem Feld.
Der Zielhash hat ein spezielles Format, um ihn kompakt auszudrücken, und zwar beschreibt das erste Byte die Länge der Zahl in Bytes und die 3 folgenden Bytes die ersten Stellen der Zahl. Wir wissen die gesamte Zahl ist 32 Bytes lang, da SHA-256 256 Bits Länge hat, was 256/8= 32 Bytes entspricht. Die Stellen davor werden mit Nullen gefüllt. Wir schauen uns zur Veranschaulichung den ersten Block von Bitcoin an:
Rot eingerahmt steht die Zahl Bits in Dezimalform. Diese rechnen wir mit dem Rechner in Hexadezimal um:
Heraus kommt 1D 00 FF FF. Wir sehen das erste Byte hat den Hexadezimalwert 1D, was dezimal 29 bedeutet. Also ist die Zahl 29 Bytes lang, was den 256 Bit langen Zielhash wie folgt definiert (Hexadezimal):
00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Die drei fehlenden Bytes vorne sind Nullen.
Der Blockhash (gelb eingerahmt) des ersten Blockes ist kleiner als der Zielhash und damit gültig.
Im grün eingerahmten Feld steht die Difficulty (Schwierigkeit). Sie ist beim ersten Block 1. Die Bits-Zahl im ersten Block ist somit mit Difficulty 1 definiert worden. Eine kleinere Difficulty ist im Protokoll nicht vorgesehen.
Die Anpassung der Difficulty bei Bitcoin
Ziel des Protokolls ist es, dass die Difficulty so gewählt wird, dass in 14 Tagen 2.016 Blöcke generiert werden, also alle 10 Minuten ein Block. Wenn es z. B. 10 Tage gedauert hat, um die 2.016 Blöcke zu erzeugen, wird der Zielhash (Feld Bits) mit dem Wert 10/14 multipliziert und die Difficulty mit dem Kehrwert. Denn je kleiner der Zielhash ist, desto weniger gültige Hashs gibt es, desto länger muss danach gesucht werden, desto höher ist die Difficulty. Die Nodes können dies dann jederzeit verifizieren und ggf. Blöcke mit ungültigen Berechnungen bzw. Einträgen verwerfen. Die Difficulty von 1 ist das Minimum. Ist die Difficulty bei 1 und es braucht z. B. einen Monat für die 2.016 Blöcke, ändert sie sich nicht.
Theoretisch müsste nach 2.016 Blöcken die Zeitdifferenz zwischen dem Zeitstempel des Blockes der letzten Anpassung und dem des Aktuellen für die Berechnung der Difficulty hergenommen werden. Bei der Implementierung gab es allerdings einen Fehler, der bis heute nicht ausgebessert wurde. Die Difficultyanpassung findet zwar alle 2.016 Blöcke statt aber es wird geschaut, wie viel Zeit seit dem Block der letzten Anpassung und dem 2.015-ten Block danach (also dem vor der Anpassung) verstrichen ist. Somit fehlen eigentlich durchschnittlich 10 Minuten auf 14 Tage, was am Ende jedoch vernachlässigbar ist.
Wenn der Zeitstempel eines Blockes mehr als 2 Stunden in der Zukunft liegt oder kleiner ist als der Median der Zeitstempel der letzten 11 Blöcke, wird er vom Netzwerk nicht akzeptiert. So wird Manipulation der Difficulty verhindert, der Miner verliert seine Blockbelohnung, falls er einen ungenauen Eintrag macht.
Beim Start von Bitcoin blieb die Difficulty bis Block 32.256 (30.12.2009) bei 1. Die Blöcke zwischen 30.240 und 32.255 sind in rund 11,8354 Tagen produziert worden. Der Zielhash hat sich zu dezimal 486.594.666 geändert, was Hexadezimal 1D 00 D8 6A (~FF FF *11,8354/14) entspricht und die Difficulty hat sich auf 1,18 (~14/11,8354) erhöht.
Die Difficulty heute
Im Laufe der Zeit hat sich die Difficulty drastisch erhöht. Schauen wir uns Block 586.540 an, der am 22.07.2019 gemined wurde. Zielhash in Kompaktform ist dezimal 387.911.067, was Hexadezimal 17 1F 0D 9B entspricht. Hexadezimal 17 = dezimal 23. Der Zielhash hat neun führende Nullen, da die Zahl 23 Bytes lang ist. Ausgeschrieben in Hexadezimal: 00 00 00 00 00 00 00 00 00 1F 0D 9B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00.
Rechnen wir um, um wie viel sich die Difficulty seit dem ersten Block erhöht hat. Dazu berechnen wir die Dezimalzahl des Zielhashs vom ersten Block: Hexadezimal FFFF gefolgt von 26 Bytes (jedes Byte bildet 256 Zahlen ab) = dezimal 65.535*25626. Wir berechnen die Dezimalzahl des Zielhashs des Blocks Nr. 586.540: Hexadezimal 1F0D9B gefolgt von 20 Bytes = dezimal 2.035.099*25620. Nun teilen wir den Zielhash des ersten Blocks durch den Zielhash des aktuellen Blocks: 65.535*25626/2.035.099*25620= 65.535 *2566 /2.035.099= 9.064.159.826.491,41. Die Difficulty hat sich seit dem ersten Block also mehr als ver-9-billionenfacht, was auch im Feld Difficulty (Schwierigkeit) steht.