Skip to content

Commit ca85529

Browse files
committed
Add Wallet::verify_tx
Verify that a tx meets bitcoinconsensus
1 parent d459c46 commit ca85529

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ bdk = { version = "0.29.0", default-features = false, features = ["std", "async-
5959

6060
reqwest = { version = "0.11", default-features = false, features = ["json", "rustls-tls"] }
6161
rusqlite = { version = "0.28.0", features = ["bundled"] }
62-
bitcoin = "0.30.2"
62+
bitcoin = { version = "0.30.2", features = ["bitcoinconsensus"] }
6363
bip39 = "2.0.0"
6464

6565
rand = "0.8.5"

src/wallet.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ use bitcoin::blockdata::locktime::absolute::LockTime;
2525
use bitcoin::secp256k1::ecdh::SharedSecret;
2626
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
2727
use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey, Signing};
28-
use bitcoin::{ScriptBuf, Transaction, TxOut, Txid};
28+
use bitcoin::{bitcoinconsensus, ScriptBuf, Transaction, TxOut, Txid};
2929

30+
use std::collections::HashMap;
3031
use std::ops::Deref;
3132
use std::sync::{Arc, Condvar, Mutex};
3233
use std::time::Duration;
@@ -116,6 +117,29 @@ where
116117
Ok(self.inner.lock().unwrap().is_mine(script)?)
117118
}
118119

120+
pub async fn verify_tx(&self, tx: Transaction) -> Result<(), Error> {
121+
let serialized_tx = bitcoin::consensus::serialize(&tx);
122+
for (index, input) in tx.input.iter().enumerate() {
123+
let input = input.clone();
124+
let txid = input.previous_output.txid;
125+
let prev_tx = if let Ok(prev_tx) = self.blockchain.get_tx(&txid).await {
126+
prev_tx.unwrap()
127+
} else {
128+
dbg!("maybe conibase?");
129+
continue;
130+
};
131+
let spent_output = prev_tx.output.get(input.previous_output.vout as usize).unwrap();
132+
bitcoinconsensus::verify(
133+
&spent_output.script_pubkey.to_bytes(),
134+
spent_output.value,
135+
&serialized_tx,
136+
index,
137+
)
138+
.unwrap();
139+
}
140+
Ok(())
141+
}
142+
119143
pub(crate) fn sign_tx(&self, psbt: &Psbt, options: Option<SignOptions>) -> Result<Psbt, Error> {
120144
let wallet = self.inner.lock().unwrap();
121145
let mut psbt = psbt.clone();

0 commit comments

Comments
 (0)