()
| 94 | |
| 95 | #[test] |
| 96 | fn test_spv() { |
| 97 | let mut mmr_native = MMRNative::new(); |
| 98 | let mut mmr_guest = MMRGuest::new(); |
| 99 | let block_headers = MAINNET_BLOCK_HEADERS |
| 100 | .iter() |
| 101 | .map(|header| CircuitBlockHeader::try_from_slice(header).unwrap()) |
| 102 | .collect::<Vec<CircuitBlockHeader>>(); |
| 103 | let txs = MAINNET_BLOCK_TRANSACTIONS |
| 104 | .iter() |
| 105 | .map(|tx| { |
| 106 | println!("{:?}", tx); |
| 107 | CircuitTransaction(bitcoin::consensus::deserialize(*tx).unwrap()) |
| 108 | }) |
| 109 | .collect::<Vec<CircuitTransaction>>(); |
| 110 | let mut bitcoin_merkle_proofs: Vec<BlockInclusionProof> = vec![]; |
| 111 | for tx in txs.iter() { |
| 112 | let txid = tx.txid(); |
| 113 | println!("txid: {:?}", txid); |
| 114 | let bitcoin_merkle_tree = BitcoinMerkleTree::new(vec![txid]); |
| 115 | let bitcoin_merkle_proof = bitcoin_merkle_tree.generate_proof(0); |
| 116 | assert!(verify_merkle_proof( |
| 117 | txid, |
| 118 | &bitcoin_merkle_proof, |
| 119 | bitcoin_merkle_tree.root() |
| 120 | )); |
| 121 | bitcoin_merkle_proofs.push(bitcoin_merkle_proof); |
| 122 | } |
| 123 | for (i, header) in block_headers.iter().enumerate() { |
| 124 | mmr_native.append(header.compute_block_hash()); |
| 125 | mmr_guest.append(header.compute_block_hash()); |
| 126 | for j in 0..i { |
| 127 | let (mmr_leaf, mmr_proof) = mmr_native.generate_proof(j as u32); |
| 128 | assert!(mmr_native.verify_proof(mmr_leaf, &mmr_proof)); |
| 129 | assert_eq!(mmr_leaf, block_headers[j].compute_block_hash()); |
| 130 | let spv = SPV::new( |
| 131 | txs[j].clone(), |
| 132 | bitcoin_merkle_proofs[j].clone(), |
| 133 | block_headers[j].clone(), |
| 134 | mmr_proof, |
| 135 | ); |
| 136 | assert!(spv.verify(mmr_guest.clone())); |
| 137 | } |
| 138 | } |
| 139 | } |
| 140 | } |
nothing calls this directly
no test coverage detected