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
use std::path::PathBuf; #[cfg(not(any(feature = "use_hashbrown")))] use std::collections::HashMap; #[cfg(feature = "use_hashbrown")] use hashbrown::HashMap; use crate::traits::{Decode, Encode}; use crate::tree::tree_branch::TreeBranch; use crate::tree::tree_data::TreeData; use crate::tree::tree_leaf::TreeLeaf; use crate::tree::tree_node::TreeNode; use crate::tree_db::HashTreeDB; use crate::tree_hasher::TreeHasher; use crate::merkle_bit::{BinaryMerkleTreeResult, MerkleBIT}; pub struct HashTree<ValueType> where ValueType: Encode + Decode, { tree: MerkleBIT<HashTreeDB, TreeBranch, TreeLeaf, TreeData, TreeNode, TreeHasher, ValueType>, } impl<ValueType> HashTree<ValueType> where ValueType: Encode + Decode, { pub fn new(depth: usize) -> BinaryMerkleTreeResult<Self> { let path = PathBuf::new(); let tree = MerkleBIT::new(&path, depth)?; Ok(Self { tree }) } pub fn open(_path: &PathBuf, depth: usize) -> BinaryMerkleTreeResult<Self> { let tree = MerkleBIT::new(&_path, depth)?; Ok(Self { tree }) } pub fn get<'a>( &self, root_hash: &[u8], keys: &mut [&'a [u8]], ) -> BinaryMerkleTreeResult<HashMap<&'a [u8], Option<ValueType>>> { self.tree.get(root_hash, keys) } pub fn insert( &mut self, previous_root: Option<&[u8]>, keys: &mut [&[u8]], values: &mut [&ValueType], ) -> BinaryMerkleTreeResult<[u8; 32]> { self.tree.insert(previous_root, keys, values) } pub fn remove(&mut self, root_hash: &[u8]) -> BinaryMerkleTreeResult<()> { self.tree.remove(root_hash) } }