1use crate::types::GetMerkleRes;
4use bitcoin::hash_types::TxMerkleNode;
5use bitcoin::hashes::sha256d::Hash as Sha256d;
6use bitcoin::hashes::{Hash, HashEngine};
7use bitcoin::Txid;
8
9pub fn validate_merkle_proof(
18 txid: &Txid,
19 merkle_root: &TxMerkleNode,
20 merkle_res: &GetMerkleRes,
21) -> bool {
22 let mut index = merkle_res.pos;
23 let mut cur = txid.to_raw_hash();
24 for mut bytes in merkle_res.merkle.iter().cloned() {
25 bytes.reverse();
26 let next_hash = Sha256d::from_byte_array(bytes);
27
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 });
39 index /= 2;
40 }
41
42 cur == merkle_root.to_raw_hash()
43}