Sparse MerkleTree implementation in Rust.
The MerkleTree is optimized in the design and concepts, to have a faster and lighter MerkleTree, maintaining compatibility with a non optimized MerkleTree. In this way, the MerkleRoot of the optimized MerkleTree will be the same that the MerkleRoot of the non optimized MerkleTree.
Compatible with the Go version: https://github.com/arnaucube/go-merkletree
Import lib:
extern crate merkletree_rs;
use merkletree_rs::{db, MerkleTree, TestValue, Value};
Create new tree:
rust
// to build the storage, the first parameter is the path and the second parameter specifies if wants to use a in_memory database or a directory of the filesystem
let mut sto = db::Db::new("test".to_string(), true);
let mut mt = MerkleTree::new(&mut sto, 140 as u32);
Add value to leaf:
rust
let val: TestValue = TestValue {
bytes: "this is a test leaf".as_bytes().to_vec(),
index_length: 15,
};
mt.add(&val).unwrap();
Get proof:
rust
let mp = mt.generate_proof(val.hi());
println!("{:?}", mp);
Verify proof: ```rust // check if the value exist let v = merkletreers::verifyproof(mt.getroot(), &mp, val.hi(), val.ht(), mt.getnum_levels()); println!("{:?}", v);
// check if the don't value exist (in that case, the 'ht' will be an empty value) let v = merkletreers::verifyproof( mt.getroot(), &mp, val.hi(), merkletreers::constants::EMPTYNODEVALUE, mt.getnumlevels(), ); println!("{:?}", v); ```
Print current MerkleRoot:
rust
println!("{:?}", mt.get_root());