BitcoinVonInnen

Difficulty

Wie Bitcoin den erforderlichen Arbeitsaufwand anpasst, um die Blockzeit stabil zu halten.

Block 955.032Live

Was ist die Difficulty?

Die Difficulty beschreibt, wie schwer es aktuell ist, einen gültigen Proof-of-Work für einen neuen Block zu finden.

Sie bestimmt, wie viel Arbeit Miner durchschnittlich leisten müssen, bevor ein gültiger Block entsteht.

Technisch wird dies über das aktuelle Target festgelegt. Je kleiner das Target, desto weniger gültige Hashes existieren und desto mehr Hashversuche sind erforderlich.

Die Difficulty wird regelmäßig an die weltweite Hashrate angepasst. Dadurch entstehen neue Blöcke langfristig weiterhin mit einer durchschnittlichen Blockzeit von etwa zehn Minuten.

Warum gibt es die Difficulty?

Proof-of-Work koppelt die Entstehung neuer Blöcke an reale Arbeit.

Dadurch entstehen regelmäßige Ordnungsfenster, die dem Netzwerk Zeit geben, Informationen auszutauschen, Transaktionen zu validieren und sich auf einen gemeinsamen Zustand zu synchronisieren. Damit diese Ordnungsfenster ihre Funktion erfüllen können, muss die durchschnittliche Blockzeit langfristig ungefähr konstant bleiben.

Genau dafür existiert die Difficulty. Ohne Difficulty würde die Blockzeit direkt von der weltweiten Hashrate abhängen. Steigt die verfügbare Rechenleistung, würden Blöcke immer schneller gefunden werden. Sinkt die Rechenleistung, würden Blöcke entsprechend langsamer entstehen.

Die Blockzeit würde dadurch ständig schwanken. Die geplante Ausgabe neuer Bitcoins wäre nicht mehr vorhersehbar und die durch Proof-of-Work geschaffenen Ordnungsfenster würden ihre feste zeitliche Struktur verlieren.

Bitcoin passt deshalb die Difficulty regelmäßig an die beobachtete Blockzeit an. Steigt die weltweite Rechenleistung, erhöht das Netzwerk die Difficulty. Sinkt die Rechenleistung, wird die Difficulty reduziert. Dadurch bleibt die durchschnittliche Blockzeit langfristig bei etwa zehn Minuten.

Hashrate und Blockzeit

Mehr Hashrate bedeutet mehr Hashversuche pro Sekunde. Dadurch steigt die Wahrscheinlichkeit, einen gültigen Blockhash zu finden, und neue Blöcke werden im Durchschnitt schneller gefunden. Sinkt die Hashrate, werden entsprechend weniger Hashversuche durchgeführt und die durchschnittliche Blockzeit steigt.

Bitcoin misst jedoch nicht die weltweite Hashrate direkt. Stattdessen beobachtet das Netzwerk, wie schnell die letzten Blöcke tatsächlich gefunden wurden. Liegt die durchschnittliche Blockzeit unter zehn Minuten, erhöht Bitcoin die Difficulty. Liegt sie darüber, wird die Difficulty reduziert.

Die Difficulty reagiert dabei nicht sofort auf Veränderungen der Hashrate. Zwischen zwei Anpassungen bleibt das Target unverändert. Steigt die Hashrate plötzlich an, entstehen daher zunächst schnellere Blöcke. Sinkt die Hashrate, werden Blöcke zunächst langsamer gefunden. Erst bei der nächsten Difficulty-Anpassung wird das Target entsprechend korrigiert.

Warum wird die Difficulty angepasst?

Die Difficulty dient nicht dazu, Bitcoin automatisch sicherer zu machen. Ihre eigentliche Aufgabe besteht darin, die durchschnittliche Blockzeit trotz schwankender Hashrate bei etwa zehn Minuten zu halten.

Block 2.016 · Epoche 0/2016 · Beobachtete Blockzeit 10.0 Min. · Hashrate 1.00× · Difficulty 1.00× · Anpassung in 2016 Blöcken

10 Minuten ZielwertDifficulty Adjustment · 2016 Blöcke
  • Hashrate
  • Beobachtete Blockzeit
  • Difficulty
  • 10 Minuten Zielwert

Orange: Durchschnittliche Blockzeit der letzten 2016 Blöcke. Dieser Wert wird für die Difficulty-Anpassung verwendet und nähert sich langfristig dem Zielwert von 10 Minuten an.

0.45×× weniger Rechenleistung1,0× Referenz2.20×× mehr Rechenleistung

Mehr Hashrate verkürzt die Blockzeit sofort. Die Difficulty folgt erst nach 2016 Blöcken der beobachteten Blockzeit.

Hashrate stabil → beobachtete Blockzeit nahe 10 Minuten → Difficulty bleibt im Gleichgewicht.

Die Difficulty-Anpassung

Bitcoin passt die Difficulty nicht nach jedem Block an.

Stattdessen betrachtet das Netzwerk immer Zeiträume von 2016 Blöcken. Dieser Zeitraum wird als Difficulty-Epoche bezeichnet.

Bei einer Ziel-Blockzeit von zehn Minuten sollten 2016 Blöcke ungefähr dauern:

201610 Minuten=20.160 Minuten=14 Tage2016 \cdot 10\ \text{Minuten} = 20.160\ \text{Minuten} = 14\ \text{Tage}

Nach jedem Block 2016, 4032, 6048 usw. vergleicht Bitcoin die tatsächlich benötigte Zeit mit dieser Sollzeit von 14 Tagen.

Epoche 1Block 02.0152.016 BlöckeNeue Difficultyab Block 2.016Epoche 2Block 2.0164.0312.016 BlöckeNeue Difficultyab Block 4.032Epoche 3Block 4.0326.0472.016 BlöckeNeue Difficultyab Block 6.048Tatsächliche Dauer12 Tage(Beispielwert)12 Tage < 14 TageSollzeit14 Tage(2.016 × 10 Min.)Blöcke wurden zu schnell gefundenDifficulty steigtNeue Difficulty ab Block 6.048

Blöcke wurden zu schnell gefunden

Angenommen, die letzten 2016 Blöcke wurden bereits nach 10 Tagen gefunden.

Dann waren die Miner im Durchschnitt schneller als vorgesehen.

1410=1,4\frac{14}{10} = 1{,}4

Bitcoin erhöht deshalb die Difficulty um den Faktor 1,4.

700=5001,4\text{700} = \text{500} \cdot 1{,}4

Dadurch wird es schwieriger, einen gültigen Blockhash zu finden.

Blöcke wurden zu langsam gefunden

Wurden die letzten 2016 Blöcke stattdessen erst nach 20 Tagen gefunden, ergibt sich:

1420=0,7\frac{14}{20} = 0{,}7

Bitcoin reduziert deshalb die Difficulty auf 70 % des bisherigen Werts.

350=5000,7\text{350} = \text{500} \cdot 0{,}7

Dadurch werden gültige Blockhashes wieder leichter gefunden.

Difficulty und Target

Bitcoin speichert keine Difficulty im Blockheader.

Stattdessen verwendet das Protokoll einen Grenzwert, das sogenannte Target.

Ein Block ist nur gültig, wenn sein Blockhash kleiner oder gleich diesem Target ist.

Je kleiner das Target, desto schwieriger wird es, einen gültigen Blockhash zu finden.

Vereinfachtes Beispiel

Angenommen, Hashes könnten nur Werte zwischen 0 und 999 annehmen.

Großes Target:

Target = 500

Gültig wären dann alle Hashes:

0 bis 500

Also:

501 gültige Werte

Kleines Target:

Target = 100

Gültig wären nur noch:

0 bis 100

Also:

101 gültige Werte

Das kleinere Target macht die Suche deutlich schwieriger, weil weniger gültige Ergebnisse existieren.

Target 500

Viele gültige Hashes

Niedrige Difficulty
 
Target 100

Wenige gültige Hashes

Hohe Difficulty

Zusammenhang zwischen Difficulty und Target

Die Difficulty ist lediglich eine andere Darstellung des Targets.

Difficulty=Max TargetCurrent Target\text{Difficulty} = \frac{\text{Max Target}} {\text{Current Target}}

Deshalb bewegen sich beide Werte immer in entgegengesetzte Richtungen:

Target ↓
Difficulty ↑
 
Target ↑
Difficulty ↓

Reales Beispiel: Block 825.000

Im Header von Block 825.000 steht im Feld Bits (nBits):

0x1703d869

Daraus berechnet jede Node das aktuelle Target:

00000000000000000003d8690000000000000000000000000000000000000000

Die Difficulty ergibt sich anschließend aus dem Verhältnis zwischen dem maximal möglichen Target (Difficulty 1) und dem aktuellen Target:

Difficulty=Max TargetCurrent Target\text{Difficulty} = \frac{\text{Max Target}} {\text{Current Target}}

Für Block 825.000 ergibt sich:

Max Target

Hexadezimal · 256 Bit

00000000ffff0000000000000000000000000000000000000000000000000000

dieselbe 256-Bit-Zahl als Dezimalzahl

26.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.960
Target

Hexadezimal · 256 Bit

00000000000000000003d8690000000000000000000000000000000000000000

dieselbe 256-Bit-Zahl als Dezimalzahl

368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784
Difficulty=26.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.960368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784\text{Difficulty} = \frac{ 26.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.960 }{ 368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784 } =73.197.634.206.448,34= 73.197.634.206.448{,}34

Das entspricht gerundet:

73,20 T73{,}20 \text{ T}
nBits
0x1703d869
 

 
Target
00000000000000000003d8690000000000000000000000000000000000000000
 

 
Difficulty
73.197.634.206.448,34

Warum dieses Max Target?

Die Difficulty wird relativ zu einem festen Referenzwert berechnet:

Difficulty=Max TargetCurrent Target\text{Difficulty} = \frac{\text{Max Target}} {\text{Current Target}}

Doch warum verwendet Bitcoin ausgerechnet dieses Max Target?

00000000ffff0000000000000000000000000000000000000000000000000000

Der Wert stammt direkt aus dem ursprünglichen Bitcoin-Protokoll.

Im Genesis-Block verwendete Satoshi das Feld Bits (nBits) mit dem Wert:

0x1d00ffff

Daraus ergibt sich das Target:

00000000ffff0000000000000000000000000000000000000000000000000000

Dieses Target entsprach der ursprünglichen Schwierigkeit des Netzwerks.

Später wurde genau dieser Wert als Referenz für die Difficulty beibehalten.

Difficulty 1

Wird das aktuelle Target mit diesem ursprünglichen Target verglichen, erhält man:

Max TargetMax Target=1\frac{\text{Max Target}} {\text{Max Target}} = 1

Die Difficulty beträgt dann genau:

11

Deshalb entspricht das Max Target immer einer Difficulty von 1.

Warum kann das Target nicht größer werden?

Ein größeres Target würde mehr gültige Blockhashes erlauben und das Mining weiter vereinfachen.

Bitcoin begrenzt das Target deshalb auf den ursprünglichen Wert aus dem Genesis-Block.

Current Target ≤ Max Target

Kein Block darf ein Target verwenden, das größer als dieses Max Target ist.

Genesis-Block
Difficulty = 1
 

 
Block 825.000
Difficulty = 73.197.634.206.448,34

Die eigentliche Formel

Bisher haben wir die Anpassung über die Difficulty beschrieben.

Tatsächlich arbeitet Bitcoin intern jedoch nicht direkt mit der Difficulty, sondern mit dem Target.

Nach jeder Difficulty-Epoche berechnet Bitcoin zunächst ein neues Target:

Neues Target=Altes TargetTatsa¨chliche ZeitSollzeit\text{Neues Target} = \text{Altes Target} \cdot \frac{\text{Tatsächliche Zeit}} {\text{Sollzeit}}

Für Bitcoin beträgt die Sollzeit einer Difficulty-Epoche immer 14 Tage:

Neues Target=Altes TargetTatsa¨chliche Dauer der letzten 2016 Blo¨cke14 Tage\text{Neues Target} = \text{Altes Target} \cdot \frac{\text{Tatsächliche Dauer der letzten 2016 Blöcke}} {14\ \text{Tage}}

Dadurch ergibt sich unmittelbar:

  • Werden Blöcke schneller gefunden als vorgesehen, sinkt das Target.
  • Werden Blöcke langsamer gefunden als vorgesehen, steigt das Target.
Blöcke zu schnell

Target sinkt

Weniger gültige Blockhashes

Difficulty steigt
Blöcke zu langsam

Target steigt

Mehr gültige Blockhashes

Difficulty sinkt

Die bekannte Difficulty ergibt sich anschließend aus dem Verhältnis zwischen Max Target und aktuellem Target:

Difficulty=Max TargetCurrent Target\text{Difficulty} = \frac{\text{Max Target}} {\text{Current Target}}

Da die Difficulty umgekehrt proportional zum Target ist, folgt daraus:

Neue DifficultyAlte DifficultySollzeitTatsa¨chliche Zeit\text{Neue Difficulty} \approx \text{Alte Difficulty} \cdot \frac{\text{Sollzeit}} {\text{Tatsächliche Zeit}}

Das Näherungszeichen entsteht, weil Bitcoin das neue Target im Feld nBits speichert und dabei Rundungen auftreten können.

Reales Beispiel aus dem Bitcoin-Netzwerk

Betrachten wir die Difficulty-Epoche 410 zwischen Block 824.544 und Block 826.559.

Nach Abschluss dieser 2016 Blöcke berechnet Bitcoin ein neues Target, das ab Block 826.560 gültig wird.

Bitcoin betrachtet dafür nicht jeden einzelnen Block der Epoche, sondern lediglich die Zeitstempel des ersten und letzten Blocks.

Block 824.544 → Timestamp 1704501692
Block 826.559 → Timestamp 1705760375

Die tatsächlich benötigte Zeit beträgt:

17057603751704501692=1.258.683 Sekunden1705760375 - 1704501692 = 1.258.683\ \text{Sekunden}

Die Sollzeit einer Difficulty-Epoche beträgt:

20161060=1.209.600 Sekunden2016 \cdot 10 \cdot 60 = 1.209.600\ \text{Sekunden}

Bitcoin berechnet daraus den Anpassungsfaktor:

1.258.6831.209.6001,040578\frac{1.258.683} {1.209.600} \approx 1{,}040578

Altes Target

Im letzten Block der Epoche steht:

nBits = 0x1703d869

Daraus ergibt sich das Target:

00000000000000000003d8690000000000000000000000000000000000000000

Als Integer:

368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784

Neues Target

Bitcoin berechnet:

Neues Target=Altes Target1.258.6831.209.600\text{Neues Target} = \text{Altes Target} \cdot \frac{1.258.683} {1.209.600} 368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.7841.258.6831.209.600368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784 \cdot \frac{1.258.683} {1.209.600} =383.256.867.544.058.193.088.482.999.888.210.692.783.396.559.046.722.378= 383.256.867.544.058.193.088.482.999.888.210.692.783.396.559.046.722.378

Beim Speichern als nBits rundet Bitcoin den berechneten Wert auf das kompakte Format. Ab Block 826.560 gilt deshalb:

nBits = 0x1704005a

Daraus ergibt sich das Hex-Target:

00000000000000000004005a0000000000000000000000000000000000000000

Difficulty vor der Anpassung

Bitcoin berechnet die Difficulty aus dem Verhältnis von Max Target zu aktuellem Target.

Max Target:

00000000ffff0000000000000000000000000000000000000000000000000000

Als Integer:

26.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.96026.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.960

Alte Difficulty:

26.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.960368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784\frac{ 26.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.960 }{ 368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784 } =73.197.634.206.448,34= 73.197.634.206.448{,}34

Difficulty nach der Anpassung

Neue Difficulty:

26.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.960383.255.420.363.831.995.852.225.088.422.521.761.376.453.814.474.768.384\frac{ 26.959.535.291.011.309.493.156.476.344.723.991.336.010.898.738.574.164.086.137.773.096.960 }{ 383.255.420.363.831.995.852.225.088.422.521.761.376.453.814.474.768.384 } =70.343.519.904.866,81= 70.343.519.904.866{,}81

Die Difficulty sank damit um etwa 3,9 %.

Da das Target größer geworden ist, existieren nun wieder etwas mehr gültige Blockhashes. Dadurch werden neue Blöcke im Durchschnitt leichter gefunden und die Blockzeit bewegt sich langfristig zurück in Richtung des Zielwerts von zehn Minuten.