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