Schwierigkeit in Mining
Die Schwierigkeit ist ein Wert, der zeigt, wie schwer es ist, einen Hash zu finden, der niedriger ist als das vom System definierte Ziel.
Das Bitcoin-Netzwerk hat eine globale Block – Schwierigkeit. Gültige Blöcke müssen einen Hash unter diesem Ziel haben. Mining-Pools haben auch einen Pool-spezifischen Aktienschwierigkeit, eine untere Grenze für Aktien zu setzen.
Inhaltsverzeichnis
Bitcoin Mining-Schwierigkeit
Im Bitcoin-Netzwerk gibt es eine globale Sammlung von Schwierigkeiten für alle Blöcke. Damit ein Block als legitim angesehen werden kann, muss der Hash-Wert niedriger als das festgelegte Ziel sein. Die Schwierigkeit wird alle 2016 Blöcke geändert. Dies wird mit folgender Formel berechnet:
Schwierigkeit = Schwierigkeit_1_Ziel / aktuelles_Ziel
wo Ziel eine 256-Bit-Nummer ist.
Schwierigkeit_1_Ziel kann verschiedene Werte annehmen. Traditionell ist es eine Hash-Funktion, deren erste 32 Bits gleich 0 sind, während alle anderen 1 sind (es wird auch als pdiff oder pool-Schwierigkeit bezeichnet). Bitcoin-Protokoll bietet Ziel als einen Typ mit Fließkomma und eingeschränkter Genauigkeit. Verschiedene Bitcoin-Clients bestimmen oft die Schwierigkeit basierend auf diesen Daten.
Speicherungsschwierigkeit in Blöcken
Jeder Block enthält eine gepackte Version (genannt “Bits”) eines hexadezimalen Ziels.
Das folgende Formelziel kann von jedem Block erhalten werden. Wenn beispielsweise ein in einem Block gepacktes Ziel als 0x1b0404cb angezeigt wird, sieht seine hexadezimale Version folgendermaßen aus:
0x0404cb * 2 ** (8 * (0x1b - 3)) = 0x00000000000404CB00000000000000000000000000000000000000000000000000
Der maximale Wert für dieses Feld ist 0x7fffff, während der minimale Wert 0x008000 ist.
Das maximal mögliche Ziel (mit der Schwierigkeit gleich 1) ist definiert als 0x1d00ffff, das in hexadezimaler Nummerierung erscheint, wie folgt:
0x00ffff * 2 ** (8 * (0x1d - 3)) = 0x00000000FFFF000000000000000000000000000000000000000000000000000000
Weiter ist eine einfache Art der Schwierigkeitsberechnung. Es verwendet eine veränderte Version der Taylor-Reihe zum Logarithmus und stützt sich auf Logs, um die Schwierigkeitsberechnung zu transformieren.
#include <Iostream> #include <cmath> inline float fast_log(float val) { int * const exp_ptr = reinterpret_cast <int *>(&val); int x = *exp_ptr; const int log_2 = ((x >> 23) & 255) - 128; x &= ~(255 << 23); x += 127 << 23; *exp_ptr = x; val = ((-1.0f/3) * val + 2) * val - 2.0f/3; return ((val + log_2) * 0.69314718f); } float difficulty(unsigned int bits) { static double max_body = fast_log(0x00ffff), scaland = fast_log(256); return exp(max_body - fast_log(bits & 0x00ffffff) + scaland * (0x1d - ((bits & 0xff000000) >> 24))); } int main() { std::cout << difficulty(0x1b0404cb) << std::endl; return 0; }
Maximale, aktuelle und minimale Schwierigkeit
Der aktuelle Schwierigkeitsgrad kann mit der Bitcoin-Befehlszeile getDifficulty ermittelt werden.
Aufgrund der Zielfunktion, die keinen Minimalwert hat, kann die maximale Schwierigkeit nur ungefähr wie folgt berechnet werden: maximales_ Ziel / 1 (da 0 die Gleichung zum unendlichen Größe führen würde), was eine unbegreifliche Zahl ist (~ 2 bis 224).
Mindestschwierigkeit ist gleich 1.
Schwierigkeit ändert sich
Die Schwierigkeit wird alle 2016 Blöcke basierend auf der Zeit geändert, die es dauerte, um 2016 vorherige Blöcke zu entdecken. Wenn alle 10 Minuten ein Block gefunden wird (wie er ursprünglich für eine gleichmäßige Emission vorgesehen war), wird das Auffinden von 2016 Blöcken genau 2 Wochen dauern. Wenn frühere 2016 Blöcke in mehr als zwei Wochen gefunden wurden, wird die Schwierigkeit verringert, und wenn sie schneller abgebaut wurden, dann wird die Schwierigkeit erhöht. Je mehr (oder weniger) Zeit damit verbracht wurde, die vorherigen 2016 Blöcke zu finden, desto mehr wird die Schwierigkeit verringert (erhöht).
Um einen Block zu hacken muss der Hash niedriger als Ziel (Proof-of-Work) sein. Hash ist eine Zufallszahl zwischen 0 und 2 * 256-1.
Verschiebung für Schwierigkeit von 1: 0xffff * 2 ** 208 Für Schwierigkeit D: (0xffff * 2 ** 208) / D Anzahl der Hash-Funktionen, die für einen zu lösenden Block bei Schwierigkeit D benötigt werden: D * 2 ** 256 / (0xffff * 2 ** 208) Oder einfach: D * 2 ** 48 / 0xffff
Die Schwierigkeit ist so eingestellt, als ob wir die vorherigen 2016 Blöcke mit der Geschwindigkeit von einem Block pro 10 Minuten gefunden hätten
Demnach berechneten wir (D * 2 ** 48 / 0xffff) alle 600 Sekunden. Die Hashrate unseres Netzwerks für die vorherigen 2016 Blöcke war: D * 2 ** 32 / 0xffff / 600. Ohne signifikanten Genauigkeitsverlust können wir es auf: D * 2 ** 32/600 vereinfachen. Bei einer Schwierigkeit von 1 ist es ungefähr 7 Mhash / s.
Die durchschnittliche Zeit, um einen einzelnen Block zu finden, kann mit dieser Formel berechnet werden: Zeit = Schwierigkeitsgrad * 2 ** 32 / Hashrate, wobei “Schwierigkeit” der aktuelle Schwierigkeitsgrad des Bitcoin-Netzwerks ist und “Hashrate” die Anzahl der Hashes ist, die ein Miner pro Sekunde findet.
Was ist die aktuelle Schwierigkeit?
Current difficulty, wie von Bitcoins GetDifficulty ausgegeben wird.
Was ist die maximale Schwierigkeit?
Es gibt kein minimales Ziel. Die maximale Schwierigkeit ist ungefähr: maximales_Ziel / 1 (da 0 in Unendlichkeit resultieren würde), was eine lächerlich große Zahl ist (ungefähr 2 ^ 224).
Die tatsächliche maximale Schwierigkeit ist, wenn derzeitiges_Ziel = 0, aber wir könnten nicht die Schwierigkeit berechnen, wenn das passiert wäre. (Zum Glück wird es nie, also sind wir in Ordnung.)
Kann die Netzwerkschwierigkeit nachlassen?
Ja, sie kann.
Was ist die minimale Schwierigkeit?
Die minimale Schwierigkeit, wenn das Ziel auf dem maximal zulässigen Wert ist, ist 1.
Welche Netzwerk-Hash-Rate führt zu einem bestimmten Schwierigkeitsgrad?
Der Schwierigkeitsgrad wird alle 2016 Blöcke basierend auf dem Zeit angepasst, um die vorherigen 2016 Blöcke zu finden. Bei der gewünschten Rate von einem Block, die 10 Minuten beträgt, würden 2016 Blöcke genau zwei Wochen dauern, damit man sie finden kann. Wenn die vorherigen 2016 Blöcke mehr als zwei Wochen brauchten, wird die Schwierigkeit reduziert. Wenn sie weniger als zwei Wochen brauchten, wird die Schwierigkeit erhöht. Die Änderung im Schwierigkeitsgrad ist proportional zu der Zeit, die mehr oder weniger von zwei Wochen vergangen ist, um die vorherigen Blöcke zu finden.
Um einen Block zu finden, muss der Hash kleiner als das Ziel sein. Der Hash ist effektiv eine Zufallszahl zwischen 0 und 2 ** 256-1. Der Offset für Schwierigkeit 1 ist
0xffff * 2 ** 208
und für Schwierigkeit D ist
(0xffff * 2 ** 208) / D
Die erwartete Anzahl von Hashes, die wir berechnen müssen, um einen Bitcoin-Block mit Schwierigkeit D zu finden, ist daher
D * 2 ** 256 / (0xffff * 2 ** 208)
oder nur
D * 2 ** 48 / 0xffff
Die Schwierigkeit ist so festgelegt, dass die vorherigen 2016 Blöcke alle 10 Minuten in einer Rate von 1 gefunden wurden. Daher berechneten wir (D * 2 ** 48 / 0xffff) Hashes in 600 Sekunden. Das bedeutet, dass die Hash-Rate des Netzwerks war
D * 2 ** 48 / 0xffff / 600
über die vorherigen 2016 Blöcke. Ohne viel Genauigkeitsverlust kann Es weiter vereinfacht werden
D * 2 ** 32/600.
Bei Schwierigkeit 1 ist es 7 Mhash pro Sekunde.
Zum Zeitpunkt des Schreibens ist der Schwierigkeitsgrad 22012.4941572, was bedeutet, dass im Vergleich zu den vorherigen 2016 Blöcken die durchschnittliche Netzwerkhashrate 22012.4941572 * 2 ** 32/600 = ca. 157 Ghashs pro Sekunde gefunden wurde.
Wie schnell könnte ich einen Block generieren?
(Die eternal question.)
Die durchschnittliche Zeit, um einen Block zu finden, kann angenähert werden, indem man berechnet:
Zeit = Schwierigkeit * 2 ** 32 / Hashrate
Wo Schwierigkeit die aktuelle Schwierigkeit ist, die Hashrate die Anzahl der Hashes ist, die Ihr Miner pro Sekunde berechnet, und die Zeit der Durchschnitt in Sekunden zwischen den Blöcken, die Sie finden, ist.
Zum Beispiel berechnen wir mit Python die durchschnittliche Zeit für die Generierung eines Blocks mit einem 1Ghash / s-Mining-Rig, wenn der Schwierigkeitsgrad 20000 beträgt:
$ python -c "print 20000 * 2 ** 32/10 ** 9/60 / 60.0" 23.85
und finden, dass es im Durchschnitt knapp 24 Stunden dauert.