mt_rs/
lib.rs

1//! This library provides modular components to build and verify binary Merkle trees
2//! with pluggable hash functions.
3//!
4//! ## Example: Merkle Tree with File Inputs and Proof Verification
5//!
6//! ```rust
7//! use mt_rs::hasher::SHA256Hasher;
8//! use mt_rs::merkletree::MerkleTree;
9//! use mt_rs::proof::{DefaultProofer, Proofer};
10//! use std::fs;
11//!
12//! let hasher = SHA256Hasher::new();
13//!
14//! let files = [
15//!     fs::read("tests/pics/cubbit.png.enc.0").expect("file 0 not found"),
16//!     fs::read("tests/pics/cubbit.png.enc.1").expect("file 1 not found"),
17//!     fs::read("tests/pics/cubbit.png.enc.2").expect("file 2 not found"),
18//! ];
19//!
20//! let tree = MerkleTree::new(hasher.clone(), files.clone());
21//!
22//! assert_eq!(tree.height(), 3);
23//! assert_eq!(tree.len(), 3);
24//! assert_eq!(
25//!     tree.root().hash(),
26//!     "a08c44656fb3f561619b8747a0d1dabe97126d9ed6e0cafbd7ce08ebe12d55ca"
27//! );
28//!
29//! let proofer = DefaultProofer::new(hasher, tree.leaves().clone());
30//!
31//! let proof = proofer.generate(0).expect("proof generation failed");
32//!
33//! assert!(proofer.verify(
34//!     &proof,
35//!     &files[0],
36//!     "a08c44656fb3f561619b8747a0d1dabe97126d9ed6e0cafbd7ce08ebe12d55ca"
37//! ));
38//!
39//! assert!(!proofer.verify(
40//!     &proof,
41//!     &files[0],
42//!     "a08c44656fb3f561619b87_NOT_VALID_HASH_9ed6e0cafbd7ce08ebe12d55ca"
43//! ));
44//!
45//! let proof = proofer.generate(1).expect("proof generation failed");
46//!
47//! assert!(proofer.verify(
48//!     &proof,
49//!     &files[1],
50//!     "a08c44656fb3f561619b8747a0d1dabe97126d9ed6e0cafbd7ce08ebe12d55ca",
51//! ));
52//!
53//! ```
54pub mod fs;
55pub mod hasher;
56pub mod merkletree;
57pub mod node;
58pub mod proof;