sparse_merkle_tree/
lib.rs

1//! Constructs a new `SparseMerkleTree<H, V, S>`.
2//!
3//! # Examples
4//!
5//! ```
6//! use sparse_merkle_tree::{
7//!     blake2b::Blake2bHasher, default_store::DefaultStore,
8//!     error::Error, MerkleProof,
9//!     SparseMerkleTree, traits::Value, H256
10//! };
11//! use blake2b_rs::{Blake2b, Blake2bBuilder};
12//!
13//! // define SMT
14//! type SMT = SparseMerkleTree<Blake2bHasher, Word, DefaultStore<Word>>;
15//!
16//! // define SMT value
17//! #[derive(Default, Clone)]
18//! pub struct Word(String);
19//! impl Value for Word {
20//!    fn to_h256(&self) -> H256 {
21//!        if self.0.is_empty() {
22//!            return H256::zero();
23//!        }
24//!        let mut buf = [0u8; 32];
25//!        let mut hasher = new_blake2b();
26//!        hasher.update(self.0.as_bytes());
27//!        hasher.finalize(&mut buf);
28//!        buf.into()
29//!    }
30//!    fn zero() -> Self {
31//!        Default::default()
32//!    }
33//! }
34//!
35//! // helper function
36//! fn new_blake2b() -> Blake2b {
37//!     Blake2bBuilder::new(32).personal(b"SMT").build()
38//! }
39//!
40//! fn construct_smt() {
41//!     let mut tree = SMT::default();
42//!     for (i, word) in "The quick brown fox jumps over the lazy dog"
43//!         .split_whitespace()
44//!         .enumerate()
45//!     {
46//!         let key: H256 = {
47//!             let mut buf = [0u8; 32];
48//!             let mut hasher = new_blake2b();
49//!             hasher.update(&(i as u32).to_le_bytes());
50//!             hasher.finalize(&mut buf);
51//!             buf.into()
52//!         };
53//!         let value = Word(word.to_string());
54//!         // insert key value into tree
55//!         tree.update(key, value).expect("update");
56//!     }
57//!
58//!     println!("SMT root is {:?} ", tree.root());
59//! }
60//! ```
61
62#![cfg_attr(not(feature = "std"), no_std)]
63
64pub mod blake2b;
65#[cfg(feature = "smtc")]
66pub mod ckb_smt;
67pub mod default_store;
68pub mod error;
69pub mod h256;
70pub mod merge;
71pub mod merkle_proof;
72#[cfg(test)]
73mod tests;
74pub mod traits;
75mod tree;
76#[cfg(feature = "trie")]
77mod trie_tree;
78
79#[cfg(feature = "smtc")]
80pub use ckb_smt::{SMTBuilder, SMT};
81pub use h256::H256;
82pub use merkle_proof::{CompiledMerkleProof, MerkleProof};
83#[cfg(not(feature = "trie"))]
84pub use tree::SparseMerkleTree;
85pub use tree::{BranchKey, BranchNode};
86#[cfg(feature = "trie")]
87pub use trie_tree::SparseMerkleTree;
88
89/// Expected path size: log2(256) * 2, used for hint vector capacity
90pub const EXPECTED_PATH_SIZE: usize = 16;
91// Max stack size can be used when verify compiled proof
92pub(crate) const MAX_STACK_SIZE: usize = 257;
93
94cfg_if::cfg_if! {
95    if #[cfg(feature = "std")] {
96        use std::collections;
97        use std::vec;
98        use std::string;
99    } else {
100        extern crate alloc;
101        use alloc::collections;
102        use alloc::vec;
103        use alloc::string;
104    }
105}