1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
mod database;
mod hash;
mod lowlevel;
mod merkmath;
pub use database::{ContentAddrStore, Database, InMemoryCas};
pub use merkmath::*;

pub type Hashed = [u8; 32];

// #[cfg(test)]
// mod tests {
//     use env_logger::Env;
//     use hash::hash_data;

//     use super::*;

//     fn init_logs() {
//         let _ =
//             env_logger::Builder::from_env(Env::default().default_filter_or("novasmt")).try_init();
//     }

//     #[test]
//     fn basic_insert_get() {
//         init_logs();
//         let forest = Forest::new(InMemoryBackend::default());
//         let mut tree = forest.open_tree([0; 32]).unwrap();
//         for i in 0u64..100 {
//             let key = hash_data(&i.to_be_bytes());
//             tree.insert(key, key.to_vec().into());
//         }
//         tree.save();
//         tree.get_with_proof([0; 32]);
//         forest.delete_tree(tree.root_hash());
//         for i in 0u64..100 {
//             let mut key = hash_data(&i.to_be_bytes());
//             let (val, proof) = tree.get_with_proof(key);
//             let mut val = val.to_vec();
//             assert!(proof.verify(tree.root_hash(), key, &val));
//             val[0] ^= 1;
//             assert!(!proof.verify(tree.root_hash(), key, &val));
//             key[0] ^= 1;
//             let (val, proof) = tree.get_with_proof(key);
//             assert!(proof.verify(tree.root_hash(), key, &val));
//         }
//     }

//     #[test]
//     fn basic_insert_delete() {
//         init_logs();
//         let forest = Forest::new(InMemoryBackend::default());
//         let mut tree = forest.open_tree([0; 32]).unwrap();
//         for i in 0u64..1000 {
//             let key = hash_data(&i.to_be_bytes());
//             tree.insert(key, key.to_vec().into());
//         }
//         tree.save();
//         std::thread::spawn(move || {
//             let old_root = tree.root_hash();
//             for i in 0u64..500 {
//                 let key = hash_data(&i.to_be_bytes());
//                 tree.insert(key, vec![].into());
//             }
//             tree.save();
//             forest.delete_tree(old_root);
//             tree.get_with_proof([0; 32]);
//         })
//         .join()
//         .unwrap();
//     }
// }