CREAR UN ÁRBOL DE MERKLE CON PHP: GUÍA Y EJEMPLO
Este es un ejemplo en php sobre el post árbol de Merkle, usando SHA-256, como es habitual en Bitcoin y muchas blockchains.Ejemplo básico en php.
//
// Implementación sencilla de Merkle Tree en PHP
// - Usa SHA-256
// - Maneja número impar de hojas duplicando la última
//
class MerkleTree {
private array $leaves = [];
private ?string $root = null;
public function __construct(array $data) {
// Convertimos cada elemento a su hash (hojas)
$this->leaves = array_map(fn($item) => $this->hash($item), $data);
$this->build();
}
private function hash(string $data): string {
return hash('sha256', $data);
}
private function build(): void {
$level = $this->leaves;
while (count($level) > 1) {
$nextLevel = [];
for ($i = 0; $i < count($level); $i += 2) {
$left = $level[$i];
$right = $level[$i + 1] ?? $left; // duplicamos si es impar
$combined = $left . $right;
$parentHash = $this->hash($combined);
$nextLevel[] = $parentHash;
}
$level = $nextLevel;
}
$this->root = $level[0] ?? null;
}
public function getRoot(): ?string {
return $this->root;
}
// Bonus: mostrar todos los niveles (para entender cómo se construye)
public function getLevels(): array {
$levels = [];
$level = $this->leaves;
$levels[] = $level;
while (count($level) > 1) {
$nextLevel = [];
for ($i = 0; $i < count($level); $i += 2) {
$left = $level[$i];
$right = $level[$i + 1] ?? $left;
$nextLevel[] = $this->hash($left . $right);
}
$levels[] = $nextLevel;
$level = $nextLevel;
}
return $levels;
}
}
// ────────────────────────────────────────────────
// EJEMPLO DE USO
// ────────────────────────────────────────────────
$transacciones = [
"Alice envía 1.5 BTC a Bob",
"Bob envía 0.8 BTC a Carol",
"Dave recibe 2.0 BTC de Exchange",
"Eve envía 0.3 BTC a Frank",
"Grace paga 1.2 BTC por hosting"
// Si quieres probar con número impar, deja 5 elementos
];
$tree = new MerkleTree($transacciones);
echo "Merkle Root: " . $tree->getRoot() . "\n\n";
echo "Niveles del árbol (de hojas a raíz):\n";
$levels = $tree->getLevels();
foreach ($levels as $i => $level) {
echo "Nivel " . $i . " (" . count($level) . " nodos):\n";
foreach ($level as $j => $hash) {
echo " [$j] → $hash\n";
}
echo "\n";
}