feat(merkle_root): calculate merkle root from leaves
Signed-off-by: Johns Beharry <johns@peakshift.com>
This commit is contained in:
parent
af87fbf203
commit
80ac60cc0e
@ -14,22 +14,13 @@ pub fn merkle_root(values: &[Vec<u8>]) -> Vec<u8> {
|
|||||||
|
|
||||||
o.append(&mut values.to_vec());
|
o.append(&mut values.to_vec());
|
||||||
|
|
||||||
println!("o {:?}", o);
|
|
||||||
|
|
||||||
for i in (0..values_len).rev() {
|
for i in (0..values_len).rev() {
|
||||||
let mut current_value: Vec<u8> = o[i * 2].clone();
|
let mut current_value: Vec<u8> = o[i * 2].clone();
|
||||||
current_value.append(&mut o[i * 2 + 1].clone());
|
current_value.append(&mut o[i * 2 + 1].clone());
|
||||||
|
|
||||||
o[i] = hash(¤t_value[..]);
|
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()
|
o[1].clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,15 +39,12 @@ mod tests {
|
|||||||
0x28, 0x7b, 0x56, 0xd9, 0x51, 0x7b, 0x9c, 0x94, 0x81, 0x27, 0x31, 0x9a, 0x09, 0xa7,
|
0x28, 0x7b, 0x56, 0xd9, 0x51, 0x7b, 0x9c, 0x94, 0x81, 0x27, 0x31, 0x9a, 0x09, 0xa7,
|
||||||
0xa3, 0x6d, 0xea, 0xc8,
|
0xa3, 0x6d, 0xea, 0xc8,
|
||||||
];
|
];
|
||||||
|
|
||||||
println!("{:?}", expected);
|
|
||||||
println!("{:?}", output);
|
|
||||||
assert_eq!(expected, output.as_slice());
|
assert_eq!(expected, output.as_slice());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_merkle_root() {
|
fn test_merkle_root() {
|
||||||
let mut input = vec![
|
let input = vec![
|
||||||
"a".as_bytes().to_vec(),
|
"a".as_bytes().to_vec(),
|
||||||
"b".as_bytes().to_vec(),
|
"b".as_bytes().to_vec(),
|
||||||
"c".as_bytes().to_vec(),
|
"c".as_bytes().to_vec(),
|
||||||
@ -65,39 +53,11 @@ mod tests {
|
|||||||
|
|
||||||
let output = merkle_root(&input[..]);
|
let output = merkle_root(&input[..]);
|
||||||
|
|
||||||
let mut leaf_1_2: Vec<u8> = input[0].clone(); // a
|
// merkle root of [[a],[b],[c],[d]]
|
||||||
leaf_1_2.append(&mut input[1].clone()); // b
|
let expected = &[
|
||||||
|
183, 91, 96, 122, 144, 174, 84, 92, 97, 156, 140, 192, 66, 221, 55, 229,
|
||||||
let mut leaf_3_4: Vec<u8> = input[2].clone(); // c
|
234, 48, 118, 7, 61, 207, 39, 125, 150, 32, 94, 90, 19, 88, 122, 163,
|
||||||
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<u8> = 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());
|
assert_eq!(expected, output.as_slice());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user