Skip to content

Commit 086ab3b

Browse files
author
Antoine Riard
committed
-f Dry-up feerate_previous from OnchainRequest to PackageTemplate
1 parent 90fd429 commit 086ab3b

File tree

3 files changed

+37
-26
lines changed

3 files changed

+37
-26
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,8 +1582,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
15821582
for (idx, outp) in tx.output.iter().enumerate() {
15831583
if outp.script_pubkey == revokeable_p2wsh {
15841584
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, InputDescriptors::RevokedOutput, outp.value, None, self.counterparty_tx_cache.on_counterparty_tx_csv);
1585-
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);
1586-
claimable_outpoints.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: justice_package});
1585+
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);
1586+
claimable_outpoints.push(OnchainRequest { height_timer: None, height_original: height, content: justice_package});
15871587
}
15881588
}
15891589

@@ -1596,8 +1596,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
15961596
return (claimable_outpoints, (commitment_txid, watch_outputs)); // Corrupted per_commitment_data, fuck this user
15971597
}
15981598
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 { InputDescriptors::RevokedOfferedHTLC } else { InputDescriptors::RevokedReceivedHTLC }, htlc.amount_msat / 1000, Some(htlc.clone()), self.counterparty_tx_cache.on_counterparty_tx_csv);
1599-
let justice_package = PackageTemplate::build_package(commitment_txid, transaction_output_index, PackageSolvingData::RevokedOutput(revk_outp), PackageMalleability::Malleable, htlc.cltv_expiry, true);
1600-
claimable_outpoints.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: justice_package});
1599+
let justice_package = PackageTemplate::build_package(commitment_txid, transaction_output_index, PackageSolvingData::RevokedOutput(revk_outp), PackageMalleability::Malleable, htlc.cltv_expiry, true, 0);
1600+
claimable_outpoints.push(OnchainRequest { height_timer: None, height_original: height, content: justice_package});
16011601
}
16021602
}
16031603
}
@@ -1745,8 +1745,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
17451745
let preimage = if htlc.offered { if let Some(p) = self.payment_preimages.get(&htlc.payment_hash) { Some(*p) } else { None } } else { None };
17461746
if preimage.is_some() || !htlc.offered {
17471747
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());
1748-
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 });
1749-
claimable_outpoints.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: /*XXX(ariard) Option<height> */ 0, content: counterparty_package });
1748+
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);
1749+
claimable_outpoints.push(OnchainRequest { height_timer: None, height_original: /*XXX(ariard) Option<height> */ 0, content: counterparty_package });
17501750
}
17511751
}
17521752
}
@@ -1778,8 +1778,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
17781778

17791779
log_trace!(logger, "Counterparty HTLC broadcast {}:{}", htlc_txid, 0);
17801780
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, InputDescriptors::RevokedOutput, tx.output[0].value, None, self.counterparty_tx_cache.on_counterparty_tx_csv);
1781-
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);
1782-
let claimable_outpoints = vec!(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: justice_package });
1781+
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);
1782+
let claimable_outpoints = vec!(OnchainRequest { height_timer: None, height_original: height, content: justice_package });
17831783
let outputs = vec![(0, tx.output[0].clone())];
17841784
(claimable_outpoints, Some((htlc_txid, outputs)))
17851785
}
@@ -1803,8 +1803,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
18031803
continue;
18041804
}
18051805
} else { None }, htlc.amount_msat);
1806-
let htlc_package = PackageTemplate::build_package(holder_tx.txid, transaction_output_index, PackageSolvingData::HolderHTLCOutput(htlc_output), PackageMalleability::Untractable, height, false);
1807-
claim_requests.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: htlc_package });
1806+
let htlc_package = PackageTemplate::build_package(holder_tx.txid, transaction_output_index, PackageSolvingData::HolderHTLCOutput(htlc_output), PackageMalleability::Untractable, height, false, 0);
1807+
claim_requests.push(OnchainRequest { height_timer: None, height_original: height, content: htlc_package });
18081808
}
18091809
}
18101810

@@ -2077,8 +2077,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
20772077
let should_broadcast = self.would_broadcast_at_height(height, &logger);
20782078
if should_broadcast {
20792079
let funding_outp = HolderFundingOutput::build(self.funding_redeemscript.clone());
2080-
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);
2081-
claimable_outpoints.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: commitment_package });
2080+
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);
2081+
claimable_outpoints.push(OnchainRequest { height_timer: None, height_original: height, content: commitment_package });
20822082
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
20832083
let commitment_tx = self.onchain_tx_handler.get_fully_signed_holder_tx(&self.funding_redeemscript);
20842084
self.holder_tx_signed = true;

lightning/src/chain/onchain_utils.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,9 @@ pub(crate) struct PackageTemplate {
488488
// of a sooner-HTLC could be swallowed by the highest nLocktime of the HTLC set.
489489
// To simplify we mark them as non-aggregable.
490490
aggregation: bool,
491-
491+
// Based feerate of previous broadcast. If resources available (either
492+
// output value or utxo bumping).
493+
feerate_previous: u64,
492494
}
493495

494496
impl PackageTemplate {
@@ -501,6 +503,12 @@ impl PackageTemplate {
501503
pub(crate) fn aggregation(&self) -> bool {
502504
self.aggregation
503505
}
506+
pub(crate) fn get_feerate(&self) -> u64 {
507+
self.feerate_previous
508+
}
509+
pub(crate) fn load_feerate(&mut self, new_feerate: u64) {
510+
self.feerate_previous = new_feerate;
511+
}
504512
pub(crate) fn outpoints(&self) -> Vec<&BitcoinOutPoint> {
505513
let mut outpoints = Vec::with_capacity(self.inputs.len());
506514
for (o, _) in self.inputs.iter() {
@@ -514,13 +522,15 @@ impl PackageTemplate {
514522
let mut split_package = None;
515523
let timelock = self.absolute_timelock;
516524
let aggregation = self.aggregation;
525+
let feerate_previous = self.feerate_previous;
517526
self.inputs.retain(|outp| {
518527
if *split_outp == outp.0 {
519528
split_package = Some(PackageTemplate {
520529
inputs: vec![(outp.0, outp.1.clone())],
521530
malleability: PackageMalleability::Malleable,
522531
absolute_timelock: timelock,
523532
aggregation,
533+
feerate_previous,
524534
});
525535
return false;
526536
}
@@ -557,6 +567,9 @@ impl PackageTemplate {
557567
if self.absolute_timelock > merge_from.absolute_timelock {
558568
self.absolute_timelock = merge_from.absolute_timelock;
559569
}
570+
if self.feerate_previous > merge_from.feerate_previous {
571+
self.feerate_previous = merge_from.feerate_previous;
572+
}
560573
}
561574
pub(crate) fn package_amount(&self) -> u64 {
562575
let mut amounts = 0;
@@ -629,14 +642,15 @@ impl PackageTemplate {
629642
},
630643
}
631644
}
632-
pub (crate) fn build_package(txid: Txid, vout: u32, input_solving_data: PackageSolvingData, malleability: PackageMalleability, absolute_timelock: u32, aggregation: bool) -> Self {
645+
pub (crate) fn build_package(txid: Txid, vout: u32, input_solving_data: PackageSolvingData, malleability: PackageMalleability, absolute_timelock: u32, aggregation: bool, feerate_previous: u64) -> Self {
633646
let mut inputs = Vec::with_capacity(1);
634647
inputs.push((BitcoinOutPoint { txid, vout }, input_solving_data));
635648
PackageTemplate {
636649
inputs,
637650
malleability,
638651
absolute_timelock,
639-
aggregation
652+
aggregation,
653+
feerate_previous
640654
}
641655
}
642656
}
@@ -651,6 +665,7 @@ impl Writeable for PackageTemplate {
651665
self.malleability.write(writer)?;
652666
self.absolute_timelock.write(writer)?;
653667
self.aggregation.write(writer)?;
668+
self.feerate_previous.write(writer)?;
654669
Ok(())
655670
}
656671
}
@@ -667,11 +682,13 @@ impl Readable for PackageTemplate {
667682
let malleability = Readable::read(reader)?;
668683
let absolute_timelock = Readable::read(reader)?;
669684
let aggregation = Readable::read(reader)?;
685+
let feerate_previous = Readable::read(reader)?;
670686
Ok(PackageTemplate {
671687
inputs,
672688
malleability,
673689
absolute_timelock,
674-
aggregation
690+
aggregation,
691+
feerate_previous
675692
})
676693
}
677694
}
@@ -695,9 +712,6 @@ impl Readable for PackageTemplate {
695712
/// Content embeds transactions elements to generate transaction. See PackageTemplate.
696713
#[derive(PartialEq, Clone)]
697714
pub struct OnchainRequest {
698-
// Based feerate of previous broadcast. If resources available (either
699-
// output value or utxo bumping).
700-
pub(crate) feerate_previous: u64,
701715
// At every block tick, used to check if pending claiming tx is taking too
702716
// much time for confirmation and we need to bump it.
703717
pub(crate) height_timer: Option<u32>,
@@ -716,7 +730,6 @@ impl OnchainRequest {
716730

717731
impl Writeable for OnchainRequest {
718732
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
719-
self.feerate_previous.write(writer)?;
720733
self.height_timer.write(writer)?;
721734
self.height_original.write(writer)?;
722735
self.content.write(writer)?;
@@ -727,13 +740,11 @@ impl Writeable for OnchainRequest {
727740

728741
impl Readable for OnchainRequest {
729742
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
730-
let feerate_previous = Readable::read(reader)?;
731743
let height_timer = Readable::read(reader)?;
732744
let height_original = Readable::read(reader)?;
733745
let content = Readable::read(reader)?;
734746

735747
Ok(OnchainRequest {
736-
feerate_previous,
737748
height_timer,
738749
height_original,
739750
content

lightning/src/chain/onchaintx.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
351351
let amt = cached_request.content.package_amount();
352352
if cached_request.content.is_malleable() {
353353
let predicted_weight = cached_request.content.package_weight(&self.destination_script);
354-
if let Some((output_value, new_feerate)) = onchain_utils::compute_output_value(predicted_weight, amt, cached_request.feerate_previous, fee_estimator, logger) {
354+
if let Some((output_value, new_feerate)) = onchain_utils::compute_output_value(predicted_weight, amt, cached_request.content.get_feerate(), fee_estimator, logger) {
355355
assert!(new_feerate != 0);
356356

357357
let transaction = cached_request.content.finalize_package(self, output_value, self.destination_script.clone(), logger).unwrap();
@@ -409,7 +409,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
409409
for mut req in preprocessed_requests {
410410
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &req, &*fee_estimator, &*logger) {
411411
req.height_timer = new_timer;
412-
req.feerate_previous = new_feerate;
412+
req.content.load_feerate(new_feerate);
413413
let txid = tx.txid();
414414
for k in req.content.outpoints() {
415415
log_trace!(logger, "Registering claiming request for {}:{}", k.txid, k.vout);
@@ -537,7 +537,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
537537
broadcaster.broadcast_transaction(&bump_tx);
538538
if let Some(request) = self.pending_claim_requests.get_mut(first_claim_txid) {
539539
request.height_timer = new_timer;
540-
request.feerate_previous = new_feerate;
540+
request.content.load_feerate(new_feerate);
541541
}
542542
}
543543
}
@@ -599,7 +599,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
599599
for (_, request) in bump_candidates.iter_mut() {
600600
if let Some((new_timer, new_feerate, bump_tx)) = self.generate_claim_tx(height, &request, &&*fee_estimator, &&*logger) {
601601
request.height_timer = new_timer;
602-
request.feerate_previous = new_feerate;
602+
request.content.load_feerate(new_feerate);
603603
broadcaster.broadcast_transaction(&bump_tx);
604604
}
605605
}

0 commit comments

Comments
 (0)