Skip to content

Commit 6c7d87a

Browse files
author
Antoine Riard
committed
-f Dry-up feerate_previous from OnchainRequest to PackageTemplate
1 parent a0840cb commit 6c7d87a

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
@@ -1462,8 +1462,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
14621462
for (idx, outp) in tx.output.iter().enumerate() {
14631463
if outp.script_pubkey == revokeable_p2wsh {
14641464
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);
1465-
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);
1466-
claimable_outpoints.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: justice_package});
1465+
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);
1466+
claimable_outpoints.push(OnchainRequest { height_timer: None, height_original: height, content: justice_package});
14671467
}
14681468
}
14691469

@@ -1476,8 +1476,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
14761476
return (claimable_outpoints, (commitment_txid, watch_outputs)); // Corrupted per_commitment_data, fuck this user
14771477
}
14781478
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);
1479-
let justice_package = PackageTemplate::build_package(commitment_txid, transaction_output_index, PackageSolvingData::RevokedOutput(revk_outp), PackageMalleability::Malleable, htlc.cltv_expiry, true);
1480-
claimable_outpoints.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: justice_package});
1479+
let justice_package = PackageTemplate::build_package(commitment_txid, transaction_output_index, PackageSolvingData::RevokedOutput(revk_outp), PackageMalleability::Malleable, htlc.cltv_expiry, true, 0);
1480+
claimable_outpoints.push(OnchainRequest { height_timer: None, height_original: height, content: justice_package});
14811481
}
14821482
}
14831483
}
@@ -1626,8 +1626,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
16261626
let preimage = if htlc.offered { if let Some(p) = self.payment_preimages.get(&htlc.payment_hash) { Some(*p) } else { None } } else { None };
16271627
if preimage.is_some() || !htlc.offered {
16281628
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());
1629-
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 });
1630-
claimable_outpoints.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: /*XXX(ariard) Option<height> */ 0, content: counterparty_package });
1629+
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);
1630+
claimable_outpoints.push(OnchainRequest { height_timer: None, height_original: /*XXX(ariard) Option<height> */ 0, content: counterparty_package });
16311631
}
16321632
}
16331633
}
@@ -1659,8 +1659,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
16591659

16601660
log_trace!(logger, "Counterparty HTLC broadcast {}:{}", htlc_txid, 0);
16611661
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);
1662-
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);
1663-
let claimable_outpoints = vec!(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: justice_package });
1662+
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);
1663+
let claimable_outpoints = vec!(OnchainRequest { height_timer: None, height_original: height, content: justice_package });
16641664
let outputs = vec![(0, tx.output[0].clone())];
16651665
(claimable_outpoints, Some((htlc_txid, outputs)))
16661666
}
@@ -1684,8 +1684,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
16841684
continue;
16851685
}
16861686
} else { None }, htlc.amount_msat);
1687-
let htlc_package = PackageTemplate::build_package(holder_tx.txid, transaction_output_index, PackageSolvingData::HolderHTLCOutput(htlc_output), PackageMalleability::Untractable, height, false);
1688-
claim_requests.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: htlc_package });
1687+
let htlc_package = PackageTemplate::build_package(holder_tx.txid, transaction_output_index, PackageSolvingData::HolderHTLCOutput(htlc_output), PackageMalleability::Untractable, height, false, 0);
1688+
claim_requests.push(OnchainRequest { height_timer: None, height_original: height, content: htlc_package });
16891689
}
16901690
}
16911691

@@ -1893,8 +1893,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
18931893
let should_broadcast = self.would_broadcast_at_height(height, &logger);
18941894
if should_broadcast {
18951895
let funding_outp = HolderFundingOutput::build(self.funding_redeemscript.clone());
1896-
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);
1897-
claimable_outpoints.push(OnchainRequest { feerate_previous: 0, height_timer: None, height_original: height, content: commitment_package });
1896+
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);
1897+
claimable_outpoints.push(OnchainRequest { height_timer: None, height_original: height, content: commitment_package });
18981898
}
18991899
if should_broadcast {
19001900
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));

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
@@ -336,7 +336,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
336336
let amt = cached_request.content.package_amount();
337337
if cached_request.content.is_malleable() {
338338
let predicted_weight = cached_request.content.package_weight(&self.destination_script);
339-
if let Some((output_value, new_feerate)) = onchain_utils::compute_output_value(predicted_weight, amt, cached_request.feerate_previous, fee_estimator, logger) {
339+
if let Some((output_value, new_feerate)) = onchain_utils::compute_output_value(predicted_weight, amt, cached_request.content.get_feerate(), fee_estimator, logger) {
340340
assert!(new_feerate != 0);
341341

342342
let transaction = cached_request.content.finalize_package(self, output_value, self.destination_script.clone(), logger).unwrap();
@@ -394,7 +394,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
394394
for mut req in preprocessed_requests {
395395
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &req, &*fee_estimator, &*logger) {
396396
req.height_timer = new_timer;
397-
req.feerate_previous = new_feerate;
397+
req.content.load_feerate(new_feerate);
398398
let txid = tx.txid();
399399
for k in req.content.outpoints() {
400400
log_trace!(logger, "Registering claiming request for {}:{}", k.txid, k.vout);
@@ -524,7 +524,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
524524
broadcaster.broadcast_transaction(&bump_tx);
525525
if let Some(request) = self.pending_claim_requests.get_mut(first_claim_txid) {
526526
request.height_timer = new_timer;
527-
request.feerate_previous = new_feerate;
527+
request.content.load_feerate(new_feerate);
528528
}
529529
}
530530
}
@@ -558,7 +558,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
558558
for (_, request) in bump_candidates.iter_mut() {
559559
if let Some((new_timer, new_feerate, bump_tx)) = self.generate_claim_tx(height, &request, &&*fee_estimator, &&*logger) {
560560
request.height_timer = new_timer;
561-
request.feerate_previous = new_feerate;
561+
request.content.load_feerate(new_feerate);
562562
broadcaster.broadcast_transaction(&bump_tx);
563563
}
564564
}

0 commit comments

Comments
 (0)