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.

Torna su