arnaucube
arnaucube/merkletree-rsPublic Self-hosted repository
merkletree-rs/src/node.rs
src/node.rsRaw
 1use utils;
 2
 3
 4#[allow(dead_code)]
 5pub struct TreeNode {
 6    pub child_l: [u8;32],
 7    pub child_r: [u8;32],
 8}
 9
10impl TreeNode {
11    #[allow(dead_code)]
12    pub fn bytes(&self) -> Vec<u8> {
13        concatenate_arrays(&self.child_l, &self.child_r)
14    }
15    #[allow(dead_code)]
16    pub fn ht(&self) -> [u8;32] {
17        utils::hash_vec(self.bytes())
18    }
19}
20
21fn concatenate_arrays<T: Clone>(x: &[T], y: &[T]) -> Vec<T> {
22    let mut concat = x.to_vec();
23    concat.extend_from_slice(y);
24 
25    concat
26}
27
28pub fn parse_node_bytes(b: Vec<u8>) -> TreeNode {
29    if b==::EMPTYNODEVALUE {
30        let n = TreeNode {
31            child_l: ::EMPTYNODEVALUE,
32            child_r: ::EMPTYNODEVALUE,
33        };
34        return n;
35    }
36    let child_l = &b[0..32];
37    let child_r = &b[32..];
38    let n = TreeNode {
39        child_l: array_ref!(child_l, 0, 32).clone(),
40        child_r: array_ref!(child_r, 0, 32).clone(),
41    };
42    n
43}
44
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49    use rustc_hex::ToHex;
50
51    #[test]
52    fn test_hash_vec() {
53        let n = TreeNode {
54            child_l: ::EMPTYNODEVALUE,
55            child_r: ::EMPTYNODEVALUE,
56        };
57        assert_eq!("ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", n.ht().to_hex())
58    }
59}