In questo articolo vedremo come implementare da zero una semplice blockchain utilizzando PHP. Questa implementazione base serve a scopo didattico per comprendere i principi fondamentali delle blockchain.
1. Cos'è una blockchain?
Una blockchain è una catena di blocchi dove ogni blocco contiene dei dati, un hash crittografico del blocco e l'hash del blocco precedente. Questo la rende immutabile e verificabile.
2. Struttura di un blocco
Ogni blocco conterrà:
- Dati (ad esempio transazioni)
- Timestamp
- Hash del blocco
- Hash del blocco precedente
Codice PHP per il blocco:
class Block {
public int $index;
public int $timestamp;
public array $data;
public string $previousHash;
public string $hash;
public function __construct(int $index, array $data, string $previousHash = '') {
$this->index = $index;
$this->timestamp = time();
$this->data = $data;
$this->previousHash = $previousHash;
$this->hash = $this->calculateHash();
}
public function calculateHash(): string {
return hash('sha256', $this->index . $this->timestamp . json_encode($this->data) . $this->previousHash);
}
}
3. Creazione della Blockchain
La blockchain sarà una lista di blocchi con un blocco iniziale (genesis block).
Codice PHP per la Blockchain:
class Blockchain {
public array $chain;
public function __construct() {
$this->chain = [$this->createGenesisBlock()];
}
private function createGenesisBlock(): Block {
return new Block(0, ['genesis' => true], '0');
}
public function getLatestBlock(): Block {
return end($this->chain);
}
public function addBlock(array $data): void {
$latestBlock = $this->getLatestBlock();
$newBlock = new Block(count($this->chain), $data, $latestBlock->hash);
$this->chain[] = $newBlock;
}
public function isValid(): bool {
for ($i = 1; $i < count($this->chain); $i++) {
$current = $this->chain[$i];
$previous = $this->chain[$i - 1];
if ($current->hash !== $current->calculateHash()) {
return false;
}
if ($current->previousHash !== $previous->hash) {
return false;
}
}
return true;
}
}
4. Utilizzo della blockchain
Creiamo un'istanza della blockchain e aggiungiamo alcuni blocchi:
$myBlockchain = new Blockchain();
$myBlockchain->addBlock(['amount' => 100]);
$myBlockchain->addBlock(['amount' => 200]);
echo json_encode($myBlockchain, JSON_PRETTY_PRINT);
5. Verifica dell'integrità
È possibile verificare l'integrità della catena con il metodo isValid()
. Se qualche dato viene manomesso, la verifica fallirà.
if ($myBlockchain->isValid()) {
echo "La blockchain è valida.";
} else {
echo "La blockchain non è valida!";
}
Conclusione
Questa semplice implementazione in PHP aiuta a capire i concetti fondamentali delle blockchain. Ovviamente, un sistema reale è molto più complesso, con meccanismi di consenso, nodi distribuiti e sicurezza avanzata.