Versuchen Sie, Bitcoin mit Pythons Hashlib abzubauen

Um genau zu sein, schreiben Sie ein Programm, das den Hash des für das Mining erforderlichen Blocks findet. Es ist nutzlos und unmöglich, mit der von mir implementierten Software abzubauen, daher besteht der Zweck darin, den Mechanismus zu verstehen.

Was ist Bitcoin?

Siehe Referenzen.

Was ist Bergbau?

Ich werde die ausführliche Erklärung anderen Artikeln usw. überlassen, aber es handelt sich um das Aufzeichnen (Genehmigen) von Bitcoin-Transaktionen.

Es handelt sich um einen Vorgang, bei dem ein Nonce-Wert so gefunden wird, dass Nullen ab dem Beginn des Hash-Werts, aus dem berechnet werden kann, mit einer bestimmten Zahl (17 ab Januar 2016) in einer Reihe stehen. Wenn Sie die Nonce des Blocks zum ersten Mal auf der Welt finden, erhalten Sie 25 BTC (ca. 1,16 Millionen Yen, Stand Januar 2016) neu ausgegebene Münzen und eine Gebühr für die gebuchte Transaktion. Für diese Belohnung beeilen sich Menschen auf der ganzen Welt, eine große Anzahl von Maschinen zu benutzen, die mit speziellen Chips beladen sind. Der Schwierigkeitsgrad des Bergbaus wird so angepasst, dass er mit Ressourcen aus der ganzen Welt durchschnittlich 10 Minuten dauert. Daher wird es schwieriger, wenn die Anzahl der Bergbauteilnehmer zunimmt.

Da es basierend auf dem Hash des vorherigen Blocks berechnet wird, ist es mit dem vorherigen Block verbunden und der Ursprung des Namens "Blockchain". Um einen Transaktionsverlauf zu manipulieren, muss der Hash des Blocks, der diese Transaktion enthält, und alle Blöcke danach neu berechnet werden, weshalb gesagt wird, dass Manipulationen nicht möglich sind.

Versuchen

Es braucht viel Zeit, um wirklich zu versuchen, meine zu finden, also stelle ich nur sicher, dass das Nonce der bereits genehmigten Transaktion wirklich korrekt ist. Die Ergebnisse aller Bitcoin-Transaktionen und des Mining sind öffentlich https://blockchain.info/ja/ Sie können es bei etc. sehen.

Diesmal als Probe https://blockchain.info/ja/block/000000000000000003a0343cc001d21b97d15e97e665b68c790b98c871cf0731 Wird genutzt.

Die Eingabe für die Hash-Berechnung ist

ist. Nehmen Sie diese Werte von der obigen Seite auf.

version = 4
prev_block = "0000000000000000005629ef6b683f8f6301c7e6f8e796e7c58702a079db14e8"
markle_root = "efb8011cb97b5f1599b2e18f200188f1b8207da2884392672f92ac7985534eeb"
timestamp = "2016-01-30 13:23:09"
bits = 403253488
nonce = 1448681410  #Da es sich um einen genehmigten Block handelt, kennen wir auch den Wert von Nonce

Da jedes nicht so verwendet werden kann, wie es ist, konvertieren Sie es in das angegebene Format.

Ausführung

Füllen Sie die Version mit 0, um 8 Stellen zu erhalten. Wie bei anderen Werten üblich, werden alle diese Werte bei der Berechnung in umgekehrter Bytereihenfolge (wenig tolandisch) verwendet. Es gibt wahrscheinlich einen anderen besseren Weg, um die Bytereihenfolge umzukehren, aber unten werde ich sie in eine hexadezimale Zeichenfolge konvertieren und sie dann erneut dekodieren. (Für python3 hat int eine to_bytes-Methode)

version_h = format(version, "08x").decode("hex")[::-1]

Vorheriger Block-Hash, Merkle-Wurzel

Der Hash und die Merkle-Wurzel des vorherigen Blocks liegen bereits in hexadezimaler Form vor. Dekodieren Sie sie also und kehren Sie sie um.

prev_block_h = prev_block.decode("hex")[::-1]
markle_root_h = markle_root.decode("hex")[::-1]

Tageszeiten

Time konvertiert die Anzahl der Sekunden von der Unix-Standardzeit wie gewohnt in eine umgekehrte Bytefolge.

from datetime import datetime
timestamp_s = int((datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S")-datetime(1970,1,1)).total_seconds())
timestamp_h = format(timestamp_s,"x").decode("hex")[::-1]

bits, nonce Konvertieren Sie einfach in eine Reverse-Byte-Zeichenfolge.

bits_h = format(bits,"x").decode("hex")[::-1]
nonce_h = format(nonce,"x").decode("hex")[::-1]

Hash-Berechnung

Bitcoin-Hash verwendet sha256 zweimal. Da das Ergebnis auch eine Reverse-Byte-Zeichenfolge ist, konvertieren Sie die Reihenfolge in hexadezimal.

from hashlib import sha256
header = version_h + prev_block_h + markle_root_h + timestamp_h + bits_h + nonce_h
print(sha256(sha256(header).digest()).digest()[::-1].encode("hex"))

Ausgabe

000000000000000003a0343cc001d21b97d15e97e665b68c790b98c871cf0731

Sie können sehen, dass 17 0s richtig ausgerichtet sind.

Zusammenfassung

Verweise

Recommended Posts

Versuchen Sie, Bitcoin mit Pythons Hashlib abzubauen
Versuchen Sie, Pythons networkx mit AtCoder zu verwenden
Versuchen Sie, die Kamera mit Pythons OpenCV zu verwenden
Probieren Sie die Bitcoin-Preisprognose mit Deep Learning aus
Versuchen Sie, eine Karte mit Pythons Folium-Paket zu zeichnen
Versuchen Sie es mit Python.
Versuchen Sie, mit Tkinter in Python dynamisch einen Checkbutton zu erstellen
Versuchen Sie SNN mit BindsNET
Text Mining mit Python-Scraping-
Versuchen Sie es mit dem Feed-Parser von Python.
Versuchen Sie es mit Pythons Tkinter
Versuchen Sie eine Regression mit TensorFlow
Versuchen Sie, den Boden durch Rekursion herauszufordern
Versuchen Sie die Funktionsoptimierung mit Optuna
Versuchen Sie es mit TensorFlow
Gesichtserkennung mit OpenCV von Python
Versuchen Sie die Kantenerkennung mit OpenCV
Implementieren Sie Unterbefehle mit Pythons Argparse
Versuchen Sie Google Mock mit C.
Versuchen Sie es mit matplotlib mit PyCharm
Versuchen Sie, mit einer Shell zu programmieren!
Versuchen Sie die GUI-Programmierung mit Hy
Versuchen Sie Auto Encoder mit Pytorch
Probieren Sie die Python-Ausgabe mit Haxe 3.2 aus
Versuchen Sie die Matrixoperation mit NumPy
Versuchen Sie, XOR mit PyTorch zu implementieren
Versuchen Sie, CNN mit ChainerRL auszuführen
Probieren Sie verschiedene Dinge mit PhantomJS aus
Versuchen Sie Deep Learning mit FPGA
Versuchen Sie, Python mit Try Jupyter auszuführen
Versuchen Sie, Parfüm mit Go zu implementieren
Probieren Sie Selenium Grid mit Docker aus
Versuchen Sie die Gesichtserkennung mit Python
Probieren Sie OpenCV mit Google Colaboratory aus
Versuchen Sie es mit Kaggle leicht maschinell
Versuchen Sie TensorFlow MNIST mit RNN
Versuchen Sie, Jupyter Hub mit Docker zu erstellen
Versuchen Sie es mit Folium mit Anakonda