arnaucube
arnaucube/merkletree-rsPublic Self-hosted repository
merkletree-rs/src/lib.rs
src/lib.rsRaw
 1use std::collections::HashMap;
 2
 3#[macro_use]
 4extern crate arrayref;
 5
 6extern crate tiny_keccak;
 7
 8extern crate rustc_hex;
 9
10mod utils;
11mod node;
12
13const TYPENODEEMPTY: u8 = 0;
14const TYPENODENORMAL: u8 = 1;
15const TYPENODEFINAL: u8 = 2;
16const TYPENODEVALUE: u8 = 3;
17// const TYPENODEROOT: u8 = 4;
18const EMPTYNODEVALUE: [u8;32] = [0;32];
19
20pub struct TestValue {
21   bytes: Vec<u8>,
22   index_length: u32,
23}
24pub trait Value {
25   fn bytes(&self) -> &Vec<u8>;
26   fn index_length(&self) -> u32;
27}
28impl Value for TestValue {
29   fn bytes(&self) -> &Vec<u8> {
30      &self.bytes
31   }
32   fn index_length(&self) -> u32 {
33      self.index_length
34   }
35}
36
37#[allow(dead_code)]
38pub struct Db {
39   storage: HashMap<[u8;32], Vec<u8>>,
40}
41impl Db {
42   pub fn insert(&mut self, k: [u8; 32], t: u8, il: u32, b: &mut Vec<u8>) {
43      let mut v: Vec<u8>;
44      v = [t].to_vec();
45      let il_bytes = il.to_le_bytes();
46      v.append(&mut il_bytes.to_vec()); // il_bytes are [u8;4] (4 bytes)
47      v.append(b);
48      self.storage.insert(k, v);
49   }
50   pub fn get(&self, k: &[u8;32]) -> (u8, u32, Vec<u8>) {
51      if k.to_vec() == EMPTYNODEVALUE.to_vec() {
52         return (0, 0, EMPTYNODEVALUE.to_vec());
53      }
54      match self.storage.get(k) {
55         Some(x) => {
56            let t = x[0];
57            let il_bytes: [u8; 4] = [x[1], x[2], x[3], x[4]];
58            let il = u32::from_le_bytes(il_bytes);
59            let b = &x[5..];
60            return (t, il, b.to_vec());
61         },
62         None => return (TYPENODEEMPTY, 0, EMPTYNODEVALUE.to_vec()),
63      }
64   }
65} 
66
67pub fn new_db()-> Db {
68   let db = Db {
69      storage: HashMap::new(),
70   };
71   db
72}
73
74pub struct MerkleTree {
75   #[allow(dead_code)]
76   root: [u8; 32],
77   #[allow(dead_code)]
78   num_levels: u32,
79   #[allow(dead_code)]
80   sto: Db,
81}
82
83
84pub fn new(num_levels: u32) -> MerkleTree {
85   let mt = MerkleTree {
86      root: EMPTYNODEVALUE,
87      num_levels: num_levels,
88      sto: new_db(),
89   };
90   mt
91}