Browse Source

Define and implement TransactionExt::outpoint

integrate-protocol-maker-side
Lucas Soriano del Pino 4 years ago
parent
commit
66c4c58a2d
No known key found for this signature in database GPG Key ID: EE611E973A1530E7
  1. 59
      cfd_protocol/src/lib.rs

59
cfd_protocol/src/lib.rs

@ -3,6 +3,7 @@ use bdk::bitcoin::hashes::hex::ToHex;
use bdk::bitcoin::hashes::*; use bdk::bitcoin::hashes::*;
use bdk::bitcoin::util::bip143::SigHashCache; use bdk::bitcoin::util::bip143::SigHashCache;
use bdk::bitcoin::util::psbt::{Global, PartiallySignedTransaction}; use bdk::bitcoin::util::psbt::{Global, PartiallySignedTransaction};
use bdk::bitcoin::Script;
use bdk::bitcoin::{ use bdk::bitcoin::{
Address, Amount, OutPoint, PublicKey, SigHash, SigHashType, Transaction, TxIn, TxOut, Address, Amount, OutPoint, PublicKey, SigHash, SigHashType, Transaction, TxIn, TxOut,
}; };
@ -334,21 +335,12 @@ pub fn punish_transaction(
.find_map(|sig| encsig.recover(SECP256K1, &sig, &pub_them_pk.key).ok()) .find_map(|sig| encsig.recover(SECP256K1, &sig, &pub_them_pk.key).ok())
.context("could not recover publish sk from commit tx")?; .context("could not recover publish sk from commit tx")?;
let commit_vout = revoked_commit_tx let commit_outpoint = revoked_commit_tx
.output .outpoint(&commit_descriptor.script_pubkey())
.iter()
.position(|out| out.script_pubkey == commit_descriptor.script_pubkey())
.expect("to find commit output in commit tx"); .expect("to find commit output in commit tx");
let commit_amount = revoked_commit_tx.output[commit_vout].value; let commit_amount = revoked_commit_tx.output[commit_outpoint.vout as usize].value;
let mut punish_tx = { let mut punish_tx = {
let txid = revoked_commit_tx.txid();
let previous_output = OutPoint {
txid,
vout: commit_vout as u32,
};
let output = TxOut { let output = TxOut {
value: commit_amount, value: commit_amount,
script_pubkey: address.script_pubkey(), script_pubkey: address.script_pubkey(),
@ -357,7 +349,7 @@ pub fn punish_transaction(
version: 2, version: 2,
lock_time: 0, lock_time: 0,
input: vec![TxIn { input: vec![TxIn {
previous_output, previous_output: commit_outpoint,
..Default::default() ..Default::default()
}], }],
output: vec![output], output: vec![output],
@ -731,16 +723,10 @@ impl CommitTransaction {
) -> Result<Self> { ) -> Result<Self> {
let lock_descriptor = lock_descriptor(maker_pk, taker_pk); let lock_descriptor = lock_descriptor(maker_pk, taker_pk);
let (lock_outpoint, lock_amount) = { let (lock_outpoint, lock_amount) = {
let vout = lock_tx let outpoint = lock_tx
.output .outpoint(&lock_descriptor.script_pubkey())
.iter()
.position(|out| out.script_pubkey == lock_descriptor.script_pubkey())
.context("lock script not found in lock tx")?; .context("lock script not found in lock tx")?;
let outpoint = OutPoint { let amount = lock_tx.output[outpoint.vout as usize].value;
txid: lock_tx.txid(),
vout: vout as u32,
};
let amount = lock_tx.output[vout].value;
(outpoint, amount) (outpoint, amount)
}; };
@ -798,18 +784,9 @@ impl CommitTransaction {
} }
fn outpoint(&self) -> OutPoint { fn outpoint(&self) -> OutPoint {
let txid = self.inner.txid(); self.inner
let vout = self .outpoint(&self.descriptor.script_pubkey())
.inner .expect("to find commit output in commit tx")
.output
.iter()
.position(|out| out.script_pubkey == self.descriptor.script_pubkey())
.expect("to find commit output in commit tx");
OutPoint {
txid,
vout: vout as u32,
}
} }
fn amount(&self) -> Amount { fn amount(&self) -> Amount {
@ -886,12 +863,26 @@ fn lock_transaction(
pub trait TransactionExt { pub trait TransactionExt {
fn get_virtual_size(&self) -> f64; fn get_virtual_size(&self) -> f64;
fn outpoint(&self, script_pubkey: &Script) -> Result<OutPoint>;
} }
impl TransactionExt for Transaction { impl TransactionExt for Transaction {
fn get_virtual_size(&self) -> f64 { fn get_virtual_size(&self) -> f64 {
self.get_weight() as f64 / 4.0 self.get_weight() as f64 / 4.0
} }
fn outpoint(&self, script_pubkey: &Script) -> Result<OutPoint> {
let vout = self
.output
.iter()
.position(|out| &out.script_pubkey == script_pubkey)
.context("script pubkey not found in tx")?;
Ok(OutPoint {
txid: self.txid(),
vout: vout as u32,
})
}
} }
trait SigHashExt { trait SigHashExt {

Loading…
Cancel
Save