Skip to content

Commit 746a0e6

Browse files
committed
Merge #134: refactor: make validate_merkle_proof more efficient
3a1f1bf refactor: make `validate_merkle_proof` more efficient (志宇) Pull request description: ACKs for top commit: notmandatory: ACK 3a1f1bf Tree-SHA512: 995d1582bc13d21c13b76dcd5e5edb633a59588e713b1e0aaf33363e17c47aafb22c7f250483e60cdc68e85fc94f041a0c39815160dc2592bedf959679f804dc
2 parents 54797a0 + 3a1f1bf commit 746a0e6

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

src/utils.rs

Lines changed: 15 additions & 15 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

@@ -21,21 +21,21 @@ pub fn validate_merkle_proof(
2121
) -> bool {
2222
let mut index = merkle_res.pos;
2323
let mut cur = txid.to_raw_hash();
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();
24+
for mut bytes in merkle_res.merkle.iter().cloned() {
25+
bytes.reverse();
26+
let next_hash = Sha256d::from_byte_array(bytes);
3027

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);
28+
cur = Sha256d::from_engine({
29+
let mut engine = Sha256d::engine();
30+
if index % 2 == 0 {
31+
engine.input(cur.as_ref());
32+
engine.input(next_hash.as_ref());
33+
} else {
34+
engine.input(next_hash.as_ref());
35+
engine.input(cur.as_ref());
36+
};
37+
engine
38+
});
3939
index /= 2;
4040
}
4141

0 commit comments

Comments
 (0)