Rekapitulace první části

V první části jsme se naučili základy Pythonu. Naučili jsme se, jak v systému fungují if-elif-else a smyčky. V podstatě jsme se naučili, jak v Pythonu dělat jednoduchý kód. V této části začneme vytvářet náš blockchain. Pojďme tedy bez dalších okolků začít!

The Ultimate Guide to Python and Blockchain: Part 2

Vytváření našeho Python blockchainu: Představujeme seznamy

Dobře, takže dost se základy. Nyní vytvořme náš blockchain!

Uděláme to zavedením seznamů. Seznamy jsou v zásadě skupina dat, která mohou být jakéhokoli typu. Jsou definovány takto:

List_name = [prvek 1, prvek 2, prvek 3 …… prvek n]

Prvky, jak jsme vysvětlili dříve, mohou být jakéhokoli datového typu. Může to být celé číslo, float, řetězec nebo dokonce jiný seznam (který později použijeme). Podívejme se, jak to bude fungovat. K tomu použijeme náš terminál:

Několik poznámek z výše uvedeného kódu.

Přemýšlejte o jednotlivých prvcích seznamu jako o blocích v blockchainu. Není to opravdu tak velký úsek, samozřejmě, později to uděláme sofistikovanější. Samotný seznam spojuje všechna tato data dohromady a dává tento „řetězový“ prvek blockchainu.

Další věcí, kterou si všimnete, je indexové číslo každého prvku. První prvek má index 0. To je důvod, proč když chceme vytisknout první prvek, řekneme „blockchain [0]“.

Úpravy prvků seznamu

Seznam, který nelze upravit, je k ničemu. Potřebujete přidávat a odebírat prvky ze seznamu. Nyní víme, že v blockchainu podobném bitcoinu je nemožné odstranit prvky, ale stále máme co do činění se seznamem.

Jak to tedy uděláme?

Budeme používat dvě funkce seznamu:

  • připojit()
  • pop ()

Funkce přidání přidá do seznamu další prvky. Vraťte tedy náš starý seznam:

blockchain = [1, 2, 5,6].

Pokud k tomu chceme přidat „Blockgeeks“, jednoduše řekneme: blockchain.append („Blockgeeks“)

Když to nyní vytiskneme, zobrazí se:

[1, 2, 5,6, „Blockgeeks“]

Nyní odstraníme některá data.

K tomu použijeme funkci pop (), která odstraní poslední prvek ze seznamu. Pokud tedy uděláme blockchain.pop [], nyní odstraní „Blockgeeks“ a zobrazí:

[1, 2, 5,6]

Přidávání prvků za běhu pomocí funkcí

Pojďme se pobavit.

Budeme používat funkci pro přidání prvků do seznamu za běhu. Zvažte tento program:

blockchain = []

def add_list ():

   blockchain.append (3.2)

   tisk (blockchain)

add_list ()

add_list ()

add_list ()

Takže jsme definovali funkci nazvanou „add_list ()“, která bude při každém vyvolání přidávat 3.2 do seznamu blockchainu. Všimli jste si, jak jsme deklarovali prázdný seznam pomocí: blockchain = []? To bylo provedeno, abychom vám mohli ukázat, jak můžete zadávat data od nuly.

Takže pokud to vytiskneme, tak to bude vypadat. Jsme zpět na Visual Studio Code btw.

The Ultimate Guide to Python and Blockchain: Part 2

Poskytnutí seznamu další vlastnosti podobné blockchainu

Dosud jsme se hodně zabývali normálním seznamem. Mezi bloky však musí existovat organičtější spojení.

Důvodem, proč jsou bloky vzájemně propojeny ve skutečném blockchainu, je to, že obsahují také data předchozího bloku. To je přesně to, co uděláme připojením dat posledního prvku k nejnovějšímu prvku prostřednictvím vnořeného seznamu. V pythonu můžete získat data posledního ze seznamu pomocí indexu [-1].

Pokud má tedy blockchain [1, 2, 3], pak vám blockchain [-1] dá 3.

Podívejme se na kód, použijeme funkci input () k získání hodnoty prvku blockchainu od uživatele.

prvek1 = vstup ("Dejte první prvek blockchainu ")

blockchain = [prvek1]

def add_list ():

   blockchain.append ([blockchain [-1], 3,2])

   tisk (blockchain)

add_list ()

add_list ()

add_list ()

Takže teď, když toto vytisknete, získáte:

The Ultimate Guide to Python and Blockchain: Part 2

Dobře, doposud jsme dali blockchainu nějaký charakter, ale stále nemáme nic podobného našemu fungujícímu modelu. Nebojte se, že to brzy vyřeší.

Přibližte se k fungujícímu blockchainu

blockchain = []

“”” Sekce 1 “””

def get_last_value ():

   """ extrahování posledního prvku seznamu blockchainu """

   návrat (blockchain [-1])

def add_value (transaction_amount, last_transaction = [1]):

   blockchain.append ([last_transaction, transaction_amount])

“”” Sekce 2 “””

def get_transaction_value ():

   user_value = float (vstup (‘Zadejte částku své transakce’))

   návrat user_value

def get_user_choice ():

   user_input = vstup ("Zde prosím vyberte: ")

   návrat user_input

„“ “Oddíl 3„ ““

def print_block ():

   pro blok v blockchainu:

       tisk("Tady je váš blok")

       tisk (blok)

„“ “Oddíl 4„ ““

def verify_chain ():

   index = 0

   valid = True

   pro blok v blockchainu:

       pokud index == 0:

           index + = 1

           pokračovat

       elif block [0] == blockchain [index – 1]:

           valid = True

       jiný:

           valid = False

           přestávka

       index + = 1

   vrácení platné

„“ “Oddíl 5„ ““

tx_amount = get_transaction_value ()

add_value (tx_amount)

zatímco je pravda:

   tisk("Vyberte možnost")

   tisk (‘Vyberte 1 pro přidání nové transakce’)

   tisk (‘Vyberte 2 pro tisk blockchainu’)

   tisk (‘Chcete-li manipulovat s daty, vyberte 3’)

   tisk (‘Chcete-li ukončit, vyberte cokoli jiného’)

   user_choice = get_user_choice ()

   

   pokud user_choice == 1:

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       if len (blockchain) >= 1:

           blockchain [0] = 2

   

   jiný:

       přestávka

   

   pokud ne, ověřte_řetězec ():

       tisk („manipulace s blockchainem“)

       přestávka

Ano, víme, že se jedná o obrovský blok kódu, ale celou věc jsme rozdělili do různých částí, abychom vám pomohli pochopit, o co jde a každou část kódu.

Pokusili jsme se zde vytvořit prototyp blockchainu, který nezávisí na statické deklaraci. To znamená, že uživatelé mohou sami doplňovat data během běhu. To je důvod, proč, když uvidíte první řádek kódu, uvidíte, že začínáme s prázdným blockchainem.

Dobře, tak se pojďme podívat do sekcí.

Poznámka: Doporučujeme zkopírovat výše uvedený kód a ponechat jej otevřený v novém okně nebo v souboru dokumentu. V níže uvedeném vysvětlení budeme nadále odkazovat na jinou část kódu a bude pro vás jednodušší sledovat ji.

Sekce 1

def get_last_value ():

   """ extrahování posledního prvku seznamu blockchainu """

   návrat (blockchain [-1])

def add_value (transaction_amount, last_transaction = [1]):

   blockchain.append ([last_transaction, transaction_amount])

Takže s touto první částí už musíte být docela dobře obeznámeni. Děláme zde dvě věci:

  • Extrahování posledního prvku blockchainu
  • Připojením posledního prvku k aktuálnímu prvku v bloku do blockchainu.

Podívejte se na argumenty ve funkci add_value:

  • Last_transaction
  • Transaction_amount

Transaction_amount je hodnota transakce, která bude vložena do blockchainu. Proměnná last_transaction je naproti tomu hodnota transakce v posledním bloku, který bude vložen do nového bloku.

Proč tedy inicializujeme last_transaction na [1]?

Děje se to čistě, aby se zabránilo chybě během běhu. Přemýšlejte o tom, pokud máme co do činění s prvním blokem blockchainu, pak nebude mít žádnou „last_transaction“, že? Pro existenci konceptu „last_transaction“ budete potřebovat alespoň dva bloky. To je důvod, proč, aby se odstranila možnost jakékoli chyby v prvním bloku, je last_transaction inicializován na [1].

Sekce 2

def get_transaction_value ():

   user_value = float (vstup (‘Zadejte částku své transakce’))

   návrat user_value

def get_user_choice ():

   user_input = vstup ("Zde prosím vyberte: ")

   návrat user_input

Pojďme tuto sekci nazvat vstupní částí. Máme zde dvě funkce:

  • get_transaction_value ()
  • get_user_choice ()

V první funkci žádáme uživatele, aby zadal hodnotu částky transakce, kterou chce zadat do blockchainu. Nyní si pamatujte, že funkce input () vrací hodnotu řetězce. Funkci float () tedy používáme ke změně tohoto čísla na plovoucí číslo.

Ve druhé funkci požádáme uživatele, aby zadal svůj výběr.

Možná vás zajímá: „O čem mluvíš?“

Vezměte část 5. Konkrétně smyčku while. Vidíte možnost, na kterou se tam ptáme?

tisk("Vyberte možnost")

tisk (‘Vyberte 1 pro přidání nové transakce’)

tisk (‘Vyberte 2 pro tisk blockchainu’)

tisk (‘Chcete-li manipulovat s daty, vyberte 3’)

tisk (‘Chcete-li ukončit, vyberte cokoli jiného’)

Funkce get_user_choice () se tedy používá k výběru od uživatele, aby pochopil, co chce dělat.

Část 3

def print_block ():

   pro blok v blockchainu:

       tisk("Tady je váš blok")

       tisk (blok)

Toto je velmi přímá část. K tisku každého bloku blockchainu používáme smyčku for.

Část 4

def verify_chain ():

   index = 0

   valid = True

   pro blok v blockchainu:

       pokud index == 0:

           index + = 1

           pokračovat

       elif block [0] == blockchain [index – 1]:

           valid = True

       jiný:

           valid = False

           přestávka

       index + = 1

   vrácení platné

Nyní je to něco, co jsme dosud neudělali.

V této části ověřujeme platnost blockchainu. Co tím přesně myslíme.

Jak možná víte, blockchain by měl být neměnný. Protože zatím nepoužíváme žádné hashovací funkce, pojďme použít něco jiného, ​​abychom ukázali, že s řetězcem bylo manipulováno. To je důvod, proč v této funkci používáme funkci verify_chain.

Co tady děláme??

Nejprve máme dvě proměnné:

  • Index = Počitadlo, kterým budeme procházet bloky v blockchainu
  • Platné = Booleovská proměnná, která jako konečnou hodnotu této funkce vrátí True nebo False

Poté používáme smyčku for k procházení blockchainu, velmi podobnou předchozí části, kde jsme k vytištění bloků použili smyčku. Uvnitř smyčky používáme tři podmíněné příkazy, projdeme si každý z nich:

Podsekce if

Tím se zkontroluje, zda je index 0 nebo ne. Pokud ano, index se zvýší o 1

Podsekce elif

Toto je část, kde kontrolujeme, zda byla provedena nějaká manipulace nebo ne. Abyste pochopili, jak to funguje, představte si tento scénář.

The Ultimate Guide to Python and Blockchain: Part 2

Jak tedy vidíte, první prvek bloku B je obsahem jeho předchozího bloku. V této podsekci tedy kontrolujeme, zda se první prvek bloku rovná prvkům předchozího bloku. Pokud je to pak tato funkce True, jinak vrátí False.

Část 5

tx_amount = get_transaction_value ()

add_value (tx_amount)

zatímco je pravda:

   tisk("Vyberte možnost")

   tisk (‘Vyberte 1 pro přidání nové transakce’)

   tisk (‘Vyberte 2 pro tisk blockchainu’)

   tisk (‘Chcete-li manipulovat s daty, vyberte 3’)

   tisk (‘Chcete-li ukončit, vyberte cokoli jiného’)

   user_choice = get_user_choice ()

   

   pokud user_choice == 1:

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       if len (blockchain) >= 1:

           blockchain [0] = 2

   

   jiný:

       přestávka

   

   pokud ne, ověřte_řetězec ():

       tisk („manipulace s blockchainem“)

       Přestávka

Toto je tedy dlouhá sekce, a proto ji budeme muset rozlišovat do různých podsekcí (znovu).

Pododdíl 1: Inicializace

tx_amount = get_transaction_value ()

add_value (tx_amount

Začneme inicializací prvního bloku blockchainu. Získáme hodnotu částky transakce (tx_amount) a poté hodnotu zadáme do bloku blockchainu.

Pododdíl 2: Možnost volby

zatímco je pravda:

   tisk("Vyberte možnost")

   tisk (‘Vyberte 1 pro přidání nové transakce’)

   tisk (‘Vyberte 2 pro tisk blockchainu’)

   tisk (‘Chcete-li manipulovat s daty, vyberte 3’)

   tisk (‘Chcete-li ukončit, vyberte cokoli jiného’)

   user_choice = get_user_choice ()

Dobře, takže pododdíl 1 dále, všechny ostatní pododdíly budou provedeny v této smyčce while. První věc, kterou děláme, je tedy dát uživatelům možnost vybrat si, co přesně chtějí dělat:

  • Přidejte novou transakci
  • Vytiskněte blockchain
  • Manipulovat s daty
  • Ukončete proces

Poté user_choice uloží data uživatele

Pododdíl 3: if-elif-elif-else

V závislosti na výběru tedy máme 4 možnosti. Kód vypadá takto:

pokud user_choice == 1:

       tx_amount = get_transaction_value ()

       add_value (tx_amount, get_last_value ())

   

   elif user_choice == 2:

       print_block ()

   

   elif user_choice == 3:

       if len (blockchain) >= 1:

           blockchain [0] = 2

   jiný:

       přestávka

  • Nejprve přidáme transakci do blockchainu. Vyplníme vstup od uživatele a uložíme jej do tx_amount. Jakmile máme hodnotu transakce, přidáme ji spolu s hodnotou prvků z posledního bloku do blockchainu
  • Za druhé vyvoláme funkci tisku a vytiskneme blockchain
  • Za třetí, je to manipulovat funkce. Začlenili jsme to jen proto, abychom vám ukázali, jak bude tento blockchain reagovat, pokud dojde k manipulaci s daty. Co se tady stane, je to, že první prvek blockchainu změníme na 2. Funguje to pouze v případě, že blockchain má více než 1 prvek (podmínka if to kontroluje)

    V následující podsekci zjistíte, co se bude dít dál

  • Poslední část je docela přímočará. Pokud uživatel pošle nějakou jinou možnost, aktivuje se blok else, který jednoduše použije „break“, aby se dostal ze smyčky while

Pododdíl 4: Ověřovací volání

pokud ne, ověřte_řetězec ():

       tisk („manipulace s blockchainem“)

       Přestávka

Pokud se uživatel rozhodne manipulovat s blockchainem, bude ovlivněna tato podsekce. Nyní si pamatujte, že verify_chain () vrací logickou hodnotu:

  • Skutečný
  • Nepravdivé

Verifikace_chain () vrací False, pokud byla provedena manipulace.

Nyní tato podsekce používá ne klíčové slovo, které změní False na True. Toto střídavě aktivuje tiskovou funkci v rámci bloku if k tisku „Blockchain manipulated“.

Výstupy programu

Dobře, takže teď víme, jak program funguje. Podívejme se na výstupy.

The Ultimate Guide to Python and Blockchain: Part 2

Takže projít tím, co jsme udělali výše

Do našeho blockchainu jsme zadali 3 hodnoty: 23,5, 43,1 a 5,89

Poté jsme vytiskli blockchain, který dává toto:

The Ultimate Guide to Python and Blockchain: Part 2

Poté jsme se pokusili manipulovat s naším blockchainem změnou dat, ale náš integrovaný ověřovací systém to chytil a dal tento výstup:

The Ultimate Guide to Python and Blockchain: Part 2

Dobře, takže zatím máme umístěnou docela dobrou strukturu. Stále to však musíme začlenit hashování a funkce kontroly funkčnosti našeho kódu. Jelikož už víme, co jsou to seznamy, seznamme se s n-ticemi a slovníky.

N-tice a slovníky

Tice a slovníky jsou datové struktury spolu se seznamy. Pojďme si tyto tři porovnat a zjistit, jak fungují.

The Ultimate Guide to Python and Blockchain: Part 2

Tice jsou docela podobné seznamům, ale nelze je po vytvoření upravovat. Naproti tomu slovníky mají v našem příkladu jedinečné identifikátory jako JMÉNO 1 A JMÉNO 2, které ukládají hodnoty. Po vytvoření je lze upravit.

Tyto datové struktury budeme používat v našem novém a vylepšeném blockchainu.

Možná by vás zajímalo: „Jaký to má smysl to dělat?“

Transakce, bloky atd. Obsahují spoustu metadat, která je třeba uložit. Přemýšlejte o všech metadatech, která lze uložit v transakci:

  • ID odesílatele
  • ID příjemce
  • Datum transakce
  • Částka transakce

Přidání všech těchto údajů nám pomáhá sledovat naše transakce.

Přidání funkcí těžby a dokladu o práci

První věc, kterou musíme udělat, je přidat funkce těžby a důkazu o práci. Těžba je proces, při kterém horníci řeší kryptograficky tvrdé hádanky, aby našli bloky, které by přidali do blockchainu. Za těžbu těchto bloků dostanou horníci odměnu zvanou bloková odměna.

Na druhou stranu, proof-of-work je metoda těžby a konsensu, která se používá v mnoha kryptoměnách, jako je bitcoin. V našem blockchainu budeme používat proof-of-work.

Pokud bychom měli shrnout, jak funguje Proof Of Work Protocol s blockchainem.

  • Horníci řeší kryptografické hádanky, aby „těžili“ blok a přidali jej do blockchainu.
  • Tento proces vyžaduje obrovské množství energie a výpočetní využití. Hádanky byly navrženy způsobem, který ztěžuje a zatěžuje systém.
  • Když horník vyřeší hádanku, předloží svůj blok síti k ověření.
  • Ověření, zda blok patří do řetězce nebo ne, je velmi jednoduchý proces.

Dobře, podívejme se na náš kód:

“”” Sekce 1 “””

import hashlib

importovat JSON

odměna = 10,0

genesis_block = {

   ‘previous_hash’: ”,

   ‘index’: 0,

   ‘transakce’: [],

   ‘nonce’: 23

}

blockchain = [genesis_block]

open_transactions = []

owner = ‘Blockgeeks’

def hash_block (blok):

   vrátit hashlib.sha256 (json.dumps (block) .encode ()). hexdigest ()

“”” Sekce 2 “””

def valid_proof (transakce, last_hash, nonce):

   guess = (str (transakce) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (hádejte). hexdigest ()

   tisk (guess_hash)

   návrat guess_hash [0: 2] == ’00’

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   zatímco není valid_proof (open_transactions, last_hash, nonce):

       nonce + = 1

   vrátit nonce

„“ “Oddíl 3„ ““

def get_last_value ():

   """ extrahování posledního prvku seznamu blockchainu """

   návrat (blockchain [-1])

def add_value (příjemce, odesílatel = vlastník, částka = 1,0):

   transakce = {‘sender’: odesílatel,

   „recipient“: příjemce,

   ‘amount’: amount}

   open_transactions.append (transakce)

„“ “Oddíl 4„ ““

def mine_block ():

   last_block = blockchain [-1]

   hashed_block = hash_block (last_block)

   nonce = pow ()

   odměna_transakce = {

           ‘sender’: ‘TĚŽBA’,

           ‘recipient’: owner,

           ‘amount’: odměna

       }

   open_transactions.append (odměna_transakce)

   blok = {

       ‘previous_hash’: hashed_block,

       ‘index’: len (blockchain),

       ‘transaction’: open_transactions,

       ‘nonce’: nonce

   }

   blockchain.append (blok)

„“ “Oddíl 5„ ““

def get_transaction_value ():

   tx_recipient = input (‘Zadejte příjemce transakce:’)

   tx_amount = float (vstup (‘Zadejte částku transakce’))

   vrátit tx_recipient, tx_amount

def get_user_choice ():

   user_input = vstup ("Zde prosím vyberte: ")

   návrat user_input

„“ “Část 6„ ““

def print_block ():

   pro blok v blockchainu:

       tisk("Tady je váš blok")

       tisk (blok)

„“ “Část 7„ ““

zatímco je pravda:

   tisk("Vyberte možnost")

   tisk (‘Vyberte 1 pro přidání nové transakce’)

   tisk (‘Vyberte 2 pro těžbu nového bloku’)

   tisk (‘Vyberte 3 pro tisk blockchainu’)

   tisk (‘Chcete-li ukončit, vyberte cokoli jiného’)

   user_choice = get_user_choice ()

   

   pokud user_choice == 1:

       tx_data = get_transaction_value ()

       příjemce, částka = tx_data

       add_value (příjemce, částka = částka)

       tisk (open_transactions)

   elif user_choice == 2:

       mine_block ()

   elif user_choice == 3:

       print_block ()

   

   jiný:

       přestávka

Dobře, analyzujme kód.

Sekce 1

import hashlib

importovat JSON

odměna = 10,0

genesis_block = {

   ‘previous_hash’: ”,

   ‘index’: 0,

   ‘transakce’: [],

   ‘nonce’: 23

}

blockchain = [genesis_block]

open_transactions = []

owner = ‘Blockgeeks’

def hash_block (blok):

   vrátit hashlib.sha256 (json.dumps (block) .encode ()). hexdigest ()

První věc, kterou zde děláme, je import hash knihoven. Konkrétně dovážíme:

  • hashlib: Chcete-li použít jejich hashovací funkce
  • json: Tento balíček potřebujeme k převodu bloku ze slovníku na řetězec.

Poté deklarujeme „odměnu“, globální proměnnou, která bude ukládat odměnu za těžbu bloku, kterou dáme našim těžařům za těžbu bloku.

Dále máme blok geneze. Genesis block je první blok v blockchainu. V našem bloku používáme 4 metadata:

  • Předchozí_hash: Uloží hash předchozího bloku. Bude to prázdný řetězec, protože blok genesis nebude mít žádný předchozí hash.
  • Index: Toto je index bloku v blockchainu. Protože genesis block je první blok, jeho index je inicializován na 0. Pamatujte, že v programovací terminologii je první prvek v seznamu na 0. pozici
  • Transakce: Transakce, která je uložena uvnitř blockchainu. Jelikož toto žádné nemá, je to prázdný seznam.
  • Nonce: Vysvětlíme to později. Inicializuje se na 23, což je fiktivní hodnota.

Po inicializaci bloku genesis se v dalším kroku přidá do blockchainu prostřednictvím blockchain = [genesis_block].

Otevřené transakce: Seznam, který spravuje všechny nevyřízené transakce v blockchainu. Na začátku je to prázdný seznam.

Protože jsme vlastníkem a odesílatelem této transakce, inicializovali jsme to hned na začátku

Dále máme hashovací funkci hash_block ()

Uvnitř vracíme hash bloku pomocí tohoto výrazu:

hashlib.sha256 (json.dumps (blok) .encode ()). hexdigest ()

Podívejme se tedy, co tady děláme:

  • Pomocí hashlibova algoritmu hašování sha256.
  • Poté vstoupí do hry funkce json.dumps a převede blok, kterým je slovník, na řetězec ve formátu json. To však hashlib nedokáže přečíst, a tak máme ….
  • Funkce encode (). Tím se převede řetězec ve formátu json na řetězec UTF-8, který je čitelný hashlibem.
  • Výstupem hashlibu je bajtový hash. Nakonec tedy použijeme metodu hexdigest () k převodu na normální řetězec.

Sekce 2

def valid_proof (transakce, last_hash, nonce):

   guess = (str (transakce) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (hádejte). hexdigest ()

   tisk (guess_hash)

   návrat guess_hash [0: 2] == ’00’

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   zatímco není valid_proof (open_transactions, last_hash, nonce):

       nonce + = 1

   vrátit nonce

V části 2 máme dvě funkce:

  • Valid_proof
  • Funkce pow

valid_proof ()

def valid_proof (transakce, last_hash, nonce):

   guess = (str (transakce) + str (last_hash) + str (nonce)). encode ()

   guess_hash = hashlib.sha256 (hádejte). hexdigest ()

   tisk (guess_hash)

   návrat guess_hash [0: 2] == ’00’

Funkce valid_proof () má tedy tři argumenty:

  • Transakce: Transakce uvnitř bloku
  • Poslední hash: hash posledního bloku
  • Nonce

Dobře, tak co přesně je nonce? Ještě předtím musíme vědět, co znamená obtížnost. „Obtížnost“ je myšlenka co nejtěžší těžby. Pokud těžba není těžká, pak se všechny mince v systému snadno odčerpají, takže jsou naprosto nepoužitelné.

Způsob, jakým vypočítáváme hash systému, je tedy zřetězení transakcí, hash posledního bloku a nonce do jednoho řetězce a jejich hašování. Hash je přijatelný, pouze pokud jsou jeho první dvě písmena nuly.

Takto přinášíme potíže. Nelze předvídat, jak se hash stane, a je to spíše šťastná remíza. Z tohoto důvodu je extrémně obtížné získat hash, který začíná konkrétním vzorem (například 2 0s).

Funkce vrací True, pokud má program platný hash a False, pokud ne.

Funkce pow ()

Dále máme důkaz o práci nebo funkci pow ().

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (last_block)

   nonce = 0

   zatímco není valid_proof (open_transactions, last_hash, nonce):

       nonce + = 1

   vrátit nonce

Tato funkce je velmi přímočará:

  • Nejprve extrahujeme poslední blok z blockchainu a vložíme jej do last_block
  • Poté hashujeme last_block a vkládáme je do last_hash
  • Smyčky while běží, dokud funkce valid_proof nevrátí hodnotu TRUE. (The ne convert převede TRUE na FALSE a tím se vymaní ze smyčky)
  • Nonce je poté vrácen.

Část 3

def get_last_value ():

   """ extrahování posledního prvku seznamu blockchainu """

   návrat (blockchain [-1])

def add_value (příjemce, odesílatel = vlastník, částka = 1,0):

   transakce = {‘sender’: odesílatel,

   „recipient“: příjemce,

   ‘amount’: amount}

   open_transactions.append (transakce)

V této části máme opět dvě funkce:

  • get_last_value
  • přidaná hodnota

Get_last_value ()

Tenhle je docela přímočarý. Extrahuje poslední blok blockchainu.

přidaná hodnota()

Funkce přijímá metadata transakce, jmenovitě:

  • Jméno odesílatele
  • Jméno Příjemce
  • Částka transakce

Poté se transakce připojí k seznamu otevřených transakcí.

Část 4

def mine_block ():

   last_block = blockchain [-1]

   hashed_block = hash_block (last_block)

   nonce = pow ()

   odměna_transakce = {

           ‘sender’: ‘TĚŽBA’,

           ‘recipient’: owner,

           ‘amount’: odměna

       }

   open_transactions.append (odměna_transakce)

   blok = {

       ‘previous_hash’: hashed_block,

       ‘index’: len (blockchain),

       ‘transaction’: open_transactions,

       ‘nonce’: nonce

   }

   blockchain.append (blok)

V této části máme jednu funkci, funkci mine_block (), která vám umožní těžit bloky

V této funkci se tedy stane toto:

  • Extrahujte poslední blok blockchainu a vložte jej do last_block
  • Hašujte poslední blok
  • Pomocí funkce pow () extrahujte nonce
  • Vytvořte odměnu_ transakce, která odmění horníka, tj. Nás částkou odměny, kterou jsme nastavili dříve (10,0 mincí)
  • Odměna_transakce bude připojena k seznamu otevřených transakcí
  • Konečně s novou schválenou nonce máme konečně nový blok, který nám pomáhá získat metadata nového bloku,
  • Nový blok je připojen k blockchainu

Část 5

def get_transaction_value ():

   tx_recipient = input (‘Zadejte příjemce transakce:’)

   tx_amount = float (vstup (‘Zadejte částku transakce’))

   vrátit tx_recipient, tx_amount

def get_user_choice ():

   user_input = vstup ("Zde prosím vyberte: ")

   návrat user_input

V této části máme dvě funkce:

  • get_transaction_value ()
  • get_user_choice ()

# 1 get_transaction_value ()

Tato funkce přijímá metadata transakce, jako je jméno příjemce a částka transakce.

Zároveň se podívejte na prohlášení o vrácení.

vrátit tx_recipient, tx_amount

Tato funkce vrací n-tici (mluvili jsme o n-ticích, než si pamatujete?)

# 2 get_user_choice

Tato funkce v zásadě převezme volbu uživatele a vrátí ji. To je docela podobné funkci get_user_choice () v předchozím programu.

Část 6

def print_block ():

   pro blok v blockchainu:

       tisk("Tady je váš blok")

       tisk (blok)

Podobně jako v předchozím programu se jedná o tiskovou funkci, která vytiskne blockchain.

Část 7

zatímco je pravda:

   tisk("Vyberte možnost")

   tisk (‘Vyberte 1 pro přidání nové transakce’)

   tisk (‘Vyberte 2 pro těžbu nového bloku’)

   tisk (‘Vyberte 3 pro tisk blockchainu’)

   tisk (‘Chcete-li ukončit, vyberte cokoli jiného’)

   user_choice = get_user_choice ()

   

   pokud user_choice == 1:

       tx_data = get_transaction_value ()

       příjemce, částka = tx_data

       add_value (příjemce, částka = částka)

       tisk (open_transactions)

   elif user_choice == 2:

       mine_block ()

   elif user_choice == 3:

       print_block ()

   

   jiný:

       přestávka

Je to podobné jako u posledního programu. Uživatel má na výběr buď:

  • Zadejte transakci
  • Vydělat blok
  • Vytiskněte blockchain

Podívejme se nyní na výstupy programu.

Výstup programu

Nejdůležitější je vybrat možnost 2 a vytěžit blok. Když to uděláte, získáme následující blok hashů:

The Ultimate Guide to Python and Blockchain: Part 2

Zdá se to ohromující, dokud nebudete věnovat trochu větší pozornost a zkontrolovat poslední hash:

„001f946e8c2172affa830ef27761270aab2de515ffac8ae90e5de95b48dc366c“

Vidíte, co je na tomhle hashu tak zvláštního??

Pamatujete si na obtížnost, kterou jsme nastavili dříve? Konkrétně jsme hledali hash, který začínal na „00“. To je důvod, proč počítač běžel přes několik hashů změnou nonce, až nakonec narazil na hash, který splňoval uvedená kritéria obtížnosti.

Dobře, tak přidejme transakci. Předpokládám, že chci poslat Sama, 2,4 coiny, vybereme možnost 1 a dostaneme následující výstup:

The Ultimate Guide to Python and Blockchain: Part 2

Věnujte pozornost poslednímu řádku. Ukazuje dvě transakce, které jsme doposud provedli.

Počkat … dvě transakce? Právě jsme udělali jedno správně?

Ne tak docela. Pamatujete si, že jsme těžili blok před tímto právem? Zde je tedy také zobrazena transakce blokové odměny.

Nakonec si blockchain vytiskneme.

The Ultimate Guide to Python and Blockchain: Part 2

Takže máme dva bloky:

  • Nejprve máme blok geneze, který jsme sami deklarovali. Nonce bylo něco, co jsme do sebe vložili, tj. 23
  • Dále máme druhý blok, který zahrnuje těžební transakci a transakci, kterou jsme sami provedli s „Sam“. Nula bloku je 93

Závěr

Takže, tady to máte. Přinejmenším jsme trochu pracovali blockchain kódováno přes Python. Máte-li zájem dozvědět se více, pokračujte prosím ve svém výzkumu. Cítíme, že python je jazyk, který byste měli ovládat, pokud se chcete pustit do vývoje. Je to nesmírně zábavný a snadno naučitelný jazyk, který může otevřít dveře neomezeným příležitostem.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me