Skip to content

Commit 665ea60

Browse files
author
Antoine Riard
committed
-f Dry-up height_timer from OnchainRequest to PackageTemplate
1 parent 086ab3b commit 665ea60

File tree

3 files changed

+38
-25
lines changed

3 files changed

+38
-25
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, 0);
1586-
claimable_outpoints.push(OnchainRequest { 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, None);
1586+
claimable_outpoints.push(OnchainRequest { 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, 0);
1600-
claimable_outpoints.push(OnchainRequest { 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, None);
1600+
claimable_outpoints.push(OnchainRequest { 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 }, 0);
1749-
claimable_outpoints.push(OnchainRequest { 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, None);
1749+
claimable_outpoints.push(OnchainRequest { 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, 0);
1782-
let claimable_outpoints = vec!(OnchainRequest { 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, None);
1782+
let claimable_outpoints = vec!(OnchainRequest { 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, 0);
1807-
claim_requests.push(OnchainRequest { 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, None);
1807+
claim_requests.push(OnchainRequest { 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, 0);
2081-
claimable_outpoints.push(OnchainRequest { 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, None);
2081+
claimable_outpoints.push(OnchainRequest { 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: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,9 @@ pub(crate) struct PackageTemplate {
491491
// Based feerate of previous broadcast. If resources available (either
492492
// output value or utxo bumping).
493493
feerate_previous: u64,
494+
// At every block tick, used to check if pending claiming tx is taking too
495+
// much time for confirmation and we need to bump it.
496+
height_timer: Option<u32>,
494497
}
495498

496499
impl PackageTemplate {
@@ -509,6 +512,15 @@ impl PackageTemplate {
509512
pub(crate) fn load_feerate(&mut self, new_feerate: u64) {
510513
self.feerate_previous = new_feerate;
511514
}
515+
pub(crate) fn get_timer(&self) -> Option<u32> {
516+
if let Some(ref timer) = self.height_timer {
517+
return Some(*timer);
518+
}
519+
None
520+
}
521+
pub(crate) fn load_timer(&mut self, new_timer: Option<u32>) {
522+
self.height_timer = new_timer;
523+
}
512524
pub(crate) fn outpoints(&self) -> Vec<&BitcoinOutPoint> {
513525
let mut outpoints = Vec::with_capacity(self.inputs.len());
514526
for (o, _) in self.inputs.iter() {
@@ -523,6 +535,7 @@ impl PackageTemplate {
523535
let timelock = self.absolute_timelock;
524536
let aggregation = self.aggregation;
525537
let feerate_previous = self.feerate_previous;
538+
let height_timer = self.height_timer;
526539
self.inputs.retain(|outp| {
527540
if *split_outp == outp.0 {
528541
split_package = Some(PackageTemplate {
@@ -531,6 +544,7 @@ impl PackageTemplate {
531544
absolute_timelock: timelock,
532545
aggregation,
533546
feerate_previous,
547+
height_timer,
534548
});
535549
return false;
536550
}
@@ -570,6 +584,7 @@ impl PackageTemplate {
570584
if self.feerate_previous > merge_from.feerate_previous {
571585
self.feerate_previous = merge_from.feerate_previous;
572586
}
587+
self.height_timer = cmp::min(self.height_timer, merge_from.height_timer);
573588
}
574589
pub(crate) fn package_amount(&self) -> u64 {
575590
let mut amounts = 0;
@@ -642,15 +657,16 @@ impl PackageTemplate {
642657
},
643658
}
644659
}
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 {
660+
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>) -> Self {
646661
let mut inputs = Vec::with_capacity(1);
647662
inputs.push((BitcoinOutPoint { txid, vout }, input_solving_data));
648663
PackageTemplate {
649664
inputs,
650665
malleability,
651666
absolute_timelock,
652667
aggregation,
653-
feerate_previous
668+
feerate_previous,
669+
height_timer,
654670
}
655671
}
656672
}
@@ -666,6 +682,7 @@ impl Writeable for PackageTemplate {
666682
self.absolute_timelock.write(writer)?;
667683
self.aggregation.write(writer)?;
668684
self.feerate_previous.write(writer)?;
685+
self.height_timer.write(writer)?;
669686
Ok(())
670687
}
671688
}
@@ -683,12 +700,14 @@ impl Readable for PackageTemplate {
683700
let absolute_timelock = Readable::read(reader)?;
684701
let aggregation = Readable::read(reader)?;
685702
let feerate_previous = Readable::read(reader)?;
703+
let height_timer = Readable::read(reader)?;
686704
Ok(PackageTemplate {
687705
inputs,
688706
malleability,
689707
absolute_timelock,
690708
aggregation,
691-
feerate_previous
709+
feerate_previous,
710+
height_timer,
692711
})
693712
}
694713
}
@@ -712,9 +731,6 @@ impl Readable for PackageTemplate {
712731
/// Content embeds transactions elements to generate transaction. See PackageTemplate.
713732
#[derive(PartialEq, Clone)]
714733
pub struct OnchainRequest {
715-
// At every block tick, used to check if pending claiming tx is taking too
716-
// much time for confirmation and we need to bump it.
717-
pub(crate) height_timer: Option<u32>,
718734
// Tracked in case of reorg to wipe out now-superflous request.
719735
pub(crate) height_original: u32,
720736
// Content of request.
@@ -730,7 +746,6 @@ impl OnchainRequest {
730746

731747
impl Writeable for OnchainRequest {
732748
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
733-
self.height_timer.write(writer)?;
734749
self.height_original.write(writer)?;
735750
self.content.write(writer)?;
736751

@@ -740,12 +755,10 @@ impl Writeable for OnchainRequest {
740755

741756
impl Readable for OnchainRequest {
742757
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
743-
let height_timer = Readable::read(reader)?;
744758
let height_original = Readable::read(reader)?;
745759
let content = Readable::read(reader)?;
746760

747761
Ok(OnchainRequest {
748-
height_timer,
749762
height_original,
750763
content
751764
})

lightning/src/chain/onchaintx.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
408408
// height timer expiration (i.e in how many blocks we're going to take action).
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) {
411-
req.height_timer = new_timer;
411+
req.content.load_timer(new_timer);
412412
req.content.load_feerate(new_feerate);
413413
let txid = tx.txid();
414414
for k in req.content.outpoints() {
@@ -522,7 +522,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
522522

523523
// Check if any pending claim request must be rescheduled
524524
for (first_claim_txid, ref request) in self.pending_claim_requests.iter() {
525-
if let Some(h) = request.height_timer {
525+
if let Some(h) = request.content.get_timer() {
526526
if h >= height {
527527
bump_candidates.insert(*first_claim_txid, (*request).clone());
528528
}
@@ -536,7 +536,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
536536
log_trace!(logger, "Broadcast onchain {}", log_tx!(bump_tx));
537537
broadcaster.broadcast_transaction(&bump_tx);
538538
if let Some(request) = self.pending_claim_requests.get_mut(first_claim_txid) {
539-
request.height_timer = new_timer;
539+
request.content.load_timer(new_timer);
540540
request.content.load_feerate(new_feerate);
541541
}
542542
}
@@ -598,7 +598,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
598598
}
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) {
601-
request.height_timer = new_timer;
601+
request.content.load_timer(new_timer);
602602
request.content.load_feerate(new_feerate);
603603
broadcaster.broadcast_transaction(&bump_tx);
604604
}

0 commit comments

Comments
 (0)