Árbol de Merkle basado en blake3

blake3Abrir en una nueva ventana se basa en un árbol de merkle, pero la interfaz expuesta no exporta el árbol de merkle.

baoAbrir en una nueva ventana implementa la validación de streaming de blake3, pero no puede redimensionar los chunksAbrir en una nueva ventana subyacentes (ver soporte de "grupos de chunk" más grandes para reducir la sobrecarga de espacioAbrir en una nueva ventana ).

Esto significa que bao consume un 6% de espacio de almacenamiento adicional para registrar el árbol de merkle, lo que supone una sobrecarga importante para un índice de contenido distribuido.

Así que implementé blake3_merkleAbrir en una nueva ventana para derivar 32 bytes de hash por 1MB de contenido con una sobrecarga de almacenamiento adicional de 0,3‱.

El árbol merkle genera hashes que son consistentes con blake3.

Cuando el contenido es menor o igual a 1MB, el árbol de merkle sólo tiene un nodo y el hash de este nodo es igual al hash de blake3.

./examples/main.rs De la siguiente manera :

use blake3_merkle::Merkle;

use std::{env, error::Error, fs::File, io::copy};

fn main() -> Result<(), Box<dyn Error>> {
  let fpath = env::current_dir()?.join("test.pdf");

  let mut blake3 = blake3::Hasher::new();
  copy(&mut File::open(&fpath)?, &mut blake3)?;

  let mut merkle = Merkle::new();
  copy(&mut File::open(&fpath)?, &mut merkle)?;
  merkle.finalize();
  dbg!(&merkle.li);
  dbg!(merkle.blake3());
  dbg!(blake3.finalize());
  Ok(())
}

Ejecute ./example.main.shy el resultado es el siguiente

[examples/main.rs:14] &merkle.li = [
    HashDepth {
        hash: Hash(
            "eb896f431b7ff8acb4749b54981d461359a01ded0261fa0da856dd28bf29d3b3",
        ),
        depth: 10,
    },
    HashDepth {
        hash: Hash(
            "4a84cc85f03f47a7c32755f8d9d81c5d3f3e04548ee8129fd480cb71c7dbc5b4",
        ),
        depth: 10,
    },
    HashDepth {
        hash: Hash(
            "fbfe78e550b355cb6775e324c4fed7eb987084b115dca599aaf40056bfb031c3",
        ),
        depth: 10,
    },
    HashDepth {
        hash: Hash(
            "392878c3bdc9c315d6cc8a1721d8cd0a39e49ac8716f4cb8cdf6cf83fbb666f5",
        ),
        depth: 6,
    },
]
[examples/main.rs:15] merkle.blake3() = Hash(
    "74a79d0bc37dcac64c493e872252f19e8bdb32dee306481a6827fa037b378c76",
)
[examples/main.rs:16] blake3.finalize() = Hash(
    "74a79d0bc37dcac64c493e872252f19e8bdb32dee306481a6827fa037b378c76",
)
Actualizaciones:
Desde: gcxfd