Skip to content

Commit 2136d5a

Browse files
committed
WIP: Send commitment_signed batch
1 parent 8b4e46a commit 2136d5a

File tree

4 files changed

+54
-26
lines changed

4 files changed

+54
-26
lines changed

lightning/src/ln/channel.rs

+45-20
Original file line numberDiff line numberDiff line change
@@ -6889,7 +6889,7 @@ impl<SP: Deref> FundedChannel<SP> where
68896889
log_trace!(logger, "Regenerating latest commitment update in channel {} with{} {} update_adds, {} update_fulfills, {} update_fails, and {} update_fail_malformeds",
68906890
&self.context.channel_id(), if update_fee.is_some() { " update_fee," } else { "" },
68916891
update_add_htlcs.len(), update_fulfill_htlcs.len(), update_fail_htlcs.len(), update_fail_malformed_htlcs.len());
6892-
let commitment_signed = if let Ok(update) = self.send_commitment_no_state_update(logger).map(|(cu, _)| cu) {
6892+
let commitment_signed = if let Ok(update) = self.send_commitment_no_state_update(logger) {
68936893
if self.context.signer_pending_commitment_update {
68946894
log_trace!(logger, "Commitment update generated: clearing signer_pending_commitment_update");
68956895
self.context.signer_pending_commitment_update = false;
@@ -8619,7 +8619,7 @@ impl<SP: Deref> FundedChannel<SP> where
86198619
self.context.resend_order = RAACommitmentOrder::RevokeAndACKFirst;
86208620

86218621
let (mut htlcs_ref, counterparty_commitment_tx) =
8622-
self.build_commitment_no_state_update(logger);
8622+
self.build_commitment_no_state_update(&self.funding, logger);
86238623
let counterparty_commitment_txid = counterparty_commitment_tx.trust().txid();
86248624
let htlcs: Vec<(HTLCOutputInCommitment, Option<Box<HTLCSource>>)> =
86258625
htlcs_ref.drain(..).map(|(htlc, htlc_source)| (htlc, htlc_source.map(|source_ref| Box::new(source_ref.clone())))).collect();
@@ -8647,19 +8647,21 @@ impl<SP: Deref> FundedChannel<SP> where
86478647
monitor_update
86488648
}
86498649

8650-
fn build_commitment_no_state_update<L: Deref>(&self, logger: &L)
8651-
-> (Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>, CommitmentTransaction)
8652-
where L::Target: Logger
8650+
fn build_commitment_no_state_update<L: Deref>(
8651+
&self, funding: &FundingScope, logger: &L,
8652+
) -> (Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>, CommitmentTransaction)
8653+
where
8654+
L::Target: Logger,
86538655
{
8654-
let counterparty_keys = self.context.build_remote_transaction_keys(&self.funding);
8655-
let commitment_stats = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, true, logger);
8656+
let counterparty_keys = self.context.build_remote_transaction_keys(funding);
8657+
let commitment_stats = self.context.build_commitment_transaction(funding, self.context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, true, logger);
86568658
let counterparty_commitment_tx = commitment_stats.tx;
86578659

86588660
#[cfg(any(test, fuzzing))]
86598661
{
8660-
if !self.funding.is_outbound() {
8661-
let projected_commit_tx_info = self.funding.next_remote_commitment_tx_fee_info_cached.lock().unwrap().take();
8662-
*self.funding.next_local_commitment_tx_fee_info_cached.lock().unwrap() = None;
8662+
if !funding.is_outbound() {
8663+
let projected_commit_tx_info = funding.next_remote_commitment_tx_fee_info_cached.lock().unwrap().take();
8664+
*funding.next_local_commitment_tx_fee_info_cached.lock().unwrap() = None;
86638665
if let Some(info) = projected_commit_tx_info {
86648666
let total_pending_htlcs = self.context.pending_inbound_htlcs.len() + self.context.pending_outbound_htlcs.len();
86658667
if info.total_pending_htlcs == total_pending_htlcs
@@ -8678,13 +8680,30 @@ impl<SP: Deref> FundedChannel<SP> where
86788680

86798681
/// Only fails in case of signer rejection. Used for channel_reestablish commitment_signed
86808682
/// generation when we shouldn't change HTLC/channel state.
8681-
fn send_commitment_no_state_update<L: Deref>(&self, logger: &L) -> Result<(msgs::CommitmentSigned, (Txid, Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>)), ChannelError> where L::Target: Logger {
8683+
fn send_commitment_no_state_update<L: Deref>(
8684+
&self, logger: &L,
8685+
) -> Result<Vec<msgs::CommitmentSigned>, ChannelError>
8686+
where
8687+
L::Target: Logger,
8688+
{
8689+
core::iter::once(&self.funding)
8690+
.chain(self.pending_funding.iter())
8691+
.map(|funding| self.send_commitment_no_state_update_for_funding(funding, logger))
8692+
.collect::<Result<Vec<_>, ChannelError>>()
8693+
}
8694+
8695+
fn send_commitment_no_state_update_for_funding<L: Deref>(
8696+
&self, funding: &FundingScope, logger: &L,
8697+
) -> Result<msgs::CommitmentSigned, ChannelError>
8698+
where
8699+
L::Target: Logger,
8700+
{
86828701
// Get the fee tests from `build_commitment_no_state_update`
86838702
#[cfg(any(test, fuzzing))]
8684-
self.build_commitment_no_state_update(logger);
8703+
self.build_commitment_no_state_update(funding, logger);
86858704

8686-
let counterparty_keys = self.context.build_remote_transaction_keys(&self.funding);
8687-
let commitment_stats = self.context.build_commitment_transaction(&self.funding, self.context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, true, logger);
8705+
let counterparty_keys = self.context.build_remote_transaction_keys(funding);
8706+
let commitment_stats = self.context.build_commitment_transaction(funding, self.context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, true, logger);
86888707
let counterparty_commitment_txid = commitment_stats.tx.trust().txid();
86898708

86908709
match &self.context.holder_signer {
@@ -8698,7 +8717,7 @@ impl<SP: Deref> FundedChannel<SP> where
86988717
}
86998718

87008719
let res = ecdsa.sign_counterparty_commitment(
8701-
&self.funding.channel_transaction_parameters,
8720+
&funding.channel_transaction_parameters,
87028721
&commitment_stats.tx,
87038722
commitment_stats.inbound_htlc_preimages,
87048723
commitment_stats.outbound_htlc_preimages,
@@ -8709,26 +8728,32 @@ impl<SP: Deref> FundedChannel<SP> where
87098728

87108729
log_trace!(logger, "Signed remote commitment tx {} (txid {}) with redeemscript {} -> {} in channel {}",
87118730
encode::serialize_hex(&commitment_stats.tx.trust().built_transaction().transaction),
8712-
&counterparty_commitment_txid, encode::serialize_hex(&self.funding.get_funding_redeemscript()),
8731+
&counterparty_commitment_txid, encode::serialize_hex(&funding.get_funding_redeemscript()),
87138732
log_bytes!(signature.serialize_compact()[..]), &self.context.channel_id());
87148733

87158734
for (ref htlc_sig, ref htlc) in htlc_signatures.iter().zip(htlcs) {
87168735
log_trace!(logger, "Signed remote HTLC tx {} with redeemscript {} with pubkey {} -> {} in channel {}",
8717-
encode::serialize_hex(&chan_utils::build_htlc_transaction(&counterparty_commitment_txid, commitment_stats.feerate_per_kw, self.funding.get_holder_selected_contest_delay(), htlc, &self.context.channel_type, &counterparty_keys.broadcaster_delayed_payment_key, &counterparty_keys.revocation_key)),
8736+
encode::serialize_hex(&chan_utils::build_htlc_transaction(&counterparty_commitment_txid, commitment_stats.feerate_per_kw, funding.get_holder_selected_contest_delay(), htlc, &self.context.channel_type, &counterparty_keys.broadcaster_delayed_payment_key, &counterparty_keys.revocation_key)),
87188737
encode::serialize_hex(&chan_utils::get_htlc_redeemscript(&htlc, &self.context.channel_type, &counterparty_keys)),
87198738
log_bytes!(counterparty_keys.broadcaster_htlc_key.to_public_key().serialize()),
87208739
log_bytes!(htlc_sig.serialize_compact()[..]), &self.context.channel_id());
87218740
}
87228741
}
87238742

8724-
Ok((msgs::CommitmentSigned {
8743+
let batch = if self.pending_funding.is_empty() { None } else {
8744+
Some(msgs::CommitmentSignedBatch {
8745+
batch_size: self.pending_funding.len() as u16 + 1,
8746+
funding_txid: funding.get_funding_txo().unwrap().txid,
8747+
})
8748+
};
8749+
Ok(msgs::CommitmentSigned {
87258750
channel_id: self.context.channel_id,
87268751
signature,
87278752
htlc_signatures,
8728-
batch: None,
8753+
batch,
87298754
#[cfg(taproot)]
87308755
partial_signature_with_nonce: None,
8731-
}, (counterparty_commitment_txid, commitment_stats.htlcs_included)))
8756+
})
87328757
},
87338758
// TODO (taproot|arik)
87348759
#[cfg(taproot)]

lightning/src/ln/channelmanager.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8516,7 +8516,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
85168516
peer_state.pending_msg_events.push(MessageSendEvent::UpdateHTLCs {
85178517
node_id: counterparty_node_id,
85188518
updates: CommitmentUpdate {
8519-
commitment_signed,
8519+
commitment_signed: vec![commitment_signed],
85208520
update_add_htlcs: vec![],
85218521
update_fulfill_htlcs: vec![],
85228522
update_fail_htlcs: vec![],

lightning/src/ln/msgs.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1512,8 +1512,8 @@ pub struct CommitmentUpdate {
15121512
pub update_fail_malformed_htlcs: Vec<UpdateFailMalformedHTLC>,
15131513
/// An `update_fee` message which should be sent
15141514
pub update_fee: Option<UpdateFee>,
1515-
/// A `commitment_signed` message which should be sent
1516-
pub commitment_signed: CommitmentSigned,
1515+
/// `commitment_signed` messages which should be sent
1516+
pub commitment_signed: Vec<CommitmentSigned>,
15171517
}
15181518

15191519
/// An event generated by a [`BaseMessageHandler`] which indicates a message should be sent to a

lightning/src/ln/peer_handler.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -2306,12 +2306,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
23062306
self.enqueue_message(&mut *get_peer_for_forwarding!(node_id)?, msg);
23072307
},
23082308
MessageSendEvent::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
2309-
log_debug!(WithContext::from(&self.logger, Some(*node_id), Some(commitment_signed.channel_id), None), "Handling UpdateHTLCs event in peer_handler for node {} with {} adds, {} fulfills, {} fails for channel {}",
2309+
let channel_id = commitment_signed.first().unwrap().channel_id;
2310+
log_debug!(WithContext::from(&self.logger, Some(*node_id), Some(channel_id), None), "Handling UpdateHTLCs event in peer_handler for node {} with {} adds, {} fulfills, {} fails for channel {}",
23102311
log_pubkey!(node_id),
23112312
update_add_htlcs.len(),
23122313
update_fulfill_htlcs.len(),
23132314
update_fail_htlcs.len(),
2314-
&commitment_signed.channel_id);
2315+
channel_id);
23152316
let mut peer = get_peer_for_forwarding!(node_id)?;
23162317
for msg in update_add_htlcs {
23172318
self.enqueue_message(&mut *peer, msg);
@@ -2328,7 +2329,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
23282329
if let &Some(ref msg) = update_fee {
23292330
self.enqueue_message(&mut *peer, msg);
23302331
}
2331-
self.enqueue_message(&mut *peer, commitment_signed);
2332+
for msg in commitment_signed {
2333+
self.enqueue_message(&mut *peer, msg);
2334+
}
23322335
},
23332336
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
23342337
log_debug!(WithContext::from(&self.logger, Some(*node_id), Some(msg.channel_id), None), "Handling SendRevokeAndACK event in peer_handler for node {} for channel {}",

0 commit comments

Comments
 (0)