From af87fbf2033f7fe1d85600b12cacaaa1ca761712 Mon Sep 17 00:00:00 2001 From: Johns Beharry Date: Fri, 22 Feb 2019 13:12:07 -0400 Subject: [PATCH] feat(merkle_root): hash vector of leafs to get merkle_root Signed-off-by: Johns Beharry --- eth2/utils/hashing/src/lib.rs | 75 +++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/eth2/utils/hashing/src/lib.rs b/eth2/utils/hashing/src/lib.rs index b2bd5a279..4186e27a9 100644 --- a/eth2/utils/hashing/src/lib.rs +++ b/eth2/utils/hashing/src/lib.rs @@ -8,6 +8,31 @@ pub fn hash(input: &[u8]) -> Vec { result } +pub fn merkle_root(values: &[Vec]) -> Vec { + let values_len = values.len(); + let mut o: Vec> = vec![vec![0]; values_len]; + + o.append(&mut values.to_vec()); + + println!("o {:?}", o); + + for i in (0..values_len).rev() { + let mut current_value: Vec = o[i * 2].clone(); + current_value.append(&mut o[i * 2 + 1].clone()); + + o[i] = hash(¤t_value[..]); + println!("i {:?}", i); + print!(" "); + println!("o[i * 2] {} -- {:?}", i * 2, o[i * 2]); + print!(" "); + println!("o[i * 2 + 1] {} -- {:?}", i * 2 + 1, o[i * 2 + 1]); + } + +// println!("{:?}", o); + + o[1].clone() +} + #[cfg(test)] mod tests { use super::*; @@ -23,6 +48,56 @@ mod tests { 0x28, 0x7b, 0x56, 0xd9, 0x51, 0x7b, 0x9c, 0x94, 0x81, 0x27, 0x31, 0x9a, 0x09, 0xa7, 0xa3, 0x6d, 0xea, 0xc8, ]; + + println!("{:?}", expected); + println!("{:?}", output); assert_eq!(expected, output.as_slice()); } + + #[test] + fn test_merkle_root() { + let mut input = vec![ + "a".as_bytes().to_vec(), + "b".as_bytes().to_vec(), + "c".as_bytes().to_vec(), + "d".as_bytes().to_vec() + ]; + + let output = merkle_root(&input[..]); + + let mut leaf_1_2: Vec = input[0].clone(); // a + leaf_1_2.append(&mut input[1].clone()); // b + + let mut leaf_3_4: Vec = input[2].clone(); // c + leaf_3_4.append(&mut input[3].clone()); // d + + let node_1 = hash(&leaf_1_2[..]); + let node_2 = hash(&leaf_3_4[..]); + + let mut root: Vec = node_1.clone(); // ab + root.append(&mut node_2.clone()); // cd + + let mr = hash(&root[..]); + + let expected = &[183, 91, 96, 122, 144, 174, 84, 92, 97, 156, 140, 192, 66, 221, 55, 229, 234, 48, 118, 7, 61, 207, 39, 125, 150, 32, 94, 90, 19, 88, 122, 163]; + + print!(" "); + print!(" "); + print!(" "); + print!(" "); + print!(" "); + print!("origional input"); + println!("{:?}", input); + print!("NODE #1 HASH "); + println!("{:?}", node_1); + print!("NODE #2 HASH "); + println!("{:?}", node_2); + print!("ROOT HASH "); + println!("{:?}", root); + print!(" "); + println!("{:?}", expected); + + assert_eq!(expected, output.as_slice()); + + } }