Skip to content

Instantly share code, notes, and snippets.

@ethDreamer
Created April 13, 2022 19:09
Show Gist options
  • Save ethDreamer/491408d85f7fb68a13bfda6c6795bd39 to your computer and use it in GitHub Desktop.
Save ethDreamer/491408d85f7fb68a13bfda6c6795bd39 to your computer and use it in GitHub Desktop.
Refactor of from_finalized_snapshot()
pub fn from_finalized_snapshot(
finalized_branch: &[H256],
deposits: usize,
level: usize,
) -> Result<Self, MerkleTreeError> {
if let Some(hash) = finalized_branch.get(0) {
if deposits == (0x1 << level) {
return Ok(MerkleTree::Finalized(*hash));
}
if level == 0 {
return Err(InvalidSnapshot::EndOfTree.into());
}
} else {
// finalized_branch is empty
return if deposits == 0 {
Ok(MerkleTree::Zero(level))
} else {
Err(InvalidSnapshot::EmptyBranchWithNonZeroDeposits(deposits).into())
};
}
let left_subtree = 0x1 << (level - 1);
return if deposits <= left_subtree {
let left = MerkleTree::from_finalized_snapshot(finalized_branch, deposits, level - 1)?;
let right = MerkleTree::Zero(level - 1);
let hash = H256::from_slice(&hash32_concat(
left.hash().as_bytes(),
right.hash().as_bytes(),
));
Ok(MerkleTree::Node(hash, Box::new(left), Box::new(right)))
} else if let Some((left_hash, right_branch)) = finalized_branch.split_first() {
let left = MerkleTree::Finalized(*left_hash);
let right = MerkleTree::from_finalized_snapshot(
right_branch,
deposits - left_subtree,
level - 1,
)?;
let hash = H256::from_slice(&hash32_concat(
left.hash().as_bytes(),
right.hash().as_bytes(),
));
Ok(MerkleTree::Node(hash, Box::new(left), Box::new(right)))
} else {
// Execution should never get here
Err(MerkleTreeError::PleaseNotifyTheDevs)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment