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 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
0
Cancella like
0
Amore
0
Buffo
0
arrabbiato
0
Sad
0
Wow
0