Der Bitcoin-Mining-Algorithmus aus Sicht eines Programmierers '

Diese Seite: Blocks sagte, dass Mining tatsächlich ein mathematisches Problem lösen soll, aber das Lesen des Block-Hashing-Algorithmus hilft nicht viel. Ich habe es auch versucht Das Lesen von Bitcoind-Quellcode, aber das Lesen von Code dauert viel länger als das Lesen von Dokumentation 🙂

Und ich habe einen einfachen json-rpc-Client geschrieben, um die getwork () -Methode aufzurufen, um die „Daten“ abzurufen, aber was sollte Ich mache neben diesen „Daten“?

Jeder könnte den Mining-Prozess in der Sicht des Programmierers erklären?

Kommentare

  • but what should I do next to this "data"? Hier ‚ ist eine kurze Referenzimplementierung. github.com/jgarzik/pyminer/blob/master/pyminer.py
  • Auch explain the mining process in programmer's view ist eine ziemlich breite Frage. Welches spezifische Problem möchten Sie lösen?
  • @NickODell Vielen Dank für Ihren Code! Jetzt verstehe ich, wie man neue Blöcke erstellt. Aber ist jeder eingereichte Block gültig (das Bitcoin-Netzwerk sendet Bitcoin an diese Person)? Ich fand im Bitcoin-Wiki, dass jede Stunde nur 6 Blöcke erstellt werden. Angenommen, 100 Personen erhalten den Blockheader, indem sie gleichzeitig getwork mit derselben Schwierigkeit verwenden. Ich denke, dass diese Personen viel mehr als 6 Blöcke erstellen werden. Habe ich recht?
  • Antwort in der Reihenfolge: Nein. Nein.
  • Mögliches Duplikat von Ich kann die getwork-API

Antwort

Der Mining-Algorithmus lautet wie folgt:

  • Schritt 0 – Ruft den Hash des vorherigen Blocks aus dem Netzwerk ab.

  • Schritt 1 – Sammeln Sie eine Liste potenzieller Transaktionen, die als „Block“ bezeichnet werden. Diese Liste von Transaktionen stammt aus dem Peer-to-Peer-Bitcoin-Netzwerk.

  • Schritt 2 – Berechnen Sie einen Hash für einen Block potenzieller Transaktionen zusammen mit einer Zufallszahl.
  • Schritt 3 – Wenn der Hash den aktuell eingestellten Schwierigkeitsgrad überschreitet, haben Sie diesen Block abgebaut. Wenn nicht, beginnen Sie erneut mit Schritt 1. Alle Ergänzungen der Liste der Transaktionen aus Schritt 1 sowie die Änderung der Zufallszahl aus Schritt 2 bedeuten, dass die Wahrscheinlichkeit besteht, dass das Kriterium in der nächsten Runde erfüllt wird.

Aus Sicht eines Programmierers könnte der Pseudocode ungefähr so aussehen:

 P := The hash of the previously mined block B := A block of transactions H := A hash function D := Difficulty Level 0 Retreive P 1 Construct/Modify B 2 IF H(P, B, Some Random Number) > D END 3 GOTO 1 

Ich sollte Sie warnen, dass es solche gibt ein paar Ungenauigkeiten in dieser Beschreibung, aber zum größten Teil sollte das gut genug sein. Und hier noch ein paar nützliche Erläuterungen:

Was für ein Hash?

Ein Hash ist eine Funktion, die Daten in eine Zahl innerhalb eines bestimmten Bereichs konvertiert. Der Hash hat die Eigenschaft, dass die Kenntnis seiner Ausgabe im Wesentlichen unvorhersehbar ist (innerhalb des angegebenen Bereichs). Die für das Bitcoin-Mining verwendete spezifische Hash-Funktion ist SHA256, das zweimal angewendet wird.

Wie funktioniert der Schwierigkeitsgrad?

Diese unvorhersehbare Natur der Hash-Funktion bedeutet, dass das Eingeben von Zufallsdaten (die Transaktion + die Zufallszahl) im Wesentlichen eine Zufallszahl innerhalb eines bestimmten Bereichs erzeugt. Eine weitere Einschränkung des Bereichs der gewünschten Ausgabe wirkt sich darauf aus, wie wahrscheinlich es ist, dass man sie in einer einzelnen Runde findet. Auf diese Weise können Sie anhand der Häufigkeit, mit der der Algorithmus im Netzwerk ausgeführt werden kann, wahrscheinlich bestimmen, wie oft eine Lösung gefunden wird. Insbesondere wenn Sie den Begriff „Gigahashes“ oder „Terahashes“ hören, bezieht sich dies auf die Häufigkeit, mit der Schritt 3 ausgeführt werden kann. Wenn die Anzahl der Hashes pro Sekunde im gesamten Netzwerk zunimmt, erhöht das Netzwerk automatisch die Schwierigkeit, sodass innerhalb von etwa 10 Minuten eine Lösung gefunden wird.

Was passiert, wenn ein Block abgebaut wird?

Wenn ein Block abgebaut wird, sendet der Miner den Block an alle anderen Miner im Netzwerk als Beweis dafür fand es. Dieser Block enthält eine Liste von Transaktionen, den gefundenen Hash, die spezifische Zufallszahl und einen Verweis auf den vorherigen Hash. Wenn jeder Miner den neu abgebauten Block empfängt, entfernt er alle Transaktionen, die derzeit abgebaut werden und innerhalb des Blocks vorhanden sind (da sie bereits in der Blockkette bestätigt wurden), und sendet den Block an andere Miner, die dasselbe tun Die Weitergabe erfolgt ziemlich schnell.

Hinweis: Der ursprüngliche Bergmann des Blocks erhält eine „Bergarbeiter“ -Gebühr „, eine Belohnung, die aus nicht ausgegebenen Münzen aus Transaktionen besteht, zusätzlich zu einer“ Münzbasis „-Belohnung. Die Belohnung für die Münzbasis begann bei 50 Bitcoins und halbiert sich nach jeweils 210.000 Blöcken (etwa alle 4 Jahre). Die Münzbasisbelohnung wird schließlich so gering, dass sie im Vergleich zu den Gebühren der Bergleute winzig ist.

Kommentare

  • Die Belohnung wird alle 210000 Blöcke halbiert .- > Hab das gerade gesehen und finde es ordentlich: bitcoinclock.com
  • Oh und die Schwierigkeit wird alle 2016-Blöcke angepasst, indem angenommen wird, dass das Netzwerk weiterhin mit der durchschnittlichen Hash-Rate der letzten 2016-Blöcke arbeitet, und die neue Schwierigkeit so eingestellt wird, dass diese Hash-Rate zu einem Blockzyklus von ungefähr 10 Minuten führen würde.
  • Ich könnte mich irren, aber ich glaube, dass der Block auch den Hash des letzten Blocks enthält. Und so werden Blöcke rückwärts verkettet, was zum Begriff Blockchain führt.
  • @Murch, die Schwierigkeit wird tatsächlich für jeden Block angepasst, basierend darauf, wie lange es gedauert hat, den vorherigen Block und zu diesem Zeitpunkt den zu finden Schwierigkeit kann nur steigen. Alle 2016-Blöcke wird der Schwierigkeitsgrad in Bezug auf die letzten 2016-Blöcke angepasst und kann entweder nach oben oder nach unten gehen. Dies schützt vor plötzlichen Leistungsabfällen, die andernfalls dazu führen würden, dass die Zeit zum Auffinden eines Blocks auf mehr als 10 Minuten ansteigt.
  • @ Tarandeep-Gill, dass ‚ s richtig! Der Hash des vorherigen Blocks wird zusammen mit der Liste der Transaktionen gehasht. Dies lässt mich tatsächlich denken, dass meine Erklärung des Hashings etwas unvollständig ist – Die spezifische Hash-Funktion wird nicht zweimal wie angegeben auf SHA256 angewendet, sondern auf verschiedene Teile des Blocks (einschließlich Transaktionen und den Hash des vorherigen Blocks). auf veschiedenen Wegen. Dies ist eine der “ Ungenauigkeiten „, vor denen ich Sie gewarnt habe. Ich frage mich, ob Sie die anderen finden können …

Antwort

Der Zweck der Lösung eines „Puzzles“ besteht darin, (a) den Abbau des Blocks auf durchschnittlich 10 Minuten zu verzögern und (b) reale Kosten für den Abbau eines Blocks zu verursachen (CPU-Stromverbrauch, also Energie). Die Kosten sind da, um einen Sybil-Angriff zu verhindern (indem viele Bergmannsmaschinen eingesetzt werden, um einen 51% igen Angriff auszuführen).

Die Verzögerung wird angewendet, damit sich ein guter Block rund um den Globus auf alle anderen Bergleute ausbreiten kann , ohne dem Bergmann, der gerade den neuen Block geprägt hat, einen Vorsprung zu verschaffen. Dazu muss die Blockzeit (10 Minuten) um Größenordnungen größer sein als die Ausbreitungsverzögerung (einige Sekunden).

Die Art eines Puzzles ist also in gewissem Sinne irrelevant, es könnte auch ein riesiger Sudoku sein.

Antwort

Jeder Hash ist ein gültiger Hash. Die Frage ist, ob Ihr Hash unsere Kriterien erfüllt. Was Sie hashen, sind tatsächlich ein paar Dinge (wir werden darauf zurückkommen), die aneinandergereiht sind und eine Zeichenfolge ergeben, die eine Zeichenfolge einer bestimmten Länge ist. Sie haben dann die gesamte Zeichenfolge gehasht. Stellen Sie sich Ihren resultierenden Hash als Zahl vor. Was wir wollen, ist, dass die resultierende Zahl kleiner als eine Zielzahl ist. Es ist also so, als würde man einen milliardenseitigen Würfel werfen und eine Zahl unter der Zielzahl finden. Diese Zielzahl wird als „Schwierigkeit“ angesehen. Je mehr Menschen den Würfel werfen, desto geringer ist die Zielzahl, um die Wahrscheinlichkeit zu verringern Jeder Würfelwurf wird getroffen.

So wichtig ist, dass einige der Dinge, die wir in der Zeichenfolge ausrichten, die wir hashen, Dinge sind, die wir anpassen dürfen. Hashing ist nicht genau so, als würde man den Würfel werfen, denn wenn wir immer wieder dasselbe haben, erhalten wir immer wieder dasselbe Ergebnis. Selbst eine geringfügige Anpassung des Hashs kann jedoch einen großen Einfluss auf den resultierenden Hash haben Das primäre Element, das wir manipulieren können, heißt „Nonce“. Grundsätzlich wählen wir eine Nonce aus, die in der Zeichenfolge verwendet werden soll, hashen die gesamte Zeichenfolge und sehen, was wir erhalten. Wenn der Hash nicht getroffen wird, ändern wir die Nonce und versuchen es erneut . Die Nonce selbst ist nicht sehr groß, daher gibt es eine begrenzte Anzahl von Variationen der Nonce, die Sie ausprobieren können. Das nächste Element, das wir ändern können, ist ein Zeitstempel. Wir dürfen auch den Zeitstempel wackeln. Jedes Wackeln des Zeitstempels ermöglicht es uns, den gesamten Satz möglicher Nonce-Werte noch einmal durchzugehen. Wir wiederholen diesen Vorgang, indem wir die Nonce-Möglichkeiten ausschöpfen und dann den Zeitstempel immer wieder bis zum resultierenden Hash wackeln ist niedriger als die Schwierigkeitszielzahl.

Wenn dies geschieht, verkünden wir der Welt, dass dieser Zeitstempel und diese Nonce den Block lösen. Andere validieren ihn als wahr und er wird dem hinzugefügt Blockkette. Ein Block wird als „validiert“ betrachtet, sobald er eine bestimmte Anzahl von Blöcken „tief“ in der Blockkette hat, was bedeutet, dass er im Vergleich zum aktuellen Block ein historischer Block ist. Die Validierung ist hier eine kleine Fehlbezeichnung, da nicht bekannt ist, dass der Block bereits gültig ist. Was wir „validieren“, ist der Beweis der Arbeit, was bedeutet, dass, sobald dieser historische Block weit genug vergraben ist, der Aufwand für die Erstellung dieser Geschichte unüberwindbar ist, damit jemand anderes versuchen kann, eine andere Variation der Geschichte zu erstellen. Sie müssten erstellen ihre eigene Version dieses Blocks (der einzige Grund ist, in ihre eigene Version der Transaktionen zu schreiben, dhMünzen stehlen), dann selbst lösen, dann den nächsten Block und den nächsten lösen und so weiter und alle anderen „einholen“. Dies bedeutet, dass sie im Würfelspiel die Welt hinter sich lassen müssten. Vielleicht hat einmal in der Geschichte des Universums jemand Glück mit zwei oder drei Blöcken hintereinander, aber mit den 120 Blöcken, die die meisten Minenpools und Börsen jetzt benötigen? Das wird niemals passieren.

Schreibe einen Kommentar

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