Wie wird der Schwierigkeitsgrad berechnet?

Kann mir jemand im Klartext erklären, wie die Schwierigkeit berechnet wird. Ich habe ein sehr ungefähres Verständnis dafür, dass es basierend auf der Menge an Hash-Leistung in der gesamten Bitcoin-Community über einen bestimmten Zeitraum berechnet wird. Aber das ist sehr vage.

Ich verstehe auch, dass es sich sehr schnell ändern kann. Kann es nur zunehmen? Gibt es eine Formel, wie man sie berechnet oder vorhersagt?

Vielen Dank für eine ausführliche Antwort, Meni Rosenfeld. Nur um sicherzugehen, dass ich alles richtig gemacht habe. Ich fasse die ganze Zeit zusammen, es hat gedauert, um die letzten 2016-Blöcke zu generieren. Und dann wenden Sie die Formel an.

Kommentare

  • Ich denke, Folgefragen sind besser als Kommentare zur Antwort. Grundsätzlich ja, aber es wird keine Summierung benötigt – Sie können einfach die Zeitstempel des letzten Blocks und des einen 2016-Blocks zuvor nehmen und subtrahieren.

Antwort

Die Bitcoin-Schwierigkeit begann bei 1 (und kann diese nie unterschreiten). Dann werden für jeden gefundenen 2016-Block die Zeitstempel der Blöcke verglichen, um herauszufinden, wie viel Zeit für das Auffinden von 2016-Blöcken benötigt wurde. Nennen Sie es T. Wir möchten, dass 2016-Blöcke 2 Wochen dauern. Wenn T also anders ist, multiplizieren wir die Schwierigkeit um (2 Wochen / T) – auf diese Weise dauert es jetzt 2 Wochen, um die 2016-Blöcke zu finden, wenn die Hashrate so bleibt, wie sie war.

Wenn es beispielsweise nur 10 Tage gedauert hat bedeutet, dass der Schwierigkeitsgrad zu gering ist und daher um 40% erhöht wird.

Der Schwierigkeitsgrad kann sich erhöhen oder verringern, je nachdem, ob das Auffinden von 2016-Blöcken weniger oder mehr als 2 Wochen gedauert hat. Im Allgemeinen nimmt die Schwierigkeit ab, nachdem die Netzwerk-Hash-Rate gesunken ist.

Wenn der Korrekturfaktor größer als 4 (oder kleiner als 1/4) ist, werden stattdessen 4 oder 1/4 verwendet, um die Änderung zu verhindern zu abrupt sein.

Es gibt einen Fehler in der Implementierung, aufgrund dessen die Berechnung auf der Zeit basiert, um die letzten 2015-Blöcke zu finden, anstatt auf 2016. Das Reparieren würde eine harte Gabel erfordern und ist daher vorerst verschoben.

Es ist möglich, eine grobe Schätzung für die nächste Schwierigkeitsänderung basierend auf der Zeit zum Auffinden der letzten Blöcke abzugeben. Niemand kann längerfristig zuverlässig Vorhersagen für die zukünftigen Schwierigkeiten treffen, aber jeder kann auf der Grundlage von Wechselkurstrends, Moores Gesetz und anderen Hardware-Fortschritten spekulieren.

Kommentare

  • @StevenRoose: AFAIK ist es, aber ich überlasse es Leuten, die mehr mit dem Kerncode zu tun haben, Kommentare abzugeben … Dies ist für eine separate SE-Frage ausreichend.
  • Gute Antwort, aber ein kleiner, aber großer Punkt entgeht: Wie stimmen die Knoten im Netzwerk über die Schwierigkeit überein?
  • @deadalnix: Die Schwierigkeit eines Blocks ist eine deterministische Berechnung, die auf den Daten basiert Alle Knoten führen unabhängig voneinander dieselbe Berechnung durch und erhalten dasselbe Ergebnis.
  • @deadalnix: Der Zeitstempel ist Teil des Blocks. Dies bedeutet, dass derjenige, der den Block gefunden hat, entscheidet, was in ihn eingefügt werden soll Der Zeitstempel darf nicht früher als der Median der letzten 11 Blöcke sein. Wenn ein Knoten in Zukunft einen Block mit einem Zeitstempel von mehr als 2 Stunden empfängt, wird er erneut angezeigt ject es und nicht verbreiten.
  • @tobi: Oh ok. Frühere Kommentare betrafen den Fehler, und “ -Fehler “ deuteten darauf hin, dass es sich um ‚ handelt Fehler, also nahm ich an, dass wir ‚ darüber sprechen. Also ja. Wenn wir davon ausgehen, dass um 2140 die Hashrate bei * 1B liegt, wie sie jetzt ist, wird der Zeitplan um 96 Wochen oder fast zwei Jahre vor uns liegen. Aber es gibt noch einen weiteren Effekt – eine Verzögerung, die durch die Tatsache verursacht wird, dass die Schwierigkeit am Anfang 1 war, obwohl die Hashrate nicht ‚ nicht ausreichte, um dies zu rechtfertigen.

Antwort

Menis Antwort ist gut. Ich möchte nur eine praktische Detailmethode zur Schwierigkeitsberechnung geben, die vielleicht für die Zukunft hilfreich ist Ansichten der Antwort dieser Frage.

Schauen wir uns Satoshis Genesis-Block-Header an (Teil der zugehörigen Informationen):

$ bitcoin-cli getblockhash 0 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f $ bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f { ... "height": 0, ... "bits": "1d00ffff", "difficulty": 1, ... } 

Wie wir oben sehen können, hat der Genesis-Block eine „1“ -Schwierigkeit und „1d00ffff“ -Bits. Das Bitcoin-Bit bedeutet den „Ziel“ -Hashwert. Der neu generierte Block muss eine Bedingung erfüllen: Der doppelte SHA-256-Hashwert des Blockheaders muss kleiner als dieser sein „Ziel“ -Wert.

Der „1d00ffff“ -Bitwert im Genesis-Block bedeutet den „Ziel“ -Wert:

[0x00000000,0xffff,{0x00..0x00}] {0x00..0x00} at above has 26 bytes 0x00. 

Dann zu Wenn Sie einen neuen Block suchen, müssen Sie diesen 32-Bit-nNonce-Wert (und nTimes und auch den HashMerkleRoot) durchsuchen, bis der Block-Hash-Wert 4 Bytes Null vor sich hat.Übrigens ist nNonce eines der Felder in der Blockheader-Struktur:

 struct header_structure{ // BYTES NAME uint32_t nVersion; // 4 version uint8_t hashPrevBlock[32]; // 32 previous block header hash uint8_t hashMerkleRoot[32]; // 32 merkle root hash uint32_t nTime; // 4 time uint32_t nBits; // 4 target uint32_t nNonce; // 4 nonce }; 

Weil SHA-256-Algorithmus (sowie jeder kryptografisch sichere Hash-Algorithmus) erzeugt eine Ausgabe, die wie eine einheitlich zufällige Sequenz erscheint. Die praktische „Versuch und Irrtum“ -Methode ist die einzige Möglichkeit, einen neuen Block zu finden, der die Bedingung erfüllt. Die Wahrscheinlichkeit, einen Block mit dem führenden 4-Byte-Null-Hash-Wert zu finden, beträgt 1 / (2 ^ 32), was bedeutet, dass die durchschnittlichen „Versuch und Irrtum“ -Zahlen genau 2 ^ 32 (dh 4G) sind.

Für ein leicht verständliches Verständnis dieses „Ziel“ -Hashwerts definieren wir den Begriff „Schwierigkeit“, dh die durchschnittlichen „Versuch und Irrtum“ -Zahlen, um einen Block zu finden, der die „Ziel“ -Bedingung erfüllt. Und wir definieren die „Schwierigkeitsgrad“ -Einheit: 1 „Schwierigkeitsgrad“ = 4G-Hashes

Dann, bis heute, erreicht die Bitcoin-Blockchain-Höhe 501509, werfen wir einen Blick auf den Header:

$ bitcoin-cli getblockheader 0000000000000000006c5532f4fd9ee03e07f94df165c556b89c495e97680147 { ... "height": 501509, ... "bits": "18009645", "difficulty": 1873105475221.611, ... } 

Die Bits des Blocks 501509 = 0x18009645, es ist das kompakte Format einer 256-Bit-Ganzzahl, sein 256-Bit-Format ist:

[0x00000000,0x00000000,0x009645,{0x00..0x00}] {0x00..0x00} at above has 21 bytes 0x00. that is 0x009645 * (256 ^ 21) The genesis block"s target is ( 0x00ffff * 256 ^ 26 )which is the difficulty unit "1.0". So, the difficulty = (0x00ffff * 256 ^ 26)/ (0x009645 * 256 ^ 21) = 65535/38469 * (256^5) = 1.703579505575918 * 2^40 = 1873105475221.611 

Bisher haben Sie alle Details zur Berechnung der“ Schwierigkeit „. In einigen Fällen verwenden wir auch das einfache Format 1.7T um die Schwierigkeit zu sagen, im obigen Beispiel:

 (1.703579505575918 * 2^40) = 1.703579505575918T 1T = 2^40 = 1024^4 

Kommentare

  • 1d ist 29 im Dezember (nicht 26). SHS ist SHA
  • danke @BorisIvanov, der Tippfehler SHS wurde behoben 1d bedeutet in der Tat 26 Bytes Null-Schwanz statt 29, lesen Sie bitte das oben gezeigte Beispieldetail.
  • ah yeah. Signifikant und

Antwort

Ich möchte meine 2 geben Cent hier, indem die Beziehung zwischen der Wahrscheinlichkeit des Abbaus eines Blocks bei gegebenem aktuellen Ziel t und der entsprechenden Schwierigkeit d bei der Berechnung erläutert wird im Bitcoin-Kern.

Kryptografische Hash-Funktionen werden also durch die zufällige Orakel-Abstraktion idealisiert [ https://en.wikipedia.org/wiki/Random_oracle] . Wir können daher die Ausgabe der Hash-Funktion doubleSHA256 modellieren, die in PoW als einheitliche Variable im Raum {0,1}^256 verwendet wird, dh Arrays mit 256 Bit . Somit ist die Wahrscheinlichkeit, dass ein einzelner Hash h ein gültiger Hash ist:

p = P(h < t) = t /( 2^{256} - 1 ) 

Andererseits d wird wie folgt berechnet, genau wie @gary zuvor erklärt und nur in Dezimalzahlen umgewandelt wurde:

d = ( (2^{16} - 1) * 2^{8*26} ) / t = ( (2^{16} -1) * 2^{208} ) / t 

Die Implementierung befindet sich in [ https://github.com/bitcoin/bitcoin/blob/master/src/rpc/blockchain.cpp] , Zeile 60, Funktion GetDifficulty. Wenn jemand erklären kann, wie genau der Code der obigen Formel entspricht, wäre das hilfreich. Wenn wir diese beiden Formeln kombinieren, erhalten wir:

d = ( (2^{16} -1) * 2^{208} ) / ( p * (2^{256} - 1) ) ~ 2^{-32} / p 

Bei der Analyse dieses letzten Ausdrucks ist die Schwierigkeit das Verhältnis zwischen der Wahrscheinlichkeit, einen Hash zu erhalten, der niedriger als (dies ist die niedrigste Dezimalzahl mit einer binären Darstellung unter Verwendung von 256 Bit, beginnend mit 32 Nullbits) und der Wahrscheinlichkeit, einen gültigen Hash basierend auf dem aktuellen Ziel zu erhalten t. Dies ist eine direkte Implikation der Definition im Genesis-Block als Schwierigkeit 1 diejenige, die dem hexadezimalen Ziel 0x1d00ffff , ausgedrückt in der meiner Meinung nach 32-Bit-Kompaktform für 256-Bit-Zahlen.

A. Ich glaube, eine schöne Frage ist, warum diese spezielle kompakte Form für die Darstellung des Ziels ausgewählt wurde.

Kommentare

  • Upvoted! Die kompakte Form liefert 3 höchstwertige Bytes für das Ziel, in der Min-Schwierigkeit sind die 3 höchstwertigen Bytes 00ffff.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.