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.