Created
April 13, 2022 19:09
-
-
Save ethDreamer/491408d85f7fb68a13bfda6c6795bd39 to your computer and use it in GitHub Desktop.
Refactor of from_finalized_snapshot()
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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