Python Blockchain - Bergleute erstellen

Um den Bergbau zu ermöglichen, müssen wir eine Bergbaufunktion entwickeln. Die Mining-Funktionalität muss einen Digest für eine bestimmte Nachrichtenzeichenfolge generieren und einen Arbeitsnachweis liefern. Lassen Sie uns dies in diesem Kapitel diskutieren.

Message Digest-Funktion

Wir werden eine Utility-Funktion namens schreiben sha256 zum Erstellen eines Digests für eine bestimmte Nachricht -

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

Das sha256 Funktion benötigt a message codiert es als Parameter in ASCII, generiert einen hexadezimalen Digest und gibt den Wert an den Aufrufer zurück.

Mining-Funktion

Wir entwickeln jetzt die mineFunktion, die unsere eigene Bergbaustrategie umsetzt. Unsere Strategie in diesem Fall wäre es, einen Hash für die angegebene Nachricht zu generieren, dem eine bestimmte Anzahl von Einsen vorangestellt ist. Die angegebene Anzahl von Einsen wird als Parameter für angegebenmine Funktion als Schwierigkeitsgrad angegeben.

Wenn Sie beispielsweise einen Schwierigkeitsgrad von 2 angeben, sollte der generierte Hash für eine bestimmte Nachricht mit zwei Einsen beginnen - wie 11xxxxxxxx. Wenn der Schwierigkeitsgrad 3 ist, sollte der generierte Hash mit drei Einsen beginnen - wie 111xxxxxxxx. Angesichts dieser Anforderungen werden wir nun die Mining-Funktion wie in den folgenden Schritten gezeigt entwickeln.

Schritt 1

Die Mining-Funktion verwendet zwei Parameter - die Nachricht und den Schwierigkeitsgrad.

def mine(message, difficulty=1):

Schritt 2

Der Schwierigkeitsgrad muss größer oder gleich 1 sein, dies stellen wir mit der folgenden Aussage sicher:

assert difficulty >= 1

Schritt 3

Wir schaffen eine prefix variabel mit dem eingestellten Schwierigkeitsgrad.

prefix = '1' * difficulty

Beachten Sie, dass bei einem Schwierigkeitsgrad von 2 das Präfix „11“ und bei einem Schwierigkeitsgrad von 3 das Präfix „111“ usw. lautet. Wir werden prüfen, ob dieses Präfix im generierten Digest der Nachricht vorhanden ist. Um die Nachricht selbst zu verarbeiten, verwenden wir die folgenden zwei Codezeilen:

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

Wir fügen weiterhin eine neue Nummer hinzu iauf den Nachrichten-Hash in jeder Iteration und generieren Sie einen neuen Digest für die kombinierte Nachricht. Als Eingang zumsha256 Funktionsänderungen in jeder Iteration, die digestWert würde sich auch ändern. Wir prüfen ob diesdigest Wert hat oben eingestellt prefix.

if digest.startswith(prefix):

Wenn die Bedingung erfüllt ist, werden wir das beenden for Schleife und geben Sie die digest Wert für den Anrufer.

Das ganze mine Code wird hier angezeigt -

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

Für Ihr Verständnis haben wir die hinzugefügt print Anweisung, die den Digest-Wert und die Anzahl der Iterationen druckt, die erforderlich waren, um die Bedingung zu erfüllen, bevor von der Funktion zurückgekehrt wurde.

Testen der Mining-Funktion

Führen Sie zum Testen unserer Mining-Funktion einfach die folgende Anweisung aus:

mine ("test message", 2)

Wenn Sie den obigen Code ausführen, sehen Sie eine Ausgabe ähnlich der folgenden -

after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c

Beachten Sie, dass der generierte Digest mit „11“ beginnt. Wenn Sie den Schwierigkeitsgrad auf 3 ändern, beginnt der generierte Digest mit „111“ und erfordert natürlich wahrscheinlich mehr Iterationen. Wie Sie sehen können, kann ein Bergmann mit mehr Rechenleistung eine bestimmte Nachricht früher abrufen. So konkurrieren die Bergleute miteinander, um ihre Einnahmen zu erzielen.

Jetzt können wir unserer Blockchain weitere Blöcke hinzufügen. Lassen Sie uns dies in unserem nächsten Kapitel lernen.