Skip to content

Instantly share code, notes, and snippets.

@seunlanlege
Last active January 9, 2023 17:14
Show Gist options
  • Save seunlanlege/ce27c117a492e9dfc07ace9c4a0b4f9d to your computer and use it in GitHub Desktop.
Save seunlanlege/ce27c117a492e9dfc07ace9c4a0b4f9d to your computer and use it in GitHub Desktop.
Algorithm to calculate the root hash given a merkle multi proof
pub fn calculate_root(proof: Vec<Vec<(usize, [u8; 32])>>) -> [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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment