Arbre de Merkle basé sur blake3

blake3Ouvrir dans une nouvelle fenêtre est basé sur un arbre de merkle, mais l'interface exposée n'exporte pas l'arbre de merkle.

baoOuvrir dans une nouvelle fenêtre met en œuvre la validation de flux blake3, mais ne peut pas redimensionner les morceauxOuvrir dans une nouvelle fenêtre sous-jacents (voir le support de plus grands "groupes de morceaux" pour réduire l'encombrementOuvrir dans une nouvelle fenêtre ).

Cela signifie que bao consomme 6 % d'espace de stockage supplémentaire pour enregistrer l'arbre de merkle, ce qui représente une surcharge importante pour un index de contenu distribué.

J'ai donc implémenté blake3_merkleOuvrir dans une nouvelle fenêtre pour dériver 32 octets de hachage par 1 Mo de contenu avec un surcoût de stockage supplémentaire de 0,3‱.

L'arbre de merkle génère des hachages qui sont cohérents avec blake3.

Lorsque le contenu est inférieur ou égal à 1 Mo, l'arbre de merkle ne comporte qu'un seul nœud et le hachage de ce nœud est égal au hachage de blake3.

./examples/main.rs Comme suit :

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(())
}

Exécutez ./example.main.shet la sortie est la suivante

[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",
)
Mises à jour:
De: gcxfd