Skip to content

Commit 28aa02a

Browse files
author
ChallengeDev210
committed
Merge rust-bitcoin/rust-bitcoin#926: Remove redundant code computing tap hashes
f3ebfd6 Remove repeated tap branch hash computing logic (Dr Maxim Orlovsky) 1b28375 Abstract tap branch hash computing into a dedicated method (Dr Maxim Orlovsky) Pull request description: ACKs for top commit: apoelstra: ACK f3ebfd6 Tree-SHA512: d66d544df324a7d25c8cc9dc48ddedf086ac87eb2ed09a8d7a568cc1488ae44e0807d53ccb7a6e61dbeef0d3d62a1cacf0d69ba7b8de9178ac5c13bae944d08b
2 parents 333aae0 + 24aa43e commit 28aa02a

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

src/util/taproot.rs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,21 @@ impl TapLeafHash {
131131
}
132132
}
133133

134+
impl TapBranchHash {
135+
/// Computes branch hash given two hashes of the nodes underneath it.
136+
pub fn from_node_hashes(a: sha256::Hash, b: sha256::Hash) -> TapBranchHash {
137+
let mut eng = TapBranchHash::engine();
138+
if a < b {
139+
eng.input(&a);
140+
eng.input(&b);
141+
} else {
142+
eng.input(&b);
143+
eng.input(&a);
144+
};
145+
TapBranchHash::from_engine(eng)
146+
}
147+
}
148+
134149
/// Maximum depth of a taproot tree script spend path.
135150
// https://github.com/bitcoin/bitcoin/blob/e826b22da252e0599c61d21c98ff89f366b3120f/src/script/interpreter.h#L229
136151
pub const TAPROOT_CONTROL_MAX_NODE_COUNT: usize = 128;
@@ -565,16 +580,9 @@ impl NodeInfo {
565580
b_leaf.merkle_branch.push(a.hash)?; // add hashing partner
566581
all_leaves.push(b_leaf);
567582
}
568-
let mut eng = TapBranchHash::engine();
569-
if a.hash < b.hash {
570-
eng.input(&a.hash);
571-
eng.input(&b.hash);
572-
} else {
573-
eng.input(&b.hash);
574-
eng.input(&a.hash);
575-
};
583+
let hash = TapBranchHash::from_node_hashes(a.hash, b.hash);
576584
Ok(Self {
577-
hash: sha256::Hash::from_engine(eng),
585+
hash: sha256::Hash::from_inner(hash.into_inner()),
578586
leaves: all_leaves,
579587
})
580588
}
@@ -779,16 +787,11 @@ impl ControlBlock {
779787
let mut curr_hash = TapBranchHash::from_inner(leaf_hash.into_inner());
780788
// Verify the proof
781789
for elem in self.merkle_branch.as_inner() {
782-
let mut eng = TapBranchHash::engine();
783-
if curr_hash.as_inner() < elem.as_inner() {
784-
eng.input(&curr_hash);
785-
eng.input(elem);
786-
} else {
787-
eng.input(elem);
788-
eng.input(&curr_hash);
789-
}
790790
// Recalculate the curr hash as parent hash
791-
curr_hash = TapBranchHash::from_engine(eng);
791+
curr_hash = TapBranchHash::from_node_hashes(
792+
sha256::Hash::from_inner(curr_hash.into_inner()),
793+
*elem
794+
);
792795
}
793796
// compute the taptweak
794797
let tweak = TapTweakHash::from_key_and_tweak(self.internal_key, Some(curr_hash));

0 commit comments

Comments
 (0)