Skip to content

Commit 2d52570

Browse files
author
Antoine Riard
committed
-f Embed malleability detection into constructor
1 parent 73b2223 commit 2d52570

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
4444
use chain::transaction::{OutPoint, TransactionData};
4545
use chain::keysinterface::{SpendableOutputDescriptor, StaticPaymentOutputDescriptor, DelayedPaymentOutputDescriptor, Sign, KeysInterface};
4646
use chain::onchaintx::OnchainTxHandler;
47-
use chain::onchain_utils::{CounterpartyHTLCOutput, HolderFundingOutput, HolderHTLCOutput, PackageMalleability, PackageSolvingData, PackageTemplate, RevokedOutput, WEIGHT_REVOKED_OUTPUT, WEIGHT_REVOKED_RECEIVED_HTLC, WEIGHT_REVOKED_OFFERED_HTLC};
47+
use chain::onchain_utils::{CounterpartyHTLCOutput, HolderFundingOutput, HolderHTLCOutput, PackageSolvingData, PackageTemplate, RevokedOutput, WEIGHT_REVOKED_OUTPUT, WEIGHT_REVOKED_RECEIVED_HTLC, WEIGHT_REVOKED_OFFERED_HTLC};
4848
use chain::Filter;
4949
use util::logger::Logger;
5050
use util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable, U48};
@@ -1572,7 +1572,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
15721572
for (idx, outp) in tx.output.iter().enumerate() {
15731573
if outp.script_pubkey == revokeable_p2wsh {
15741574
let revk_outp = RevokedOutput::build(per_commitment_point, per_commitment_key, self.counterparty_tx_cache.counterparty_delayed_payment_base_key, self.counterparty_tx_cache.counterparty_htlc_base_key, WEIGHT_REVOKED_OUTPUT, outp.value, None, self.counterparty_tx_cache.on_counterparty_tx_csv);
1575-
let justice_package = PackageTemplate::build_package(commitment_txid, idx as u32, PackageSolvingData::RevokedOutput(revk_outp), PackageMalleability::Malleable, height + self.counterparty_tx_cache.on_counterparty_tx_csv as u32, true, 0, None, height);
1575+
let justice_package = PackageTemplate::build_package(commitment_txid, idx as u32, PackageSolvingData::RevokedOutput(revk_outp), height + self.counterparty_tx_cache.on_counterparty_tx_csv as u32, true, 0, None, height);
15761576
claimable_outpoints.push(justice_package);
15771577
}
15781578
}
@@ -1586,7 +1586,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
15861586
return (claimable_outpoints, (commitment_txid, watch_outputs)); // Corrupted per_commitment_data, fuck this user
15871587
}
15881588
let revk_outp = RevokedOutput::build(per_commitment_point, per_commitment_key, self.counterparty_tx_cache.counterparty_delayed_payment_base_key, self.counterparty_tx_cache.counterparty_htlc_base_key, if htlc.offered { WEIGHT_REVOKED_OFFERED_HTLC } else { WEIGHT_REVOKED_RECEIVED_HTLC }, htlc.amount_msat / 1000, Some(htlc.clone()), self.counterparty_tx_cache.on_counterparty_tx_csv);
1589-
let justice_package = PackageTemplate::build_package(commitment_txid, transaction_output_index, PackageSolvingData::RevokedOutput(revk_outp), PackageMalleability::Malleable, htlc.cltv_expiry, true, 0, None, height);
1589+
let justice_package = PackageTemplate::build_package(commitment_txid, transaction_output_index, PackageSolvingData::RevokedOutput(revk_outp), htlc.cltv_expiry, true, 0, None, height);
15901590
claimable_outpoints.push(justice_package);
15911591
}
15921592
}
@@ -1735,7 +1735,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
17351735
let preimage = if htlc.offered { if let Some(p) = self.payment_preimages.get(&htlc.payment_hash) { Some(*p) } else { None } } else { None };
17361736
if preimage.is_some() || !htlc.offered {
17371737
let counterparty_htlc_outp = CounterpartyHTLCOutput::build(*revocation_point, self.counterparty_tx_cache.counterparty_delayed_payment_base_key, self.counterparty_tx_cache.counterparty_htlc_base_key, preimage, htlc.clone());
1738-
let counterparty_package = PackageTemplate::build_package(commitment_txid, transaction_output_index, PackageSolvingData::CounterpartyHTLCOutput(counterparty_htlc_outp), PackageMalleability::Malleable, htlc.cltv_expiry, if !htlc.offered { false } else { true }, 0, None, 0);
1738+
let counterparty_package = PackageTemplate::build_package(commitment_txid, transaction_output_index, PackageSolvingData::CounterpartyHTLCOutput(counterparty_htlc_outp), htlc.cltv_expiry, if !htlc.offered { false } else { true }, 0, None, 0);
17391739
claimable_outpoints.push(counterparty_package);
17401740
}
17411741
}
@@ -1768,7 +1768,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
17681768

17691769
log_trace!(logger, "Counterparty HTLC broadcast {}:{}", htlc_txid, 0);
17701770
let revk_outp = RevokedOutput::build(per_commitment_point, per_commitment_key, self.counterparty_tx_cache.counterparty_delayed_payment_base_key, self.counterparty_tx_cache.counterparty_htlc_base_key, WEIGHT_REVOKED_OUTPUT, tx.output[0].value, None, self.counterparty_tx_cache.on_counterparty_tx_csv);
1771-
let justice_package = PackageTemplate::build_package(htlc_txid, 0, PackageSolvingData::RevokedOutput(revk_outp), PackageMalleability::Malleable, height + self.counterparty_tx_cache.on_counterparty_tx_csv as u32, true, 0, None, height);
1771+
let justice_package = PackageTemplate::build_package(htlc_txid, 0, PackageSolvingData::RevokedOutput(revk_outp), height + self.counterparty_tx_cache.on_counterparty_tx_csv as u32, true, 0, None, height);
17721772
let claimable_outpoints = vec!(justice_package);
17731773
let outputs = vec![(0, tx.output[0].clone())];
17741774
(claimable_outpoints, Some((htlc_txid, outputs)))
@@ -1793,7 +1793,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
17931793
continue;
17941794
}
17951795
} else { None }, htlc.amount_msat);
1796-
let htlc_package = PackageTemplate::build_package(holder_tx.txid, transaction_output_index, PackageSolvingData::HolderHTLCOutput(htlc_output), PackageMalleability::Untractable, height, false, 0, None, height);
1796+
let htlc_package = PackageTemplate::build_package(holder_tx.txid, transaction_output_index, PackageSolvingData::HolderHTLCOutput(htlc_output), height, false, 0, None, height);
17971797
claim_requests.push(htlc_package);
17981798
}
17991799
}
@@ -2067,7 +2067,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
20672067
let should_broadcast = self.would_broadcast_at_height(height, &logger);
20682068
if should_broadcast {
20692069
let funding_outp = HolderFundingOutput::build(self.funding_redeemscript.clone());
2070-
let commitment_package = PackageTemplate::build_package(self.funding_info.0.txid.clone(), self.funding_info.0.index as u32, PackageSolvingData::HolderFundingOutput(funding_outp), PackageMalleability::Untractable, height, false, 0, None, height);
2070+
let commitment_package = PackageTemplate::build_package(self.funding_info.0.txid.clone(), self.funding_info.0.index as u32, PackageSolvingData::HolderFundingOutput(funding_outp), height, false, 0, None, height);
20712071
claimable_outpoints.push(commitment_package);
20722072
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
20732073
let commitment_tx = self.onchain_tx_handler.get_fully_signed_holder_tx(&self.funding_redeemscript);

lightning/src/chain/onchain_utils.rs

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,13 @@ impl PackageTemplate {
577577
},
578578
}
579579
}
580-
pub (crate) fn build_package(txid: Txid, vout: u32, input_solving_data: PackageSolvingData, malleability: PackageMalleability, absolute_timelock: u32, aggregation: bool, feerate_previous: u64, height_timer: Option<u32>, height_original: u32) -> Self {
580+
pub (crate) fn build_package(txid: Txid, vout: u32, input_solving_data: PackageSolvingData, absolute_timelock: u32, aggregation: bool, feerate_previous: u64, height_timer: Option<u32>, height_original: u32) -> Self {
581+
let malleability = match input_solving_data {
582+
PackageSolvingData::RevokedOutput(..) => { PackageMalleability::Malleable },
583+
PackageSolvingData::CounterpartyHTLCOutput(..) => { PackageMalleability::Malleable },
584+
PackageSolvingData::HolderHTLCOutput(..) => { PackageMalleability::Untractable },
585+
PackageSolvingData::HolderFundingOutput(..) => { PackageMalleability::Untractable },
586+
};
581587
let mut inputs = Vec::with_capacity(1);
582588
inputs.push((BitcoinOutPoint { txid, vout }, input_solving_data));
583589
PackageTemplate {
@@ -792,32 +798,32 @@ mod tests {
792798
let secp_ctx = Secp256k1::new();
793799
let revk_outp = dumb_revk_output!(secp_ctx);
794800

795-
let mut package_one_hundred = PackageTemplate::build_package(txid, 0, revk_outp.clone(), PackageMalleability::Malleable, 1000, true, 0, None, 100);
796-
let package_two_hundred = PackageTemplate::build_package(txid, 1, revk_outp.clone(), PackageMalleability::Malleable, 1000, true, 0, None, 200);
801+
let mut package_one_hundred = PackageTemplate::build_package(txid, 0, revk_outp.clone(), 1000, true, 0, None, 100);
802+
let package_two_hundred = PackageTemplate::build_package(txid, 1, revk_outp.clone(), 1000, true, 0, None, 200);
797803
package_one_hundred.merge_package(package_two_hundred);
798804
}
799805

800806
#[test]
801-
#[should_panic]
807+
//TODO: replace second with another type of output
802808
fn test_package_untractable_merge_to() {
803809
let txid = Txid::from_hex("c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e").unwrap();
804810
let secp_ctx = Secp256k1::new();
805811
let revk_outp = dumb_revk_output!(secp_ctx);
806812

807-
let mut untractable_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), PackageMalleability::Untractable, 1000, true, 0, None, 100);
808-
let malleable_package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), PackageMalleability::Malleable, 1000, true, 0, None, 100);
813+
let mut untractable_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), 1000, true, 0, None, 100);
814+
let malleable_package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), 1000, true, 0, None, 100);
809815
untractable_package.merge_package(malleable_package);
810816
}
811817

812818
#[test]
813-
#[should_panic]
819+
//TODO: replace second with another type of output
814820
fn test_package_untractable_merge_from() {
815821
let txid = Txid::from_hex("c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e").unwrap();
816822
let secp_ctx = Secp256k1::new();
817823
let revk_outp = dumb_revk_output!(secp_ctx);
818824

819-
let mut malleable_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), PackageMalleability::Malleable, 1000, true, 0, None, 100);
820-
let untractable_package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), PackageMalleability::Untractable, 1000, true, 0, None, 100);
825+
let mut malleable_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), 1000, true, 0, None, 100);
826+
let untractable_package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), 1000, true, 0, None, 100);
821827
malleable_package.merge_package(untractable_package);
822828
}
823829

@@ -828,8 +834,8 @@ mod tests {
828834
let secp_ctx = Secp256k1::new();
829835
let revk_outp = dumb_revk_output!(secp_ctx);
830836

831-
let mut noaggregation_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), PackageMalleability::Malleable, 1000, false, 0, None, 100);
832-
let aggregation_package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), PackageMalleability::Malleable, 1000, true, 0, None, 100);
837+
let mut noaggregation_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), 1000, false, 0, None, 100);
838+
let aggregation_package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), 1000, true, 0, None, 100);
833839
noaggregation_package.merge_package(aggregation_package);
834840
}
835841

@@ -840,8 +846,8 @@ mod tests {
840846
let secp_ctx = Secp256k1::new();
841847
let revk_outp = dumb_revk_output!(secp_ctx);
842848

843-
let mut aggregation_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), PackageMalleability::Malleable, 1000, true, 0, None, 100);
844-
let noaggregation_package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), PackageMalleability::Malleable, 1000, false, 0, None, 100);
849+
let mut aggregation_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), 1000, true, 0, None, 100);
850+
let noaggregation_package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), 1000, false, 0, None, 100);
845851
aggregation_package.merge_package(noaggregation_package);
846852
}
847853

@@ -852,9 +858,9 @@ mod tests {
852858
let secp_ctx = Secp256k1::new();
853859
let revk_outp = dumb_revk_output!(secp_ctx);
854860

855-
let mut empty_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), PackageMalleability::Malleable, 1000, true, 0, None, 100);
861+
let mut empty_package = PackageTemplate::build_package(txid, 0, revk_outp.clone(), 1000, true, 0, None, 100);
856862
empty_package.inputs = vec![];
857-
let package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), PackageMalleability::Malleable, 1000, true, 0, None, 100);
863+
let package = PackageTemplate::build_package(txid, 1, revk_outp.clone(), 1000, true, 0, None, 100);
858864
empty_package.merge_package(package);
859865
}
860866

@@ -866,8 +872,8 @@ mod tests {
866872
let revk_outp = dumb_revk_output!(secp_ctx);
867873
let counterparty_outp = dumb_counterparty_output!(secp_ctx);
868874

869-
let mut revoked_package = PackageTemplate::build_package(txid, 0, revk_outp, PackageMalleability::Malleable, 1000, true, 0, None, 100);
870-
let counterparty_package = PackageTemplate::build_package(txid, 1, counterparty_outp, PackageMalleability::Malleable, 1000, true, 0, None, 100);
875+
let mut revoked_package = PackageTemplate::build_package(txid, 0, revk_outp, 1000, true, 0, None, 100);
876+
let counterparty_package = PackageTemplate::build_package(txid, 1, counterparty_outp, 1000, true, 0, None, 100);
871877
revoked_package.merge_package(counterparty_package);
872878
}
873879

0 commit comments

Comments
 (0)