Blockchain Python - Création de mineurs

Pour permettre l'exploitation minière, nous devons développer une fonction minière. La fonctionnalité d'exploration de données doit générer un résumé sur une chaîne de message donnée et fournir une preuve de travail. Discutons-en dans ce chapitre.

Fonction de résumé de message

Nous écrirons une fonction utilitaire appelée sha256 pour créer un condensé sur un message donné -

def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()

le sha256 fonction prend un message en tant que paramètre, l'encode en ASCII, génère un condensé hexadécimal et renvoie la valeur à l'appelant.

Fonction minière

Nous développons maintenant le minefonction qui met en œuvre notre propre stratégie minière. Notre stratégie dans ce cas serait de générer un hachage sur le message donné qui est préfixé avec un nombre donné de 1. Le nombre donné de 1 est spécifié comme paramètre pourmine fonction spécifiée comme niveau de difficulté.

Par exemple, si vous spécifiez un niveau de difficulté de 2, le hachage généré sur un message donné doit commencer par deux 1 - comme 11xxxxxxxx. Si le niveau de difficulté est 3, le hachage généré doit commencer par trois 1 - comme 111xxxxxxxx. Compte tenu de ces exigences, nous allons maintenant développer la fonction d'extraction comme indiqué dans les étapes ci-dessous.

Étape 1

La fonction d'exploration de données prend deux paramètres - le message et le niveau de difficulté.

def mine(message, difficulty=1):

Étape 2

Le niveau de difficulté doit être supérieur ou égal à 1, nous nous en assurons avec la déclaration d'assertion suivante -

assert difficulty >= 1

Étape 3

Nous créons un prefix variable en utilisant le niveau de difficulté défini.

prefix = '1' * difficulty

Notez que si le niveau de difficulté est 2, le préfixe sera «11» et si le niveau de difficulté est 3, le préfixe sera «111», et ainsi de suite. Nous vérifierons si ce préfixe existe dans le résumé généré du message. Pour digérer le message lui-même, nous utilisons les deux lignes de code suivantes -

for i in range(1000):
   digest = sha256(str(hash(message)) + str(i))

Nous continuons d'ajouter un nouveau numéro iau hachage du message à chaque itération et générer un nouveau condensé sur le message combiné. En tant qu'entrée dusha256 fonction change à chaque itération, le digestla valeur changerait également. Nous vérifions si celadigest la valeur a dépassé prefix.

if digest.startswith(prefix):

Si la condition est remplie, nous mettrons fin au for boucle et retourne le digest valeur pour l'appelant.

L'ensemble mine le code est affiché ici -

def mine(message, difficulty=1):
   assert difficulty >= 1
   prefix = '1' * difficulty
   for i in range(1000):
      digest = sha256(str(hash(message)) + str(i))
      if digest.startswith(prefix):
         print ("after " + str(i) + " iterations found nonce: "+ digest)
      return digest

Pour votre compréhension, nous avons ajouté le print instruction qui imprime la valeur de résumé et le nombre d'itérations nécessaires pour remplir la condition avant de revenir de la fonction.

Test de la fonction minière

Pour tester notre fonction d'exploration de données, exécutez simplement l'instruction suivante -

mine ("test message", 2)

Lorsque vous exécutez le code ci-dessus, vous verrez la sortie similaire à celle ci-dessous -

after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c

Notez que le résumé généré commence par «11». Si vous changez le niveau de difficulté à 3, le résumé généré commencera par «111», et bien sûr, il nécessitera probablement plus d'itérations. Comme vous pouvez le voir, un mineur avec plus de puissance de traitement pourra extraire un message donné plus tôt. C'est ainsi que les mineurs se font concurrence pour gagner leurs revenus.

Maintenant, nous sommes prêts à ajouter plus de blocs à notre blockchain. Apprenons cela dans notre prochain chapitre.