2
2
3
3
use bitcoin:: hash_types:: TxMerkleNode ;
4
4
use bitcoin:: hashes:: sha256d:: Hash as Sha256d ;
5
- use bitcoin:: hashes:: Hash ;
5
+ use bitcoin:: hashes:: { Hash , HashEngine } ;
6
6
use bitcoin:: Txid ;
7
7
use types:: GetMerkleRes ;
8
8
@@ -22,22 +22,23 @@ pub fn validate_merkle_proof(
22
22
let mut index = merkle_res. pos ;
23
23
let mut cur = txid. to_raw_hash ( ) ;
24
24
for bytes in & merkle_res. merkle {
25
- let mut reversed = [ 0u8 ; 32 ] ;
26
- reversed. copy_from_slice ( bytes) ;
27
- reversed. reverse ( ) ;
28
- // unwrap() safety: `reversed` has len 32 so `from_slice` can never fail.
29
- let next_hash = Sha256d :: from_slice ( & reversed) . unwrap ( ) ;
30
-
31
- let ( left, right) = if index % 2 == 0 {
32
- ( cur, next_hash)
33
- } else {
34
- ( next_hash, cur)
35
- } ;
36
-
37
- let data = [ & left[ ..] , & right[ ..] ] . concat ( ) ;
38
- cur = Sha256d :: hash ( & data) ;
25
+ let next_hash = Sha256d :: from_byte_array ( {
26
+ let mut reversed = bytes. to_owned ( ) ;
27
+ reversed. reverse ( ) ;
28
+ reversed
29
+ } ) ;
30
+ cur = Sha256d :: from_engine ( {
31
+ let mut engine = Sha256d :: engine ( ) ;
32
+ if index % 2 == 0 {
33
+ engine. input ( cur. as_ref ( ) ) ;
34
+ engine. input ( next_hash. as_ref ( ) ) ;
35
+ } else {
36
+ engine. input ( next_hash. as_ref ( ) ) ;
37
+ engine. input ( cur. as_ref ( ) ) ;
38
+ } ;
39
+ engine
40
+ } ) ;
39
41
index /= 2 ;
40
42
}
41
-
42
43
cur == merkle_root. to_raw_hash ( )
43
44
}
0 commit comments