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}