Come creare una semplice blockchain in PHP

Come creare una semplice blockchain in PHP

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.