Una semplice implementazione di una blockchain in PHP

Un esempio introduttivo in PHP per creare blocchi, calcolare gli hash e verificare l’integrità di una catena locale.

Una semplice implementazione di una blockchain in PHP

Una piccola blockchain in PHP aiuta a capire il collegamento tra blocchi, hash e prova di lavoro. Questo esempio è didattico: usa una sola catena in memoria e non gestisce transazioni firmate né una rete decentralizzata.

1. Definire la classe Block

Ogni blocco conserva dati, timestamp, nonce, hash del blocco precedente e hash proprio. Il metodo mine() cerca un hash con il numero richiesto di zeri iniziali.

<?php
class Block {
    public int $timestamp;
    public int $nonce = 0;
    public string $hash;

    public function __construct(
        public string $data,
        public string $previousHash = '0'
    ) {
        $this->timestamp = time();
        $this->hash = $this->calculateHash();
    }

    public function calculateHash(): string {
        return hash('sha256', $this->previousHash . '|' .
            $this->timestamp . '|' . $this->data . '|' . $this->nonce);
    }

    public function mine(int $difficulty): void {
        $prefix = str_repeat('0', $difficulty);
        while (substr($this->hash, 0, $difficulty) !== $prefix) {
            $this->nonce++;
            $this->hash = $this->calculateHash();
        }
    }
}

2. Definire la classe Blockchain

La catena crea un blocco iniziale e collega ogni nuovo blocco al precedente. isValid() controlla hash, collegamenti e requisito di prova di lavoro per tutti i blocchi.

class Blockchain {
    public array $chain = [];
    public int $difficulty = 2;

    public function __construct() {
        $genesis = new Block('Genesis Block');
        $genesis->mine($this->difficulty);
        $this->chain[] = $genesis;
    }

    public function addBlock(string $data): void {
        $block = new Block($data, $this->chain[count($this->chain) - 1]->hash);
        $block->mine($this->difficulty);
        $this->chain[] = $block;
    }

    public function isValid(): bool {
        foreach ($this->chain as $index => $block) {
            if ($block->hash !== $block->calculateHash()) return false;
            if (substr($block->hash, 0, $this->difficulty) !==
                str_repeat('0', $this->difficulty)) return false;
            if ($index === 0) {
                if ($block->previousHash !== '0') return false;
            } elseif ($block->previousHash !== $this->chain[$index - 1]->hash) {
                return false;
            }
        }
        return true;
    }
}

3. Provare la catena

Aggiungiamo due blocchi e poi alteriamo i dati del primo. La seconda verifica restituisce false.

$chain = new Blockchain();
$chain->addBlock('Alice sends 10 coins to Bob');
$chain->addBlock('Bob sends 5 coins to Carol');
var_dump($chain->isValid()); // true

$chain->chain[1]->data = 'Alice sends 1000 coins to Bob';
var_dump($chain->isValid()); // false

Non è una criptovaluta pronta all’uso: mancano firme digitali, regole sulle transazioni, persistenza, consenso tra nodi e protezione contro molte forme di attacco.

Share

What's Your Reaction?

Like Like 0
Cancella like Cancella like 0
Amore Amore 0
Buffo Buffo 0
arrabbiato arrabbiato 0
Sad Sad 0
Wow Wow 0