Skip to content

Instantly share code, notes, and snippets.

@Owez
Last active January 5, 2022 17:58
Show Gist options
  • Save Owez/710e951a8bba5809c5ee05fea3f5956c to your computer and use it in GitHub Desktop.
Save Owez/710e951a8bba5809c5ee05fea3f5956c to your computer and use it in GitHub Desktop.
Array-based merkle tree generation
pub fn new(data: impl IntoIterator<Item = T>) -> Self {
// raw data to enumerated leaf
let mut master: Vec<Vec<Leaf<T>>> = data
.into_iter()
.map(|point| vec![Leaf::new_data(point)])
.collect();
// add dummy leaf if odd
if master.len() % 2 != 0 {
master.push(vec![Leaf::new_dummy()])
}
// x recursive stages
while master.len() != 1 {
let mut buf: Option<Vec<Leaf<T>>> = None;
let mut stage_master = vec![];
for right in master {
if let Some(left) = buf.take() {
let link = Leaf::new_link(&left[0].hash, &right[0].hash);
let mut new_block = vec![link];
new_block.extend(left);
new_block.extend(right);
stage_master.push(new_block);
} else {
buf = Some(right)
}
}
master = stage_master;
}
Self(master.pop().unwrap())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment