Python Blockchain - tworzenie górników

Aby umożliwić wydobycie, musimy opracować funkcję wydobywczą. Funkcja wydobywania musi wygenerować skrót na podanym ciągu wiadomości i zapewnić dowód pracy. Omówmy to w tym rozdziale.

Funkcja Message Digest

Napiszemy funkcję narzędzia o nazwie sha256 za stworzenie streszczenia danej wiadomości -

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

Plik sha256 funkcja przyjmuje message jako parametr koduje go do ASCII, generuje skrót szesnastkowy i zwraca wartość do dzwoniącego.

Funkcja górnicza

Teraz opracowujemy minefunkcja, która realizuje naszą własną strategię wyszukiwania. Naszą strategią w tym przypadku byłoby wygenerowanie skrótu na danej wiadomości, który jest poprzedzony określoną liczbą jedynek. Podana liczba jedynek jest określana jako parametrmine funkcja określona jako poziom trudności.

Na przykład, jeśli określisz poziom trudności 2, wygenerowany hash dla danej wiadomości powinien zaczynać się od dwóch jedynek - jak 11xxxxxxxx. Jeśli poziom trudności wynosi 3, wygenerowany hash powinien zaczynać się od trzech jedynek - jak 111xxxxxxxx. Biorąc pod uwagę te wymagania, teraz opracujemy funkcję wyszukiwania, jak pokazano w krokach podanych poniżej.

Krok 1

Funkcja wyszukiwania ma dwa parametry - komunikat i poziom trudności.

def mine(message, difficulty=1):

Krok 2

Poziom trudności musi być większy lub równy 1, zapewniamy to następującym stwierdzeniem assert -

assert difficulty >= 1

Krok 3

Tworzymy prefix zmienna za pomocą ustawionego poziomu trudności.

prefix = '1' * difficulty

Zwróć uwagę, że jeśli poziom trudności wynosi 2, prefiks to „11”, a jeśli poziom trudności to 3, prefiks będzie brzmiał „111” i tak dalej. Sprawdzimy, czy ten prefiks istnieje w wygenerowanym skrócie wiadomości. Aby przetrawić samą wiadomość, używamy następujących dwóch wierszy kodu -

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

Cały czas dodajemy nowy numer ido skrótu wiadomości w każdej iteracji i wygeneruj nowy skrót połączonej wiadomości. Jako dane wejściowe dosha256 funkcja zmienia się w każdej iteracji, rozszerzenie digestwartość również uległaby zmianie. Sprawdzamy, czy todigest wartość jest ustawiona powyżej prefix.

if digest.startswith(prefix):

Jeśli warunek zostanie spełniony, zakończymy for pętla i zwróć plik digest wartość dla dzwoniącego.

Cały mine kod jest pokazany tutaj -

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

Dla Twojego zrozumienia dodaliśmy rozszerzenie print instrukcja, która drukuje wartość skrótu i ​​liczbę iteracji potrzebnych do spełnienia warunku przed powrotem z funkcji.

Testowanie funkcji wyszukiwania

Aby przetestować naszą funkcję wyszukiwania, po prostu wykonaj następującą instrukcję -

mine ("test message", 2)

Po uruchomieniu powyższego kodu zobaczysz wyjście podobne do tego poniżej -

after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c

Zwróć uwagę, że wygenerowane podsumowanie zaczyna się od „11”. Jeśli zmienisz poziom trudności na 3, wygenerowane podsumowanie zacznie się od „111” i oczywiście prawdopodobnie będzie wymagało większej liczby iteracji. Jak widać, górnik o większej mocy obliczeniowej będzie mógł wcześniej wydobyć daną wiadomość. W ten sposób górnicy konkurują ze sobą o przychody.

Teraz jesteśmy gotowi, aby dodać więcej bloków do naszego łańcucha bloków. Nauczmy się tego w następnym rozdziale.