Merkles koks, pamatojoties uz blake3

blake3Atvērt jaunā logā ir balstīts uz merkles koku, taču pieejamais interfeiss neeksportē merkles koku.

baoAtvērt jaunā logā īsteno blake3 straumēšanas validāciju, bet nevar mainīt pakārtoto gabaluAtvērt jaunā logā lielumu (skatiet atbalstu lielākām "gabalu grupām", lai samazinātu pieskaitāmo vietuAtvērt jaunā logā ).

Tas nozīmē, ka bao patērē 6 % papildu glabāšanas vietas, lai ierakstītu Merkles koku, kas ir nozīmīga sadales satura indeksa pieskaitāmā daļa.

Tāpēc es ieviesu blake3_merkleAtvērt jaunā logā, lai iegūtu 32 baitus hash uz 1 MB satura ar papildu 0,3 MB glabāšanas izmaksām.

Merkle koks ģenerē hašas, kas atbilst blake3.

Ja saturs ir mazāks vai vienāds ar 1 MB, Merkles kokam ir tikai viens mezgls, un šī mezgla hash ir vienāds ar blake3 hash.

./examples/main.rs Šādi:

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

Palaidiet ./example.main.sh, un izvades rezultāts ir šāds.

[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",
)
Atjauninājumi:
No: gcxfd