use crate::hash::H256;
pub fn fast_merkle_root(mut leaves: Vec<H256>) -> H256 {
if leaves.len() == 0 {
return H256::zero();
}
if leaves.len() < 2 {
return leaves[0];
}
while leaves.len() > 1 {
if leaves.len() & 1 != 0 {
leaves.push(leaves[leaves.len() - 1]);
}
let mut i = 0;
while i < leaves.len() / 2 {
let left = leaves[i * 2].hash_with(leaves[i * 2 + 1]);
leaves[i] = left;
i += 1;
}
let drain_start = leaves.len() / 2;
leaves.split_off(drain_start);
}
leaves[0]
}
#[test]
fn test_to_merkle_fast_short() {
let _inputs = vec![
H256::from_hex("5e574591d900f7f9abb8f8eb31cc9330247d27ba293ad79c348d602ece717b8b").unwrap(),
H256::from_hex("b3b70fe08c2da744c9559d533e8db35b3bfefba1b0f1c7b31e7d9d523c00a426").unwrap(),
H256::from_hex("dd3058a7fc691ff4dee0a8cd6030f404ffda7e7aee88aff3985f7b2bbe4792f7").unwrap(),
H256::from_hex("5e574591d900f7f9abb8f8eb31cc9330247d27ba293ad79c348d602ece717b8b").unwrap(),
H256::from_hex("b3b70fe08c2da744c9559d533e8db35b3bfefba1b0f1c7b31e7d9d523c00a426").unwrap(),
H256::from_hex("dd3058a7fc691ff4dee0a8cd6030f404ffda7e7aee88aff3985f7b2bbe4792f7").unwrap(),
H256::from_hex("5e574591d900f7f9abb8f8eb31cc9330247d27ba293ad79c348d602ece717b8b").unwrap(),
H256::from_hex("b3b70fe08c2da744c9559d533e8db35b3bfefba1b0f1c7b31e7d9d523c00a426").unwrap(),
H256::from_hex("dd3058a7fc691ff4dee0a8cd6030f404ffda7e7aee88aff3985f7b2bbe4792f7").unwrap(),
];
}
#[test]
fn test_to_merkle_fast_zero() {
assert_eq!(fast_merkle_root(vec![H256::zero()]), H256::zero());
}