Δέντρο Merkle με βάση το blake3
Το blake3 βασίζεται σε ένα δέντρο merkle, αλλά η εκτεθειμένη διεπαφή δεν εξάγει το δέντρο merkle.
Το bao υλοποιεί την επικύρωση ροής blake3, αλλά δεν μπορεί να αλλάξει το μέγεθος των υποκείμενων τεμαχίων (βλ. υποστήριξη μεγαλύτερων "ομάδων τεμαχίων" για μειωμένη επιβάρυνση χώρου ).
Αυτό σημαίνει ότι το bao καταναλώνει 6% επιπλέον αποθηκευτικό χώρο για την καταγραφή του δέντρου merkle, το οποίο αποτελεί σημαντική επιβάρυνση για ένα κατανεμημένο ευρετήριο περιεχομένου.
Έτσι, εφάρμοσα το blake3_merkle για να παράγω 32 bytes κατακερματισμού ανά 1MB περιεχομένου με ένα πρόσθετο κόστος αποθήκευσης 0,3‱.
Το δέντρο merkle παράγει κατακερματισμούς που είναι συνεπείς με το blake3.
Όταν το περιεχόμενο είναι μικρότερο ή ίσο του 1MB, το δέντρο merkle έχει μόνο έναν κόμβο και το hash αυτού του κόμβου είναι ίσο με το hash του blake3.
./examples/main.rs
Ως εξής :
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(())
}
Εκτελέστε το ./example.main.sh
και η έξοδος έχει ως εξής
[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",
)