Krajnji vodič za Python i Blockchain: 2. dio

Ukratko o prvom dijelu

U prvom smo dijelu naučili osnove Pythona. Saznali smo kako if-elif-else i petlje rade u sustavu. U osnovi smo naučili kako raditi jednostavni kod na Pythonu. U ovom ćemo dijelu započeti stvaranje našeg blockchaina. Dakle, bez daljnjeg odgađanja, krenimo!

Krajnji vodič za Python i Blockchain: 2. dio

Stvaranje našeg Python Blockchaina: Uvođenje popisa

U redu, dovoljno je s osnovama. Ajmo sada stvoriti naš blockchain!

To ćemo učiniti uvođenjem popisa. Popisi su u osnovi skupina podataka koji bi mogli biti bilo koje vrste. Oni su definirani ovako:

Ime_popisa = [element 1, element 2, element 3 …… element n]

Elementi, kao što smo već objasnili, mogu biti bilo koje vrste podataka. To može biti cijeli broj, float, niz ili čak neki drugi popis (koji ćemo koristiti kasnije). Da vidimo kako će ovo funkcionirati. Za ovo ćemo koristiti naš terminal:

Neke stvari koje treba primijetiti iz gornjeg koda.

Zamislite pojedinačne elemente popisa kao blokove u blockchainu. Zapravo nije toliko veliko natezanje, očito ćemo to kasnije učiniti sofisticiranijim. Popis sam povezuje sve ove podatke kako bi dao taj element “lanca” blockchaina.

Sad ćete primijetiti još indeksni broj svakog elementa. Prvi element ima indeks 0. Zbog toga, kada želimo ispisati prvi element, kažemo “blockchain [0]”.

Izmjena elemenata popisa

Popis koji se ne može izmijeniti beskoristan je. Potrebne su vam odredbe za dodavanje i uklanjanje elemenata s popisa. Sada znamo da je u blockchainu sličnom Bitcoin-u nemoguće ukloniti elemente, međutim, još uvijek imamo posla s popisom.

Pa, kako ćemo to učiniti?

Koristit ćemo dvije funkcije popisa:

  • dodati()
  • pop ()

Funkcija dodavanja dodaje više elemenata na popis. Dakle, vratite naš stari popis:

blockchain = [1, 2, 5.6].

Ako mu želimo dodati “Blockgeeks”, jednostavno ćemo reći: blockchain.append (“Blockgeeks”)

Sada kada ga ispisujemo, prikazuje:

[1, 2, 5.6, „Blockgeeks“]

Uklonimo sada neke podatke.

Za to ćemo upotrijebiti funkciju pop () koja će ukloniti posljednji element s popisa. Dakle, ako napravimo blockchain.pop [], sada će ukloniti “Blockgeeks” i prikazati:

[1, 2, 5,6]

Dodavanje elemenata tijekom izvođenja putem funkcija

Sad, zabavimo se.

Koristit ćemo funkciju za dodavanje elemenata na popis tijekom izvođenja. Razmotrite ovaj program:

blockchain = []

def add_list ():

   blockchain.append (3.2)

   ispis (blockchain)

dodaj_popis ()

dodaj_popis ()

dodaj_popis ()

Dakle, definirali smo funkciju nazvanu “add_list ()” koja će dodati 3.2 na blockchain popis svaki put kad se pozove. Jeste li primijetili kako smo proglasili prazan popis s: blockchain = []? To je učinjeno kako bismo vam mogli pokazati kako podatke možete unijeti od nule.

Dakle, ako ga isprintamo, ovako će izgledati. Vratili smo se na Visual Studio Code btw.

Krajnji vodič za Python i Blockchain: 2. dio

Davanje popisa više imovine poput Blockchaina

Do sada smo se prilično bavili normalnim popisom. Međutim, između blokova mora postojati organska veza.

Razlog zašto su blokovi međusobno povezani u stvarnom blockchainu je taj što uključuju i podatke iz prethodnog bloka. To je upravo ono što ćemo učiniti dodavanjem podataka posljednjeg elementa najnovijem elementu putem ugniježđenog popisa. U pythonu možete dobiti podatke posljednjeg popisa pomoću indeksa [-1].

Dakle, ako blockchain ima [1, 2, 3], tada vam blockchain [-1] daje 3.

U svakom slučaju, provjerimo kod, koristit ćemo funkciju input () kako bismo od korisnika dobili vrijednost elementa blockchaina.

element1 = ulaz ("Dajte prvi element blockchaina ")

blockchain = [element1]

def add_list ():

   blockchain.append ([blockchain [-1], 3.2])

   ispis (blockchain)

dodaj_popis ()

dodaj_popis ()

dodaj_popis ()

Dakle, kad ovo isprintate, dobit ćete:

Krajnji vodič za Python i Blockchain: 2. dio

Ok, do sada smo dali neki karakter našem blockchainu, ali još uvijek nemamo ništa blizu našeg radnog modela. Ne brinite što će se uskoro riješiti.

Približavanje funkcionalnom blockchainu

blockchain = []

“” “Odjeljak 1” “”

def get_last_value ():

   """ vađenje posljednjeg elementa blockchain popisa """

   povratak (blockchain [-1])

def add_value (iznos_ transakcije, zadnja_transakcija = [1]):

   blockchain.append ([zadnja_transakcija, iznos_transakcije])

“” “Odjeljak 2” “”

def get_transaction_value ():

   user_value = float (input (‘Unesite iznos transakcije’))

   vrati user_value

def get_user_choice ():

   user_input = input ("Molimo odaberite ovdje: ")

   vrati user_input

“” “Odjeljak 3” “”

def print_block ():

   za blok u blockchainu:

       ispis ("Evo vašeg bloka")

       ispis (blok)

“” “Odjeljak 4” “”

def verify_chain ():

   indeks = 0

   vrijedi = Tačno

   za blok u blockchainu:

       ako je indeks == 0:

           indeks + = 1

           nastaviti

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

           vrijedi = Tačno

       drugo:

           vrijedi = Netačno

           pauza

       indeks + = 1

   povratak valjan

“” “Odjeljak 5” “”

tx_amount = get_transaction_value ()

add_value (tx_amount)

dok je Istina:

   ispis ("Odaberite opciju")

   print (‘Odaberite 1 za dodavanje nove transakcije’)

   print (‘Odaberite 2 za ispis blockchaina’)

   print (‘Odaberite 3 ako želite manipulirati podacima’)

   print (‘Odaberite bilo što drugo ako želite napustiti’)

   user_choice = get_user_choice ()

   

   ako je 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

   

   drugo:

       pauza

   

   ako nije verify_chain ():

       print (‘Blockchainom se manipulira’)

       pauza

Da, znamo da je to ogroman blok koda, međutim, cijelu smo stvar podijelili u različite odjeljke kako bismo vam pomogli razumjeti što se događa i svaki dio koda.

Ono što smo ovdje pokušali napraviti je stvoriti prototip blockchaina koji ne ovisi o statičkoj deklaraciji. Znači, korisnici mogu sami popunjavati podatke tijekom izvođenja. Zbog toga, ako vidite prvi redak koda, vidjet ćete da započinjemo s praznim blockchainom.

U redu, pa krenimo s proučavanjem odjeljaka.

Bilješka: Predlažemo da kopirate gornji kod i zalijepite ga u novi prozor ili datoteku dokumenata. U nastavku ćemo se pozivati ​​na drugi dio koda i bit će vam jednostavnije pratiti.

Odjeljak 1

def get_last_value ():

   """ vađenje posljednjeg elementa blockchain popisa """

   povratak (blockchain [-1])

def add_value (iznos_ transakcije, zadnja_transakcija = [1]):

   blockchain.append ([zadnja_transakcija, iznos_transakcije])

Dakle, ovaj prvi odjeljak već ste sigurno dobro poznavali. Ovdje radimo dvije stvari:

  • Izdvajanje posljednjeg elementa blockchaina
  • Dodavanje posljednjeg elementa zajedno s trenutnim elementom u bloku u blockchain.

Pogledajte argumente u funkciji add_value:

  • Zadnja_transakcija
  • Iznos transakcije

Transaction_amount je vrijednost transakcije koja će se staviti u blockchain. S druge strane, varijabla last_transaction predstavlja vrijednost transakcije u posljednjem bloku koji će se staviti u novi blok.

Pa, zašto inicijaliziramo last_transaction na [1]?

To se radi čisto kako bi se izbjegla pogreška tijekom izvođenja. Razmislite o ovome, ako imamo posla s prvim blokom blockchaina, tada neće imati nikakvu “last_transaction” zar ne? Trebat će vam najmanje dva bloka da bi postojao koncept “last_transaction”. Zbog toga se, kako bi se uklonila mogućnost bilo kakve pogreške u prvom bloku, last_transaction inicijalizira u [1].

Odjeljak 2

def get_transaction_value ():

   user_value = float (input (‘Unesite iznos transakcije’))

   vrati user_value

def get_user_choice ():

   user_input = input ("Molimo odaberite ovdje: ")

   vrati user_input

Nazovimo ovaj odjeljak ulaznim odjeljkom. Ovdje imamo dvije funkcije:

  • get_transaction_value ()
  • get_user_choice ()

U prvoj funkciji tražimo od korisnika da u blok-lanac unese vrijednost iznosa transakcije koju želi unijeti. Sad zapamtite, funkcija input () vraća vrijednost niza. Dakle, koristimo funkciju float () da bismo taj broj promijenili u plutajući broj.

U drugoj funkciji tražit ćemo od korisnika da unese svoj izbor.

Sad se možda pitate: “O kojem izboru govorite?”

Pa, uzmite odjeljak 5. Konkretno, loop. Vidite li opciju koju tamo tražimo?

ispis ("Odaberite opciju")

print (‘Odaberite 1 za dodavanje nove transakcije’)

print (‘Odaberite 2 za ispis blockchaina’)

print (‘Odaberite 3 ako želite manipulirati podacima’)

print (‘Odaberite bilo što drugo ako želite napustiti’)

Dakle, funkcija get_user_choice () koristi se za odabir od korisnika kako bi se razumjelo što želi učiniti.

Odjeljak 3

def print_block ():

   za blok u blockchainu:

       ispis ("Evo vašeg bloka")

       ispis (blok)

Ovo je vrlo jednostavan odjeljak. Petlju for koristimo za ispis svakog bloka blockchaina.

Odjeljak 4

def verify_chain ():

   indeks = 0

   vrijedi = Tačno

   za blok u blockchainu:

       ako je indeks == 0:

           indeks + = 1

           nastaviti

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

           vrijedi = Tačno

       drugo:

           vrijedi = Netačno

           pauza

       indeks + = 1

   povratak valjan

Ovo je nešto što do sada nismo radili.

U ovom odjeljku provjeravamo valjanost blockchaina. Što točno pod tim podrazumijevamo.

Kao što možda znate, blockchain bi trebao biti nepromjenjiv. Budući da još ne koristimo nijednu hash funkciju, upotrijebimo nešto drugo kako bismo pokazali da je lanac promijenjen. Zbog toga u ovoj funkciji koristimo funkciju verify_chain.

Pa, što mi radimo ovdje?

Prvo, imamo dvije varijable:

  • Indeks = Brojač pomoću kojeg ćemo prolaziti kroz blokove u blockchainu
  • Valid = Booleova varijabla koja će vratiti True ili False kao konačnu vrijednost ove funkcije

Nakon toga koristimo petlju for za prolazak kroz blockchain, vrlo slično prethodnom odjeljku gdje smo koristili petlju za ispis blokova. Unutar petlje koristimo tri uvjetne izjave, prođimo kroz svaku od njih:

Pododjeljak if

Ovo provjerava je li indeks 0 ili nije. Ako jest, indeks se uvećava za 1

Pododjeljak elif

Ovo je dio u kojem provjeravamo je li izvršeno neko neovlašteno miješanje ili ne. Da biste razumjeli kako ovo funkcionira, zamislite ovaj scenarij.

Krajnji vodič za Python i Blockchain: 2. dio

Kao što vidite, prvi element bloka B je sadržaj njegovog prethodnog bloka. Dakle, u ovom pododjeljku provjeravamo je li prvi element Bloka jednak elementima prethodnog bloka. Ako je to onda je ova funkcija True, inače vraća False.

Odjeljak 5

tx_amount = get_transaction_value ()

add_value (tx_amount)

dok je Istina:

   ispis ("Odaberite opciju")

   print (‘Odaberite 1 za dodavanje nove transakcije’)

   print (‘Odaberite 2 za ispis blockchaina’)

   print (‘Odaberite 3 ako želite manipulirati podacima’)

   print (‘Odaberite bilo što drugo ako želite napustiti’)

   user_choice = get_user_choice ()

   

   ako je 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

   

   drugo:

       pauza

   

   ako nije verify_chain ():

       print (‘Blockchainom se manipulira’)

       Pauza

Dakle, ovo je dugačak odjeljak, zbog čega ćemo ga morati razvrstati u različite pododjeljke (opet).

Pododjeljak 1: Inicijalizacija

tx_amount = get_transaction_value ()

add_value (tx_amount

Počinjemo inicijalizacijom prvog bloka blockchaina. Dobivamo vrijednost iznosa transakcije (tx_amount), a zatim vrijednost unosimo u blok blockchaina.

Pododjeljak 2: Davanje izbora

dok je Istina:

   ispis ("Odaberite opciju")

   print (‘Odaberite 1 za dodavanje nove transakcije’)

   print (‘Odaberite 2 za ispis blockchaina’)

   print (‘Odaberite 3 ako želite manipulirati podacima’)

   print (‘Odaberite bilo što drugo ako želite napustiti’)

   user_choice = get_user_choice ()

U redu, dakle, Pododjeljak 1 nadalje, svi ostali pododjeljci izvršit će se unutar ove while petlje. Dakle, prva stvar koju radimo je davanje mogućnost korisnicima da odaberu što točno žele učiniti:

  • Dodajte novu transakciju
  • Ispišite blockchain
  • Manipulirajte podacima
  • Zatvorite postupak

Nakon toga user_choice pohranjuje podatke korisnika

Pododjeljak 3: if-elif-elif-else

Dakle, ovisno o izboru, imamo 4 mogućnosti. Kôd izgleda ovako:

ako je 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

   drugo:

       pauza

  • Prvo dodamo transakciju u blockchain. Unos korisnika popunjavamo i pohranjujemo u tx_amount. Nakon što imamo vrijednost transakcije, dodajemo je, zajedno s vrijednošću elemenata iz zadnjeg bloka, u blockchain
  • Drugo, pozivamo funkciju ispisa za ispis blockchaina
  • Treće, je funkcija manipulacije. Uključili smo ovo samo da bismo vam pokazali kako će ovaj blockchain reagirati ako se podacima manipulira. Dakle, ovdje se događa da prvi element blockchaina promijenimo u 2. To djeluje samo ako blockchain ima više od 1 elementa (ako uvjet provjerava to)

    Provjerite sljedeći pododjeljak da biste saznali što se dalje događa

  • Posljednji je dio prilično jednostavan. Ako korisnik pošalje neku drugu opciju, tada se aktivira blok else koji jednostavno koristi “break” za izlazak iz while petlje

Pododjeljak 4: Poziv za verifikaciju

ako nije verify_chain ():

       print (‘Blockchainom se manipulira’)

       Pauza

Ako korisnik odluči manipulirati blockchainom, to utječe na ovaj pododjeljak. Sad ne zaboravite, verify_chain () vraća logičku vrijednost:

  • Pravi
  • Lažno

Veri_chain () vraća False ako je izvršena manipulacija.

Sada ovaj pododjeljak koristi ne ključna riječ koja pretvara False u True. Ovo zauzvrat aktivira funkciju ispisa unutar if-bloka za ispis “Blockchain manipulated”.

Rezultati programa

U redu, sada znamo kako program radi. Provjerimo izlaze.

Krajnji vodič za Python i Blockchain: 2. dio

Dakle, da prođemo kroz ono što smo gore učinili

U naš blockchain unijeli smo 3 vrijednosti: 23,5, 43,1 i 5,89

Zatim smo ispisali blockchain koji daje ovo:

Krajnji vodič za Python i Blockchain: 2. dio

Zatim smo pokušali manipulirati našim blockchainom mijenjajući podatke, ali naš ugrađeni sustav provjere je to uhvatio i dao ovaj izlaz:

Krajnji vodič za Python i Blockchain: 2. dio

Dobro, tako da imamo zasad postavljenu prilično dobru strukturu. Međutim, još uvijek moramo uključiti raspršivanje i značajke provjere rada za naš kôd. Dakle, budući da već znamo što su popisi, upoznajmo se s tuplevima i rječnicima.

Kornice i rječnici

Tuplevi i rječnici su strukture podataka zajedno s popisima. Usporedimo ovo troje i doznajmo kako funkcioniraju.

Krajnji vodič za Python i Blockchain: 2. dio

Korice su prilično slične Popisima, međutim, ne mogu se uređivati ​​jednom stvorene. S druge strane, rječnici imaju jedinstvene identifikatore poput NAME1 I NAME2 u našem primjeru iznad kojih pohranjuju vrijednosti. Jednom stvorene mogu se uređivati.

Te ćemo strukture podataka koristiti u našem novom i poboljšanom blockchainu.

Možda se pitate: “Kakva je svrha to raditi?”

Pa, transakcije, blokovi itd. Sadrže puno metapodataka koje treba pohraniti. Razmislite o svim metapodacima koji se mogu pohraniti u transakciji:

  • ID pošiljatelja
  • Id primatelja
  • Datum transakcije
  • Iznos transakcije

Dodavanje svih ovih podataka pomaže nam u praćenju naših transakcija.

Dodavanje značajki rudarstva i dokaza o radu

Dakle, prva stvar koju moramo učiniti je dodati značajke rudarstva i dokaza o radu. Rudarstvo je postupak kojim rudari rješavaju kriptografski teške zagonetke kako bi pronašli blokove za dodavanje u blockchain. Za rudarenje ovih blokova rudari dobivaju nagradu koja se naziva blok nagrada.

S druge strane, dokaz o radu metoda je rudarenja i konsenzusa koja se koristi u mnogim kriptovalutama poput Bitcoina. Koristit ćemo dokaz o radu u našem blockchainu.

Kad bismo saželi kako Proof Of Work Protocol radi s blockchainom.

  • Rudari rješavaju kriptografske zagonetke kako bi “minirali” blok kako bi ga dodali u blockchain.
  • Ovaj proces zahtijeva ogromnu količinu energije i računalnu upotrebu. Zagonetke su dizajnirane na način koji otežava i oporezuje sustav.
  • Kada rudar riješi zagonetku, oni predstavljaju svoj blok mreži na provjeru.
  • Provjera pripadnosti bloka lancu ili ne izuzetno je jednostavan postupak.

U redu, pogledajmo naš kod:

“” “Odjeljak 1” “”

uvoz hashlib

uvoz json

nagrada = 10,0

blok geneze = {

   ‘previous_hash’: ”,

   ‘indeks’: 0,

   ‘transakcija’: [],

   ‘nonce’: 23

}

blockchain = [blok geneze]

otvorene transakcije = []

owner = ‘Blockgeeks’

def hash_block (blok):

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

“” “Odjeljak 2” “”

def valid_proof (transakcije, last_hash, nonce):

   pogoditi = (str (transakcije) + str (last_hash) + str (nonce)). encode ()

   pogađa_haš = hashlib.sha256 (pogoditi) .hexdigest ()

   ispis (pogodi_haš)

   vrati pogodi_haš [0: 2] == ’00’

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (zadnji_blok)

   nonce = 0

   iako nije valjano_dokazano (otvorene_transakcije, last_hash, nonce):

       nonce + = 1

   povratak nonce

“” “Odjeljak 3” “”

def get_last_value ():

   """ vađenje posljednjeg elementa blockchain popisa """

   povratak (blockchain [-1])

def add_value (primatelj, pošiljatelj = vlasnik, iznos = 1,0):

   transakcija = {‘pošiljatelj’: pošiljatelj,

   ‘primatelj’: primatelj,

   ‘iznos’: iznos}

   open_transaction.append (transakcija)

“” “Odjeljak 4” “”

def mine_block ():

   last_block = blockchain [-1]

   hashed_block = hash_block (zadnji_blok)

   nonce = pow ()

   reward_transaction = {

           ‘sender’: ‘RUDARSTVO’,

           ‘primatelj’: vlasnik,

           ‘iznos’: nagrada

       }

   open_transaction.append (nagrada_transakcija)

   blok = {

       ‘previous_hash’: hashed_block,

       ‘indeks’: len (blockchain),

       ‘transakcija’: otvorene_transakcije,

       ‘nonce’: nonce

   }

   blockchain.append (blok)

“” “Odjeljak 5” “”

def get_transaction_value ():

   tx_recipient = input (‘Unesite primatelja transakcije:’)

   tx_amount = float (input (‘Unesite iznos transakcije’))

   vrati tx_recipient, tx_amount

def get_user_choice ():

   user_input = input ("Molimo odaberite ovdje: ")

   vrati user_input

“” “Odjeljak 6” “”

def print_block ():

   za blok u blockchainu:

       ispis ("Evo vašeg bloka")

       ispis (blok)

“” “Odjeljak 7” “”

dok je Istina:

   ispis ("Odaberite opciju")

   print (‘Odaberite 1 za dodavanje nove transakcije’)

   print (‘Odaberite 2 za iskopavanje novog bloka’)

   print (‘Odaberite 3 za ispis blockchaina’)

   print (‘Odaberite bilo što drugo ako želite napustiti’)

   user_choice = get_user_choice ()

   

   ako je user_choice == 1:

       tx_data = get_transaction_value ()

       primatelj, iznos = tx_data

       add_value (primatelj, iznos = iznos)

       ispis (otvorene_transakcije)

   elif user_choice == 2:

       mine_block ()

   elif user_choice == 3:

       print_block ()

   

   drugo:

       pauza

Ok, analizirajmo kôd.

Odjeljak 1

uvoz hashlib

uvoz json

nagrada = 10,0

blok geneze = {

   ‘previous_hash’: ”,

   ‘indeks’: 0,

   ‘transakcija’: [],

   ‘nonce’: 23

}

blockchain = [blok geneze]

otvorene transakcije = []

owner = ‘Blockgeeks’

def hash_block (blok):

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

Prvo što ovdje radimo je uvoz hash knjižnica. Mi posebno uvozimo:

  • hashlib: za korištenje njihovih funkcija raspršivanja
  • json: Ovaj nam paket treba za pretvaranje bloka iz rječnika u niz.

Nakon toga proglašavamo “nagradu”, globalnu varijablu koja će pohraniti nagradu za rudarski blok koju ćemo dati rudarima za iskopavanje bloka.

Sljedeći imamo svoj blok geneze. Blok geneze prvi je blok u blockchainu. U našem bloku koristimo 4 metapodataka:

  • Prethodno_haš: Pohranjuje hash prethodnog bloka. Ovo će biti prazan niz jer blok geneze neće imati prethodno heširanje.
  • Indeks: Ovo je indeks bloka u blockchainu. Budući da je geneza blok prvi blok, njegov je indeks inicijaliziran na 0. Zapamtite u programskoj terminologiji, prvi element na popisu nalazi se na 0 poziciji
  • Transakcija: Transakcija koja je pohranjena unutar blockchaina. Budući da ovo nema, to je prazan popis.
  • Nonce: Objasnit ćemo to kasnije. Inicijalizira se na 23 što je lažna vrijednost.

Nakon što se geneza blok inicijalizira, on se dodaje blockchainu u sljedećem koraku putem blockchain = [genesis_block].

Otvorene transakcije: Popis koji upravlja svim nepodmirenim transakcijama u blockchainu. To je na početku prazan popis.

Budući da smo vlasnik i pošiljatelj ove transakcije, inicijalizirali smo to odmah na početku

Sljedeće imamo funkciju raspršivanja hash_block ()

Unutar njega vraćamo hash bloka pomoću ovog izraza:

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

Pa, da vidimo što radimo ovdje:

  • Korištenje hashlibovog algoritma hashiranja sha256.
  • Tada se pokreće funkcija json.dumps i pretvara blok koji je rječnik u niz u obliku json. Međutim, hashlib to ne može pročitati pa ćemo sljedeće ….
  • Funkcija encode (). Ovo pretvara json formatirani niz u UTF-8 niz koji je čitljiv hashlib-om.
  • Izlaz hashliba je hash bajta. Tako napokon koristimo metodu hexdigest () da bismo je pretvorili u normalni niz.

Odjeljak 2

def valid_proof (transakcije, last_hash, nonce):

   pogoditi = (str (transakcije) + str (last_hash) + str (nonce)). encode ()

   pogađa_haš = hashlib.sha256 (pogoditi) .hexdigest ()

   ispis (pogodi_haš)

   vrati pogodi_haš [0: 2] == ’00’

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (zadnji_blok)

   nonce = 0

   iako nije valjano_dokazano (otvorene_transakcije, last_hash, nonce):

       nonce + = 1

   povratak nonce

U odjeljku 2 imamo dvije funkcije:

  • Vrijedi_otporno
  • Funkcija praha

valjano_otporno ()

def valid_proof (transakcije, last_hash, nonce):

   pogoditi = (str (transakcije) + str (last_hash) + str (nonce)). encode ()

   pogađa_haš = hashlib.sha256 (pogoditi) .hexdigest ()

   ispis (pogodi_haš)

   vrati pogodi_haš [0: 2] == ’00’

Dakle, funkcija valid_proof () ima tri argumenta:

  • Transakcije: Transakcije unutar bloka
  • Posljednje raspršivanje: Raspršivanje zadnjeg bloka
  • Nonce

Ok, pa što je zapravo nonce? Pa prije toga, moramo znati što znači poteškoća. “Teškoća” je ideja da rudarstvo bude što teže. Ako rudarenje nije teško, tada će se svi novčići u sustavu lako ispumpati, što će ih učiniti apsolutno beskorisnima.

Dakle, način na koji izračunavamo hash sustava je spajanjem transakcija, hasha posljednjeg bloka i noncea u jedan niz, a zatim ih raspršivanjem. Hash je prihvatljiv samo ako su prva dva njegova slova nule.

Tako dovodimo poteškoće. Nemoguće je predvidjeti kako će ispasti hash i to je više sretno izvlačenje. Zbog toga je izuzetno teško dobiti hash koji započinje određenim uzorkom (kao što je 2 0s).

Funkcija vraća True ako program ima valjano hash i False ako nema.

Funkcija pow ()

Slijedi dokaz rada ili funkcija pow ().

def pow ():

   last_block = blockchain [-1]

   last_hash = hash_block (zadnji_blok)

   nonce = 0

   iako nije valjano_dokazano (otvorene_transakcije, last_hash, nonce):

       nonce + = 1

   povratak nonce

Ova je funkcija prilično jednostavna:

  • Prvo izvlačimo zadnji blok iz blockchaina i stavljamo ga u last_block
  • Zatim heširamo last_block i stavljamo ih u last_hash
  • Loops petlje nastavlja se izvoditi dok funkcija valid_proof ne vrati TRUE. (The ne convert će pretvoriti TRUE u FALSE i time izbiti iz petlje)
  • Nonce se zatim vraća.

Odjeljak 3

def get_last_value ():

   """ vađenje posljednjeg elementa blockchain popisa """

   povratak (blockchain [-1])

def add_value (primatelj, pošiljatelj = vlasnik, iznos = 1,0):

   transakcija = {‘pošiljatelj’: pošiljatelj,

   ‘primatelj’: primatelj,

   ‘iznos’: iznos}

   open_transaction.append (transakcija)

U ovom odjeljku opet imamo dvije funkcije:

  • get_last_value
  • dodatna vrijednost

Get_last_value ()

Ovaj je prilično jednostavan. Izdvaja zadnji blok blockchaina.

dodatna vrijednost()

Funkcija uzima metapodatke transakcije, i to:

  • Ime pošiljatelja
  • Ime primatelja
  • Iznos transakcije

Nakon toga, transakcija se dodaje popisu open_transaction.

Odjeljak 4

def mine_block ():

   last_block = blockchain [-1]

   hashed_block = hash_block (zadnji_blok)

   nonce = pow ()

   reward_transaction = {

           ‘sender’: ‘RUDARSTVO’,

           ‘primatelj’: vlasnik,

           ‘iznos’: nagrada

       }

   open_transaction.append (nagrada_transakcija)

   blok = {

       ‘previous_hash’: hashed_block,

       ‘indeks’: len (blockchain),

       ‘transakcija’: otvorene_transakcije,

       ‘nonce’: nonce

   }

   blockchain.append (blok)

U ovom odjeljku imamo jednu funkciju, funkciju mine_block () koja će vam omogućiti miniranje blokova

Dakle, u ovoj će se funkciji dogoditi sljedeće:

  • Izdvojite zadnji blok blockchaina i stavite ga u last_block
  • Hash zadnji blok
  • Upotrijebite funkciju pow () za izdvajanje noncea
  • Stvorite nagradu_transaction koja nagrađuje rudara, tj. Nas s iznosom nagrade koji smo ranije postavili (10,0 kovanica)
  • Nagrada_transakcija se dodaje na popis open_transaction
  • Konačno, s novim odobrenim noncem napokon imamo novi blok koji nam pomaže dobiti metapodatke novog bloka,
  • Novi blok je dodan blockchainu

Odjeljak 5

def get_transaction_value ():

   tx_recipient = input (‘Unesite primatelja transakcije:’)

   tx_amount = float (input (‘Unesite iznos transakcije’))

   vrati tx_recipient, tx_amount

def get_user_choice ():

   user_input = input ("Molimo odaberite ovdje: ")

   vrati user_input

U ovom odjeljku imamo dvije funkcije:

  • get_transaction_value ()
  • get_user_choice ()

# 1 get_transaction_value ()

Ova funkcija uzima metapodatke o transakciji, kao što su ime primatelja i iznos transakcije.

Istodobno, pogledajte povratnu izjavu.

vrati tx_recipient, tx_amount

Ova funkcija vraća koricu (ranije smo razgovarali o korpicama, sjećate se?)

# 2 get_user_choice

Ova funkcija u osnovi preuzima izbor korisnika i vraća ga. Ovo je prilično slično funkciji get_user_choice () u prethodnom programu.

Odjeljak 6

def print_block ():

   za blok u blockchainu:

       ispis ("Evo vašeg bloka")

       ispis (blok)

Slično prethodnom programu, ovo je funkcija ispisa koja ispisuje blockchain.

Odjeljak 7

dok je Istina:

   ispis ("Odaberite opciju")

   print (‘Odaberite 1 za dodavanje nove transakcije’)

   print (‘Odaberite 2 za iskopavanje novog bloka’)

   print (‘Odaberite 3 za ispis blockchaina’)

   print (‘Odaberite bilo što drugo ako želite napustiti’)

   user_choice = get_user_choice ()

   

   ako je user_choice == 1:

       tx_data = get_transaction_value ()

       primatelj, iznos = tx_data

       add_value (primatelj, iznos = iznos)

       ispis (otvorene_transakcije)

   elif user_choice == 2:

       mine_block ()

   elif user_choice == 3:

       print_block ()

   

   drugo:

       pauza

Ovo je također slično prošlom programu. Korisnik ima mogućnost izbora:

  • Unesite transakciju
  • Mine blok
  • Ispišite blockchain

Provjerimo sada izlaze programa.

Izlaz programa

Prvo i najvažnije, odaberimo opciju 2 i iskopamo blok. Kada to učinite, dobit ćemo sljedeći blok raspršivanja:

Krajnji vodič za Python i Blockchain: 2. dio

To djeluje zapanjujuće dok ne malo pažljivije pogledate i provjerite posljednje hash:

“001f946e8c2172affa830ef27761270aab2de515ffac8ae90e5de95b48dc366c”

Vidite li što je toliko posebno u ovom hashu?

Sjećate se poteškoće koju smo ranije postavili? Mi smo posebno tražili hash koji je započeo s “00”. Zbog toga je računalo prolazilo kroz više hashova mijenjajući nonce dok konačno nije naišlo na hash koji je ispunio zadane kriterije težine.

U redu, dodajmo sada transakciju. Pretpostavimo da želim poslati Samu, 2.4 kovanice, odabrat ćemo opciju 1 i dobiti sljedeći izlaz:

Krajnji vodič za Python i Blockchain: 2. dio

Obratite pažnju na zadnji redak. Prikazuje dvije transakcije koje smo do sada obavili.

Čekajte … dvije transakcije? Upravo smo napravili jedno dobro?

Ne baš. Sjećate se da smo prije ovoga iskopali blok? Dakle, ovdje je prikazana i blok transakcija nagrade.

Napokon, isprintajmo blockchain.

Krajnji vodič za Python i Blockchain: 2. dio

Dakle, imamo dva bloka:

  • Prvo, imamo blok geneze koji smo sami proglasili. Nonce je bilo nešto što smo stavili u sebe tj. 23
  • Dalje, imamo drugi blok, koji uključuje rudarsku transakciju i transakciju koju smo sami obavili sa “Samom”. Nonce bloka je 93

Zaključak

Pa, eto vam. Mi barem donekle radimo blockchain kodirano putem Pythona. Ako vas zanima više, nastavite s vlastitim istraživanjem. Smatramo da je python jezik koji biste trebali svladati ako se želite baviti razvojem. To je izuzetno zabavan i lak za učenje jezik koji može otvoriti vrata za neograničene mogućnosti.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
map