Δέντρο 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",
)
Ενημερώσεις:
Από το: gcxfd