Come creare una semplice blockchain in Python

In questo articolo esploreremo come costruire una semplice blockchain utilizzando Python, passo dopo passo. Questo progetto dimostrativo è utile per comprendere i concetti fondamentali dietro il funzionamento delle blockchain: struttura dei blocchi, hashing, proof of work e validazione della catena.

1. Struttura di base

Una blockchain è una lista concatenata di blocchi, ciascuno contenente dati, un hash del blocco precedente e un proprio hash.


import hashlib
import time

class Block:
    def __init__(self, index, previous_hash, timestamp, data, nonce=0):
        self.index = index
        self.previous_hash = previous_hash
        self.timestamp = timestamp
        self.data = data
        self.nonce = nonce
        self.hash = self.calculate_hash()

    def calculate_hash(self):
        value = f"{self.index}{self.previous_hash}{self.timestamp}{self.data}{self.nonce}"
        return hashlib.sha256(value.encode()).hexdigest()
  

2. Creare la Blockchain

Ora costruiamo una classe Blockchain che gestisce la catena di blocchi e contiene la logica per aggiungere nuovi blocchi.


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

    def create_genesis_block(self):
        return Block(0, "0", time.time(), "Genesis Block")

    def get_latest_block(self):
        return self.chain[-1]

    def add_block(self, new_block):
        new_block.previous_hash = self.get_latest_block().hash
        new_block.hash = new_block.calculate_hash()
        self.chain.append(new_block)
  

3. Proof of Work

Per rendere la blockchain sicura, implementiamo un semplice algoritmo di proof of work che richiede al blocco di avere un hash con un numero di zeri iniziali definito dalla difficoltà.


    def proof_of_work(self, block, difficulty):
        target = "0" * difficulty
        while block.hash[:difficulty] != target:
            block.nonce += 1
            block.hash = block.calculate_hash()
        return block
  

4. Validazione della catena

Infine, possiamo aggiungere una funzione per verificare l'integrità della blockchain.


    def is_chain_valid(self):
        for i in range(1, len(self.chain)):
            current = self.chain[i]
            previous = self.chain[i - 1]

            if current.hash != current.calculate_hash():
                return False

            if current.previous_hash != previous.hash:
                return False

        return True
  

5. Esempio d'uso

Mettiamo tutto insieme e creiamo una nuova blockchain, aggiungendo blocchi con la proof of work.


my_blockchain = Blockchain()
difficulty = 4

data_list = ["Transazione 1", "Transazione 2", "Transazione 3"]

for data in data_list:
    new_block = Block(len(my_blockchain.chain), "", time.time(), data)
    valid_block = my_blockchain.proof_of_work(new_block, difficulty)
    my_blockchain.add_block(valid_block)

print("Blockchain valida?", my_blockchain.is_chain_valid())
  

Conclusione

In questo esempio abbiamo implementato una semplice blockchain in Python, compresa la proof of work e la validazione della catena. Anche se semplificata, questa implementazione aiuta a comprendere i principi di base che rendono sicura una blockchain.

Torna su