13-02-2026

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";
}
También se puede usar la Usar la librería "drupol/phpmerkle" con Composer