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}