From e8e22886f4ca9f217404a6d72fcfd582e280357e Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Thu, 10 Jun 2021 10:29:08 +0800 Subject: [PATCH] tree.rs: MerklePath.root(): Fix missing bitmask in swap calculation Co-authored-by: Jack Grigg --- src/tree.rs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/tree.rs b/src/tree.rs index ebc76a6a..ce6bfa10 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -39,17 +39,12 @@ impl MerklePath { } pub fn root(&self, cmx: ExtractedNoteCommitment) -> Anchor { - // Initialize `node` to the first hash. - let init_node = { - let pos = self.position % 2 == 1; - hash_layer(0, cond_swap(pos, *cmx, self.auth_path[0])) - }; - let node = self.auth_path[1..] + let node = self + .auth_path .iter() .enumerate() - .fold(init_node, |node, (i, sibling)| { - let l_star = i + 1; - let swap = (self.position >> l_star) == 1; + .fold(*cmx, |node, (l_star, sibling)| { + let swap = self.position & (1 << l_star) != 0; hash_layer(l_star, cond_swap(swap, node, *sibling)) }); Anchor(node.to_bytes())