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