Skip to content

Commit e52055b

Browse files
committed
test(tx_graph): add test_verify_tx
Check we can verify a transaction when `TxGraph` has knowledge of the coins being spent. Also check that verification fails either due to missing prevouts or a malformed input.
1 parent 48f171e commit e52055b

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

crates/chain/tests/common/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ macro_rules! block_id {
1414
}};
1515
}
1616

17+
/// Returns `Vec<u8>` from a hex `&str`
18+
#[allow(unused_macros)]
19+
macro_rules! hex {
20+
($hex:literal) => {
21+
<Vec<u8> as bitcoin::hex::FromHex>::from_hex($hex)
22+
};
23+
}
24+
1725
#[allow(unused_macros)]
1826
macro_rules! h {
1927
($index:literal) => {{

crates/chain/tests/test_tx_graph.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,3 +1263,57 @@ fn tx_graph_update_conversion() {
12631263
);
12641264
}
12651265
}
1266+
1267+
#[test]
1268+
#[allow(unused)]
1269+
#[cfg(feature = "bitcoinconsensus")]
1270+
fn test_verify_tx() {
1271+
use bdk_chain::tx_graph::VerifyTxError;
1272+
use bitcoin::consensus;
1273+
use bitcoin::transaction::TxVerifyError;
1274+
1275+
// spent tx
1276+
// txid: 95da344585fcf2e5f7d6cbf2c3df2dcce84f9196f7a7bb901a43275cd6eb7c3f
1277+
let spent: Transaction = consensus::deserialize(hex!("020000000101192dea5e66d444380e106f8e53acb171703f00d43fb6b3ae88ca5644bdb7e1000000006b48304502210098328d026ce138411f957966c1cf7f7597ccbb170f5d5655ee3e9f47b18f6999022017c3526fc9147830e1340e04934476a3d1521af5b4de4e98baf49ec4c072079e01210276f847f77ec8dd66d78affd3c318a0ed26d89dab33fa143333c207402fcec352feffffff023d0ac203000000001976a9144bfbaf6afb76cc5771bc6404810d1cc041a6933988aca4b956050000000017a91494d5543c74a3ee98e0cf8e8caef5dc813a0f34b48768cb0700")
1278+
.unwrap()
1279+
.as_slice())
1280+
.unwrap();
1281+
let spent_prevout: OutPoint =
1282+
"e1b7bd4456ca88aeb3b63fd4003f7071b1ac538e6f100e3844d4665eea2d1901:0"
1283+
.parse()
1284+
.unwrap();
1285+
// spending tx
1286+
// txid: aca326a724eda9a461c10a876534ecd5ae7b27f10f26c3862fb996f80ea2d45d
1287+
let spending: Transaction = consensus::deserialize(hex!("02000000013f7cebd65c27431a90bba7f796914fe8cc2ddfc3f2cbd6f7e5f2fc854534da95000000006b483045022100de1ac3bcdfb0332207c4a91f3832bd2c2915840165f876ab47c5f8996b971c3602201c6c053d750fadde599e6f5c4e1963df0f01fc0d97815e8157e3d59fe09ca30d012103699b464d1d8bc9e47d4fb1cdaa89a1c5783d68363c4dbc4b524ed3d857148617feffffff02836d3c01000000001976a914fc25d6d5c94003bf5b0c7b640a248e2c637fcfb088ac7ada8202000000001976a914fbed3d9b11183209a57999d54d59f67c019e756c88ac6acb0700")
1288+
.unwrap()
1289+
.as_slice())
1290+
.unwrap();
1291+
let spending_prevout: OutPoint =
1292+
"95da344585fcf2e5f7d6cbf2c3df2dcce84f9196f7a7bb901a43275cd6eb7c3f:0"
1293+
.parse()
1294+
.unwrap();
1295+
1296+
// First insert the spending tx. neither verify because we don't have prevouts
1297+
let mut graph = TxGraph::<BlockId>::default();
1298+
let _ = graph.insert_tx(spending.clone());
1299+
assert!(matches!(
1300+
graph.verify_tx(&spending).unwrap_err(),
1301+
VerifyTxError(TxVerifyError::UnknownSpentOutput(outpoint))
1302+
if outpoint == spending_prevout
1303+
));
1304+
assert!(matches!(
1305+
graph.verify_tx(&spent).unwrap_err(),
1306+
VerifyTxError(TxVerifyError::UnknownSpentOutput(outpoint))
1307+
if outpoint == spent_prevout
1308+
));
1309+
// Now insert the spent parent. spending tx verifies
1310+
let _ = graph.insert_tx(spent);
1311+
graph.verify_tx(&spending).unwrap();
1312+
// Verification fails for malformed input
1313+
let mut tx = spending.clone();
1314+
tx.input[0].script_sig = ScriptBuf::from_bytes(vec![0x00; 3]);
1315+
assert!(matches!(
1316+
graph.verify_tx(&tx).unwrap_err(),
1317+
VerifyTxError(TxVerifyError::ScriptVerification(_))
1318+
));
1319+
}

0 commit comments

Comments
 (0)