Arbre de Merkle basé sur blake3
blake3 est basé sur un arbre de merkle, mais l'interface exposée n'exporte pas l'arbre de merkle.
bao met en œuvre la validation de flux blake3, mais ne peut pas redimensionner les morceaux sous-jacents (voir le support de plus grands "groupes de morceaux" pour réduire l'encombrement ).
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_merkle 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.sh
et 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",
)