Skip to content

Commit b0abd95

Browse files
committed
refactor: make validate_merkle_proof more efficient
1 parent 64c77ee commit b0abd95

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

src/utils.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use bitcoin::hash_types::TxMerkleNode;
44
use bitcoin::hashes::sha256d::Hash as Sha256d;
5-
use bitcoin::hashes::Hash;
5+
use bitcoin::hashes::{Hash, HashEngine};
66
use bitcoin::Txid;
77
use types::GetMerkleRes;
88

@@ -22,22 +22,23 @@ pub fn validate_merkle_proof(
2222
let mut index = merkle_res.pos;
2323
let mut cur = txid.to_raw_hash();
2424
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+
});
3941
index /= 2;
4042
}
41-
4243
cur == merkle_root.to_raw_hash()
4344
}

0 commit comments

Comments
 (0)