mirror of
https://github.com/arnaucube/merkletree-rs.git
synced 2026-02-28 05:36:47 +01:00
store & get current root in/from db
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "merkletree-rs"
|
name = "merkletree-rs"
|
||||||
version = "0.0.2"
|
version = "0.0.3"
|
||||||
authors = ["arnaucube <root@arnaucube.com>"]
|
authors = ["arnaucube <root@arnaucube.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ pub const TYPENODEEMPTY: u8 = 0;
|
|||||||
pub const TYPENODENORMAL: u8 = 1;
|
pub const TYPENODENORMAL: u8 = 1;
|
||||||
pub const TYPENODEFINAL: u8 = 2;
|
pub const TYPENODEFINAL: u8 = 2;
|
||||||
pub const TYPENODEVALUE: u8 = 3;
|
pub const TYPENODEVALUE: u8 = 3;
|
||||||
|
pub const TYPENODEROOT: u8 = 4;
|
||||||
pub const EMPTYNODEVALUE: [u8; 32] = [0; 32];
|
pub const EMPTYNODEVALUE: [u8; 32] = [0; 32];
|
||||||
|
|||||||
39
src/lib.rs
39
src/lib.rs
@@ -48,13 +48,20 @@ pub struct MerkleTree<'a> {
|
|||||||
root: [u8; 32],
|
root: [u8; 32],
|
||||||
num_levels: u32,
|
num_levels: u32,
|
||||||
sto: &'a mut db::Db,
|
sto: &'a mut db::Db,
|
||||||
|
root_node_key: [u8;32],
|
||||||
}
|
}
|
||||||
impl<'a> MerkleTree<'a> {
|
impl<'a> MerkleTree<'a> {
|
||||||
pub fn new(database: &'a mut db::Db, num_levels: u32) -> MerkleTree<'a> {
|
pub fn new(database: &'a mut db::Db, num_levels: u32) -> MerkleTree<'a> {
|
||||||
|
let rnk: [u8; 32] = utils::hash_vec("root".as_bytes().to_vec());
|
||||||
|
let (_, _, root_vec) = database.get(&rnk);
|
||||||
|
let mut root: [u8; 32] = [0;32];
|
||||||
|
root.copy_from_slice(&root_vec); // root will be [0;32] if not found (EMPTYNODEVALUE)
|
||||||
|
|
||||||
MerkleTree {
|
MerkleTree {
|
||||||
root: constants::EMPTYNODEVALUE,
|
root: root,
|
||||||
num_levels,
|
num_levels,
|
||||||
sto: database,
|
sto: database,
|
||||||
|
root_node_key: rnk,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn get_root(&mut self) -> [u8; 32] {
|
pub fn get_root(&mut self) -> [u8; 32] {
|
||||||
@@ -138,6 +145,8 @@ impl<'a> MerkleTree<'a> {
|
|||||||
0,
|
0,
|
||||||
parent_node.bytes().to_vec(),
|
parent_node.bytes().to_vec(),
|
||||||
);
|
);
|
||||||
|
self.sto
|
||||||
|
.insert(self.root_node_key, constants::TYPENODEROOT, 0, self.root.to_vec());
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,6 +174,8 @@ impl<'a> MerkleTree<'a> {
|
|||||||
v.bytes().to_vec(),
|
v.bytes().to_vec(),
|
||||||
);
|
);
|
||||||
self.root = final_node_hash;
|
self.root = final_node_hash;
|
||||||
|
self.sto
|
||||||
|
.insert(self.root_node_key, constants::TYPENODEROOT, 0, self.root.to_vec());
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
let final_node_hash = utils::calc_hash_from_leaf_and_level(i, &path, v.ht());
|
let final_node_hash = utils::calc_hash_from_leaf_and_level(i, &path, v.ht());
|
||||||
@@ -177,6 +188,8 @@ impl<'a> MerkleTree<'a> {
|
|||||||
v.index_length(),
|
v.index_length(),
|
||||||
v.bytes().to_vec(),
|
v.bytes().to_vec(),
|
||||||
);
|
);
|
||||||
|
self.sto
|
||||||
|
.insert(self.root_node_key, constants::TYPENODEROOT, 0, self.root.to_vec());
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -188,6 +201,8 @@ impl<'a> MerkleTree<'a> {
|
|||||||
v.index_length(),
|
v.index_length(),
|
||||||
v.bytes().to_vec(),
|
v.bytes().to_vec(),
|
||||||
);
|
);
|
||||||
|
self.sto
|
||||||
|
.insert(self.root_node_key, constants::TYPENODEROOT, 0, self.root.to_vec());
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -730,4 +745,26 @@ mod tests {
|
|||||||
"6e2da580b2920cd78ed8d4e4bf41e209dfc99ef28bc19560042f0ac803e0d6f7"
|
"6e2da580b2920cd78ed8d4e4bf41e209dfc99ef28bc19560042f0ac803e0d6f7"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_root_in_db() {
|
||||||
|
let mut sto = db::Db::new("test".to_string(), true);
|
||||||
|
let mut mt = MerkleTree::new(&mut sto, 140);
|
||||||
|
for i in 0..10 {
|
||||||
|
mt.add(&TestValue {
|
||||||
|
bytes: (i.to_string() + " this is a test leaf").as_bytes().to_vec(),
|
||||||
|
index_length: 15,
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
assert_eq!(
|
||||||
|
mt.root.to_hex(),
|
||||||
|
"9418fd35bae19de4ab033efaf7cc624adf6a42827e39029d8da13288e9c3170d"
|
||||||
|
);
|
||||||
|
let mt2 = MerkleTree::new(&mut sto, 140);
|
||||||
|
assert_eq!(
|
||||||
|
mt2.root.to_hex(),
|
||||||
|
"9418fd35bae19de4ab033efaf7cc624adf6a42827e39029d8da13288e9c3170d"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user