@@ -131,6 +131,21 @@ impl TapLeafHash {
131
131
}
132
132
}
133
133
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
+
134
149
/// Maximum depth of a taproot tree script spend path.
135
150
// https://github.com/bitcoin/bitcoin/blob/e826b22da252e0599c61d21c98ff89f366b3120f/src/script/interpreter.h#L229
136
151
pub const TAPROOT_CONTROL_MAX_NODE_COUNT : usize = 128 ;
@@ -565,16 +580,9 @@ impl NodeInfo {
565
580
b_leaf. merkle_branch . push ( a. hash ) ?; // add hashing partner
566
581
all_leaves. push ( b_leaf) ;
567
582
}
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 ) ;
576
584
Ok ( Self {
577
- hash : sha256:: Hash :: from_engine ( eng ) ,
585
+ hash : sha256:: Hash :: from_inner ( hash . into_inner ( ) ) ,
578
586
leaves : all_leaves,
579
587
} )
580
588
}
@@ -779,16 +787,11 @@ impl ControlBlock {
779
787
let mut curr_hash = TapBranchHash :: from_inner ( leaf_hash. into_inner ( ) ) ;
780
788
// Verify the proof
781
789
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
- }
790
790
// 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
+ ) ;
792
795
}
793
796
// compute the taptweak
794
797
let tweak = TapTweakHash :: from_key_and_tweak ( self . internal_key , Some ( curr_hash) ) ;
0 commit comments