1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
pub fn root<L,H>(leaves: &[&L]) -> H
where
L: Into<H> + Clone,
H: Into<Vec<u8>> + From<Vec<u8>> + From<L> + Clone
{
if leaves.is_empty() {
vec![].into()
} else {
let mut hashes: Vec<H> = leaves
.iter()
.map(|&x| x.clone().into())
.collect();
while hashes.len() > 1 {
let mut next = vec![];
let mut intermediate = vec![];
for h in hashes {
intermediate.push(h);
if intermediate.len() == 2 {
let join = intermediate
.iter()
.fold(
vec![], |acc, x| {
let x_bytes: Vec<u8> = x.clone().into();
[acc, x_bytes].concat()
}
);
let join_hash: H = join.into();
next.push(join_hash);
intermediate.clear()
}
}
if !intermediate.is_empty() {
next.push(intermediate[0].clone());
}
hashes = next
}
hashes[0].clone()
}
}