pub fn calculate_root(proof: Vec>) -> [u8; 32] { let mut previous_layer = vec![]; for layer in proof { let mut current_layer = vec![]; if previous_layer.len() == 0 { current_layer = layer; } else { current_layer.extend(previous_layer.drain(..)); current_layer.extend(&layer); current_layer.sort_by(|(a_i, _), (b_i, _)| a_i.cmp(b_i)); } for index in (0..current_layer.len()).step_by(2) { if index + 1 == current_layer.len() { let node = current_layer[index].clone(); previous_layer.push((div_floor(node.0, 2), node.1)); } else { let mut concat = vec![]; let mut left = current_layer[index].clone(); let right = current_layer[index + 1].clone(); concat.extend(&left.1); concat.extend(&right.1); let hash = keccak256(&concat); previous_layer.push((div_floor(left.0, 2), hash)); } } } previous_layer[0].1 }