Skip to content

Commit b5087f9

Browse files
authored
Merge branch 'main' into no-std-no-send
2 parents ca3e141 + afb80e5 commit b5087f9

File tree

14 files changed

+939
-356
lines changed

14 files changed

+939
-356
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3933,6 +3933,7 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
39333933
#[rustfmt::skip]
39343934
fn generate_claimable_outpoints_and_watch_outputs(
39353935
&mut self, generate_monitor_event_with_reason: Option<ClosureReason>,
3936+
require_funding_seen: bool,
39363937
) -> (Vec<PackageTemplate>, Vec<TransactionOutputs>) {
39373938
let funding = get_confirmed_funding_scope!(self);
39383939
let holder_commitment_tx = &funding.current_holder_commitment_tx;
@@ -3960,6 +3961,13 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
39603961
// in the claim that is queued to OnchainTxHandler. We set holder_tx_signed here to reject
39613962
// new channel updates.
39623963
self.holder_tx_signed = true;
3964+
3965+
// In manual-broadcast mode, if we have not yet observed the funding transaction on-chain,
3966+
// return empty vectors rather than triggering a broadcast.
3967+
if require_funding_seen && self.is_manual_broadcast && !self.funding_seen_onchain {
3968+
return (Vec::new(), Vec::new());
3969+
}
3970+
39633971
let mut watch_outputs = Vec::new();
39643972
// In CSV anchor channels, we can't broadcast our HTLC transactions while the commitment transaction is
39653973
// unconfirmed.
@@ -3985,13 +3993,7 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
39853993
}
39863994
claimable_outpoints.append(&mut new_outpoints);
39873995
}
3988-
// In manual-broadcast mode, if we have not yet observed the funding transaction on-chain,
3989-
// return empty vectors.
3990-
if self.is_manual_broadcast && !self.funding_seen_onchain {
3991-
return (Vec::new(), Vec::new());
3992-
} else {
3993-
(claimable_outpoints, watch_outputs)
3994-
}
3996+
(claimable_outpoints, watch_outputs)
39953997
}
39963998

39973999
#[rustfmt::skip]
@@ -4004,7 +4006,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
40044006
///
40054007
/// [`ChannelMonitor::broadcast_latest_holder_commitment_txn`]: crate::chain::channelmonitor::ChannelMonitor::broadcast_latest_holder_commitment_txn
40064008
pub(crate) fn queue_latest_holder_commitment_txn_for_broadcast<B: Deref, F: Deref, L: Deref>(
4007-
&mut self, broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &WithChannelMonitor<L>, require_funding_seen: bool,
4009+
&mut self, broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &WithChannelMonitor<L>,
4010+
require_funding_seen: bool,
40084011
)
40094012
where
40104013
B::Target: BroadcasterInterface,
@@ -4015,7 +4018,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
40154018
broadcasted_latest_txn: Some(true),
40164019
message: "ChannelMonitor-initiated commitment transaction broadcast".to_owned(),
40174020
};
4018-
let (claimable_outpoints, _) = self.generate_claimable_outpoints_and_watch_outputs(Some(reason));
4021+
let (claimable_outpoints, _) =
4022+
self.generate_claimable_outpoints_and_watch_outputs(Some(reason), require_funding_seen);
40194023
// In manual-broadcast mode, if `require_funding_seen` is true and we have not yet observed
40204024
// the funding transaction on-chain, do not queue any transactions.
40214025
if require_funding_seen && self.is_manual_broadcast && !self.funding_seen_onchain {
@@ -5618,7 +5622,7 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
56185622

56195623
if should_broadcast_commitment {
56205624
let (mut claimables, mut outputs) =
5621-
self.generate_claimable_outpoints_and_watch_outputs(None);
5625+
self.generate_claimable_outpoints_and_watch_outputs(None, false);
56225626
claimable_outpoints.append(&mut claimables);
56235627
watch_outputs.append(&mut outputs);
56245628
}
@@ -5660,9 +5664,13 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
56605664
if let Some(payment_hash) = should_broadcast {
56615665
let reason = ClosureReason::HTLCsTimedOut { payment_hash: Some(payment_hash) };
56625666
let (mut new_outpoints, mut new_outputs) =
5663-
self.generate_claimable_outpoints_and_watch_outputs(Some(reason));
5664-
claimable_outpoints.append(&mut new_outpoints);
5665-
watch_outputs.append(&mut new_outputs);
5667+
self.generate_claimable_outpoints_and_watch_outputs(Some(reason), false);
5668+
if !self.is_manual_broadcast || self.funding_seen_onchain {
5669+
claimable_outpoints.append(&mut new_outpoints);
5670+
watch_outputs.append(&mut new_outputs);
5671+
} else {
5672+
log_info!(logger, "Not broadcasting holder commitment for manual-broadcast channel before funding appears on-chain");
5673+
}
56665674
}
56675675
}
56685676

@@ -5969,7 +5977,7 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
59695977
/// Filters a block's `txdata` for transactions spending watched outputs or for any child
59705978
/// transactions thereof.
59715979
#[rustfmt::skip]
5972-
fn filter_block<'a>(&mut self, txdata: &TransactionData<'a>) -> Vec<&'a Transaction> {
5980+
fn filter_block<'a>(&self, txdata: &TransactionData<'a>) -> Vec<&'a Transaction> {
59735981
let mut matched_txn = new_hash_set();
59745982
txdata.iter().filter(|&&(_, tx)| {
59755983
let mut matches = self.spends_watched_output(tx);

lightning/src/chain/mod.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
use bitcoin::block::{Block, Header};
1313
use bitcoin::constants::genesis_block;
1414
use bitcoin::hash_types::{BlockHash, Txid};
15+
use bitcoin::hashes::sha256::Hash as Sha256;
16+
use bitcoin::hashes::{Hash, HashEngine};
1517
use bitcoin::network::Network;
1618
use bitcoin::script::{Script, ScriptBuf};
1719
use bitcoin::secp256k1::PublicKey;
@@ -21,6 +23,7 @@ use crate::chain::transaction::{OutPoint, TransactionData};
2123
use crate::impl_writeable_tlv_based;
2224
use crate::ln::types::ChannelId;
2325
use crate::sign::ecdsa::EcdsaChannelSigner;
26+
use crate::sign::HTLCDescriptor;
2427

2528
#[allow(unused_imports)]
2629
use crate::prelude::*;
@@ -442,3 +445,20 @@ where
442445
/// This is not exported to bindings users as we just use [u8; 32] directly.
443446
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
444447
pub struct ClaimId(pub [u8; 32]);
448+
449+
impl ClaimId {
450+
pub(crate) fn from_htlcs(htlcs: &[HTLCDescriptor]) -> ClaimId {
451+
let mut engine = Sha256::engine();
452+
for htlc in htlcs {
453+
engine.input(&htlc.commitment_txid.to_byte_array());
454+
engine.input(&htlc.htlc.transaction_output_index.unwrap().to_be_bytes());
455+
}
456+
ClaimId(Sha256::from_engine(engine).to_byte_array())
457+
}
458+
pub(crate) fn step_with_bytes(&self, bytes: &[u8]) -> ClaimId {
459+
let mut engine = Sha256::engine();
460+
engine.input(&self.0);
461+
engine.input(bytes);
462+
ClaimId(Sha256::from_engine(engine).to_byte_array())
463+
}
464+
}

lightning/src/chain/onchaintx.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
1515
use bitcoin::amount::Amount;
1616
use bitcoin::hash_types::{BlockHash, Txid};
17-
use bitcoin::hashes::sha256::Hash as Sha256;
18-
use bitcoin::hashes::{Hash, HashEngine};
17+
use bitcoin::hashes::Hash;
1918
use bitcoin::locktime::absolute::LockTime;
2019
use bitcoin::script::{Script, ScriptBuf};
2120
use bitcoin::secp256k1;
@@ -882,12 +881,7 @@ impl<ChannelSigner: EcdsaChannelSigner> OnchainTxHandler<ChannelSigner> {
882881
// claim, which will always be unique per request. Once a claim ID
883882
// is generated, it is assigned and remains unchanged, even if the
884883
// underlying set of HTLCs changes.
885-
let mut engine = Sha256::engine();
886-
for htlc in htlcs {
887-
engine.input(&htlc.commitment_txid.to_byte_array());
888-
engine.input(&htlc.htlc.transaction_output_index.unwrap().to_be_bytes());
889-
}
890-
ClaimId(Sha256::from_engine(engine).to_byte_array())
884+
ClaimId::from_htlcs(htlcs)
891885
},
892886
};
893887
debug_assert!(self.pending_claim_requests.get(&claim_id).is_none());

0 commit comments

Comments
 (0)