Essayez de miner Bitcoin avec le hashlib de Python

Pour être précis, écrivez un programme qui trouve le hachage du bloc requis pour l'extraction. Il est inutile et impossible de miner avec le logiciel implémenté par moi-même, donc le but est de comprendre le mécanisme.

Qu'est-ce que Bitcoin

Voir Références.

Qu'est-ce que l'exploitation minière?

Je laisserai l'explication détaillée à d'autres articles, etc., mais c'est un acte d'enregistrement (d'approbation) des transactions Bitcoin.

Il s'agit d'un acte de recherche d'une valeur nonce telle que les 0 sont alignés par un nombre spécifique (17 à partir de janvier 2016) à partir du début de la valeur de hachage à partir de laquelle il est possible de calculer. Si vous trouvez le nonce du bloc pour la première fois dans le monde, vous recevrez 25 BTC (environ 1,16 million de yens en janvier 2016) nouvelles pièces émises et des frais pour la transaction réservée. Pour cette récompense, les gens du monde entier s'empressent d'utiliser un grand nombre de machines chargées de puces spéciales. La difficulté de minage est ajustée pour prendre en moyenne 10 minutes en utilisant des ressources du monde entier, donc cela devient plus difficile à mesure que le nombre de participants au minage augmente.

Puisqu'il est calculé sur la base du hachage du bloc précédent, il est connecté au bloc précédent et est à l'origine du nom "blockchain". Afin de falsifier un historique de transaction, il est nécessaire de recalculer le hachage du bloc contenant cette transaction et tous les blocs après cela, c'est pourquoi il est dit que la falsification n'est pas possible.

Essayer

Il faut beaucoup de temps pour vraiment essayer de miner, donc je m'assure simplement que le nonce de la transaction déjà approuvée est vraiment correct. Les résultats de toutes les transactions Bitcoin et de l'exploitation minière sont publics, donc https://blockchain.info/ja/ Vous pouvez le voir sur etc.

Cette fois comme échantillon https://blockchain.info/ja/block/000000000000000003a0343cc001d21b97d15e97e665b68c790b98c871cf0731 Est utilisé.

L'entrée pour le calcul du hachage est

est. Récupérez ces valeurs sur la page ci-dessus.

version = 4
prev_block = "0000000000000000005629ef6b683f8f6301c7e6f8e796e7c58702a079db14e8"
markle_root = "efb8011cb97b5f1599b2e18f200188f1b8207da2884392672f92ac7985534eeb"
timestamp = "2016-01-30 13:23:09"
bits = 403253488
nonce = 1448681410  #Puisqu'il s'agit d'un bloc approuvé, nous connaissons également la valeur de nonce

Étant donné que chacun ne peut pas être utilisé tel quel, convertissez-le au format spécifié.

version

Remplissez la version avec 0 pour en faire 8 chiffres. De plus, comme cela est courant avec d'autres valeurs, toutes ces valeurs sont utilisées dans le calcul dans l'ordre inverse des octets (petit tolandien). Il existe probablement une autre meilleure façon d'inverser l'ordre des octets, mais ci-dessous, je vais le convertir en une chaîne hexadécimale, puis le décoder à nouveau. (Pour python3, int a une méthode to_bytes)

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

Hash de bloc précédent, racine Merkle

Le hachage et la racine Merkle du bloc précédent sont déjà sous forme hexadécimale, donc décodez-les et inversez-les.

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

Heures du jour

Time convertit le nombre de secondes de l'heure standard Unix en une séquence d'octets inversés comme d'habitude.

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 Convertissez simplement en une chaîne d'octets inversés.

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

Calcul de hachage

Le hachage Bitcoin utilise sha256 deux fois. De plus, puisque le résultat est également une chaîne d'octets inversés, convertissez l'ordre en hexadécimal.

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"))

production

000000000000000003a0343cc001d21b97d15e97e665b68c790b98c871cf0731

Vous pouvez voir que les 17 0 sont correctement alignés.

Résumé

Les références

Recommended Posts

Essayez de miner Bitcoin avec le hashlib de Python
Essayez d'utiliser le networkx de Python avec AtCoder
Essayez d'utiliser l'appareil photo avec OpenCV de Python
Essayez les prévisions de prix Bitcoin avec Deep Learning
Essayez de dessiner une carte avec le package folium de Python
Essayez de gratter avec Python.
Essayez de créer un Checkbutton dynamiquement avec Tkinter en Python
Essayez SNN avec BindsNET
Text mining avec Python-Scraping-
Essayez d'utiliser l'analyseur de flux de Python.
Essayez d'utiliser Tkinter de Python
Essayez la régression avec TensorFlow
Essayez de défier le sol par récursif
Essayez l'optimisation des fonctions avec Optuna
Essayez l'apprentissage en profondeur avec TensorFlow
Reconnaissance faciale avec OpenCV de Python
Essayez la détection des bords avec OpenCV
Implémenter des sous-commandes avec l'argparse de Python
Essayez Google Mock avec C
Essayez d'utiliser matplotlib avec PyCharm
Essayez de programmer avec un shell!
Essayez la programmation GUI avec Hy
Essayez Auto Encoder avec Pytorch
Essayez la sortie Python avec Haxe 3.2
Essayez l'opération matricielle avec NumPy
Essayez d'implémenter XOR avec PyTorch
Essayez d'exécuter CNN avec ChainerRL
Essayez différentes choses avec PhantomJS
Essayez le Deep Learning avec FPGA
Essayez d'exécuter Python avec Try Jupyter
Essayez d'implémenter le parfum avec Go
Essayez Selenium Grid avec Docker
Essayez la reconnaissance faciale avec Python
Essayez OpenCV avec Google Colaboratory
Essayez le machine learning à la légère avec Kaggle
Essayez TensorFlow MNIST avec RNN
Essayez de créer Jupyter Hub avec Docker
Essayez d'utiliser le folium avec anaconda