12/05/2022

Cum se creează un Blockchain cu Python?

Știați că Bitcoin este construit pe baza Blockchain-ului? Astăzi vom construi un Blockchain cu Python de la zero.

Ce este Blockchain?

În 2008, Hârtie Bitcoin a fost publicat de o persoană sau un grup necunoscut pe nume Satoshi Nakamoto. Bitcoin a apărut ca o versiune peer-to-peer a numerarului electronic care permitea tranzacții fără a trece prin instituții centralizate (bănci). Majoritatea oamenilor nu știu că în aceeași lucrare, Satoshi a definit un mod distribuit de stocare a informațiilor, cunoscut în zilele noastre sub numele de Blockchain.

Tehnologia blockchain

Pentru a spune simplu, Blockchain este un registru digital partajat, imuabil, care stochează tranzacțiile printr-o rețea descentralizată de computere.

Putem împărți Blockchain-ul în doi termeni simpli:

  • Bloc: Un spațiu în care stocăm tranzacțiile
  • Lanț: un set de înregistrări legate

Aceasta definește Blockchain ca un lanț de blocuri legate, în care fiecare bloc stochează o tranzacție efectuată cu parametri specifici.

Fiecare bloc este construit deasupra altui bloc, creând un lanț ireversibil de blocuri. Cu alte cuvinte, fiecare bloc depinde de altul. Acest lucru se transformă într-un sistem robust și imuabil în care oricine are permisiunile corecte poate revizui integritatea.

Blockchain introduce un set interesant de caracteristici:

  • Imuabilitatea istoriei
  • Persistența informației
  • Fără erori cu datele stocate

O mulțime de sisteme se bazează în prezent pe Blockchain, cum ar fi criptomonedele, transferul de active (NFT) și, eventual, în viitorul apropiat, votul.

Merită menționat că un Python Blockchain nu trebuie să fie un program complex cu mii de linii de cod. În esență, ar fi o listă de tranzacții legate între ele.

Desigur, aceasta a fost o scurtă explicație, dar dacă doriți un ghid complet, am produs un tutorial complet despre Blockchain pentru începători. Asigurați-vă că îl verificați.

Fără întârziere, să construim un Blockchain simplu cu Python.

Construirea unui Blockchain cu Python

Înainte de a începe, să definim ce vom face în acest tutorial:

  • Construiți un sistem Blockchain simplu scris în Python
  • Utilizați Blockchain-ul nostru cu tranzacții prestabilite reprezentate ca șiruri
  • Testați imuabilitatea Blockchain-ului nostru

Nu vom folosi JSON, ci liste Python. Acest lucru ne va permite să simplificăm procesul și să ne concentrăm pe aplicarea conceptelor cheie ale unui Blockchain.

Ce veți avea nevoie pentru a urma acest tutorial:

Crearea clasei Block

Deschideți editorul de cod preferat și creați un fișier main.py. Acesta va fi fișierul cu care vom lucra.

Acum, import hashlib, un modul care ne permite să creăm mesaje criptate unidirecționale. Tehnicile de criptare precum hashingul fac ca Blockchain să creeze tranzacții sigure.

  Cum să blochezi o prezentare PowerPoint de a fi editată

O funcție hash este un algoritm care preia unele date (de obicei un șir codificat) și returnează un identificator unic, adesea numit „digest” sau „semnătură”. Această ultimă parte este vitală; cu o funcție hash, o ușoară diferență în intrare produce un identificator radical diferit ca ieșire. Vom vedea asta în acțiune mai târziu.

Pentru moment, doar importați modulul încorporat hashlib:

# main.py file
"""
A simple Blockchain in Python
"""

import hashlib

Acest modul include majoritatea algoritmilor de hashing de care veți avea nevoie. Rețineți că vom folosi funcția hashlib.sha256().

Acum, să intrăm în GeekCoinBlock, numele nostru blockchain complet original.

class GeekCoinBlock:
    
    def __init__(self, previous_block_hash, transaction_list):

        self.previous_block_hash = previous_block_hash
        self.transaction_list = transaction_list

        self.block_data = f"{' - '.join(transaction_list)} - {previous_block_hash}"
        self.block_hash = hashlib.sha256(self.block_data.encode()).hexdigest()

Știu că acest lucru poate duce la o bucată de cod neplăcută. Să defalcăm fiecare parte în secțiunea următoare.

Explicație GeekCoinBlock

Mai întâi, creăm o clasă numită GeekCoinBlock, un înveliș pentru obiecte care vor avea anumite caracteristici (atribute) și comportamente (metode).

Apoi definim metoda __init__ (numită și constructor), care este invocată de fiecare dată când este creat un obiect GeekCoinBlock.

Această metodă are trei parametri:

  • self (instanța fiecărui obiect)
  • previous_block_hash (o referință la blocul anterior)
  • tranzacție_list (o listă de tranzacții efectuate în blocul curent).

Stocăm hash-ul și lista de tranzacții anterioare și creăm o variabilă de instanță block_data ca șir. Acest lucru nu se întâmplă cu criptomonede reale, în care stocăm acest tip de date ca un alt hash, dar din motive de simplitate, vom stoca fiecare bloc de date ca un șir.

În cele din urmă, creăm block_hash, pe care alte blocuri îl vor folosi pentru a continua lanțul. Aici este locul în care hashlib este util; în loc să creăm o funcție hash personalizată, putem folosi sha256 pre-construit pentru a face blocuri imuabile.

Această funcție primește șiruri (sau octeți) codificați ca parametri. De aceea folosim metoda block_data.encode(). După aceea, apelăm hexdigest() pentru a returna datele codificate în format hexazecimal.

Știu că toate acestea pot fi copleșitoare, așa că haideți să ne jucăm cu hashlib pe un shell Python.

In [1]: import hashlib

In [2]: message = "Python is great"

In [3]: h1 = hashlib.sha256(message.encode())

In [4]: h1
Out[4]: <sha256 ... object @ 0x7efcd55bfbf0>

In [5]: h1.hexdigest()
Out[5]: 'a40cf9cca ... 42ab97'

In [6]: h2 = hashlib.sha256(b"Python is not great")

In [7]: h2
Out[7]: <sha256 ... object @ 0x7efcd55bfc90>

In [8]: h2.hexdigest()
Out[8]: 'fefe510a6a ... 97e010c0ea34'

După cum puteți vedea, o ușoară modificare a intrării, cum ar fi „Python este grozav” în „Python nu este grozav” poate produce un hash total diferit. Toate acestea au de-a face cu integritatea Blockchain. Dacă introduceți o mică schimbare într-un blockchain, hash-ul acestuia se va schimba dramatic. Acesta este motivul pentru care zicala „Nu poți corupi un Blockchain” este adevărată.

  Cum să utilizați funcțiile AND și SAU în Foi de calcul Google

Folosind clasa noastră Block

Vom construi o întreagă clasă Blockchain mai târziu, dar, deocamdată, să folosim clasa noastră Block pentru a crea un lanț de blocuri (Blockchain).

În același fișier, creați câteva tranzacții formate din șiruri simple stocate în variabile, de exemplu:

class GeekCoinBlock:
    ...

t1 = "Noah sends 5 GC to Mark"
t2 = "Mark sends 2.3 GC to James"
t3 = "James sends 4.2 GC to Alisson"
t4 = "Alisson sends 1.1 GC to Noah"

Desigur, GC se referă la GeekCoin

Acum, construiți primul bloc al Blockchain-ului nostru folosind clasa GeekCoinBlock și imprimați atributele acesteia. Luați în considerare că parametrul previous_hash al blocului geneză (primul bloc care precede alte blocuri) va fi întotdeauna un șir arbitrar sau hash, în acest caz, „firstblock”.

block1 = GeekCoinBlock('firstblock', [t1, t2])

print(f"Block 1 data: {block1.block_data}")
print(f"Block 1 hash: {block1.block_hash}")

Apoi, facem același lucru cu al doilea bloc, dar trecând primul bloc hash ca argument precedent_hash.

block2 = GeekCoinBlock(block1.block_hash, [t3, t4])

print(f"Block 2 data: {block2.block_data}")
print(f"Block 2 hash: {block2.block_hash}")

Să rulăm și să analizăm rezultatul pe care îl obținem din această bucată de cod. Încă o dată, introduceți terminalul dvs.:

❯ python main.py
Block 1 data: Noah sends 5 GC to Mark - Mark sends 2.3 GC to James - firstblock
Block 1 hash: 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d
Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d
Block 2 hash: 448c4306caf7f6937b0307f92f27fbea3bb73b3470363dee5026a1209dadcfa8

Deocamdată, vedeți doar text și aproximativ 64 de caractere hash, dar acest lucru reia aproape mecanismul unui Blockchain.

Începi cu un bloc de geneză, baza tuturor celorlalte blocuri.

Oricine poate valida integritatea lanțului și de aceea un Blockchain este un sistem atât de sigur. De exemplu, dacă modificăm ușor conținutul unei tranzacții, spuneți:

t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James" 

Vedem o schimbare dramatică în hash-ul blocurilor.

Block 1 data: Noah sends 5 GC to Mark - Mark sends 3.2 GC to James - firstblock
Block 1 hash: 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c
Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c
Block 2 hash: 569b977306ce88b53e001dca7ba00c03a51c60d6df4650e7657dcd136f2da0ac

Puteți vedea proiectul curent pe aceasta Repoziție GitHub.

Codarea unui Blockchain

Nu este atât de inteligent să ne bazăm integritatea sistemului pe variabile codificate manual, așa că avem nevoie de o altă abordare.

Avem blocurile. Este timpul să construiți o clasă care să le alăture într-un Blockchain.

Să începem prin a șterge tranzacțiile anterioare și blocăm obiectele, apoi utilizăm codul de mai jos.

# main.py

class Blockchain:
    def __init__(self):
        self.chain = []
        self.generate_genesis_block()

    def generate_genesis_block(self):
        self.chain.append(GeekCoinBlock("0", ['Genesis Block']))
    
    def create_block_from_transaction(self, transaction_list):
        previous_block_hash = self.last_block.block_hash
        self.chain.append(GeekCoinBlock(previous_block_hash, transaction_list))

    def display_chain(self):
        for i in range(len(self.chain)):
            print(f"Data {i + 1}: {self.chain[i].block_data}")
            print(f"Hash {i + 1}: {self.chain[i].block_hash}n")

    @property
    def last_block(self):
        return self.chain[-1]

Aceasta este din nou o bucată uriașă de cod. Să defalcăm fiecare parte:

  • self.chain — Lista în care sunt înregistrate toate blocurile. Putem accesa fiecare bloc prin intermediul indexurilor listelor.
  • generate_genesis_block — Adăugați geneza sau primul bloc la lanț. Hashul anterior al blocului este „0”, iar lista de tranzacții este pur și simplu „Blocul Genesis”.
  • create_block_from_transaction — Acest lucru ne permite să anexăm blocuri la lanț doar cu o listă de tranzacții. Ar fi foarte enervant să creăm un bloc manual de fiecare dată când dorim să înregistrăm o tranzacție
  • display_chain — Tipărește lanțul de blocuri cu o buclă for
  • last_block — O proprietate care ne permite să accesăm ultimul element al lanțului. L-am folosit pe metoda create_block_from_transaction.
  Cum să remediați eroarea de conectare a League of Legends (LoL nu a reușit să se conecteze la o sesiune invalidă)

Să testăm acest Blockchain.

# main.py

import hashlib

class GeekCoinBlock:
    ...


class Blockchain:
    ...

t1 = "George sends 3.1 GC to Joe"
t2 = "Joe sends 2.5 GC to Adam"
t3 = "Adam sends 1.2 GC to Bob"
t4 = "Bob sends 0.5 GC to Charlie"
t5 = "Charlie sends 0.2 GC to David"
t6 = "David sends 0.1 GC to Eric"

myblockchain = Blockchain()

myblockchain.create_block_from_transaction([t1, t2])
myblockchain.create_block_from_transaction([t3, t4])
myblockchain.create_block_from_transaction([t5, t6])

myblockchain.display_chain()

Acum, rulați fișierul main.py.

Data 1: Genesis Block - 0
Hash 1: 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e

Data 2: George sends 3.1 GC to Joe - Joe sends 2.5 GC to Adam - 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e
Hash 2: 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5

Data 3: Adam sends 1.2 GC to Bob - Bob sends 0.5 GC to Charlie - 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5
Hash 3: 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589

Data 4: Charlie sends 0.2 GC to David - David sends 0.1 GC to Eric - 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589
Hash 4: 869df2f03c9860767d35b30a46233fbeea89a3000ae5019d1491e3829d1ab929

Felicitări! 🙌 Tocmai ați creat un blockchain Python simplu de la zero.

Acum puteți întări imuabilitatea Blockchain prin utilizarea getter și setter și să implementați alte caracteristici, cum ar fi dovada de lucru, minerit sau orice alt concept pe care l-am explicat în articolul de bază al minării Bitcoin.

Concluzie

Blockchain este tehnologia din spatele Bitcoin, Etherium și orice altă criptomonedă de acolo. În acest articol, ați învățat cum să creați un Blockchain cu Python folosind algoritmi hash precum sha256, clase și obiecte.

Provocarea ta este să creezi un sistem de mining și, de ce nu, să-l implementezi cu un API REST folosind cadre precum Django sau Flask.

Mulți oameni fac avere din criptomonede. Imaginează-ți ce ai putea face dacă ai crea unul singur. 🤑

Continuați să codificați! 👨‍💻

x