From 86dde5db749ee213b6017dd33202d5d353ef44e2 Mon Sep 17 00:00:00 2001 From: Duncan Dean Date: Thu, 2 May 2024 10:05:43 +0200 Subject: [PATCH] Handle re-establishment next_funding_txid --- lightning/src/ln/channel.rs | 24 ++++++++++++++++++++---- lightning/src/ln/channelmanager.rs | 5 ++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index 2b6f43c45c2..95795051c16 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -1446,6 +1446,10 @@ pub(super) struct ChannelContext where SP::Target: SignerProvider { /// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we /// store it here and only release it to the `ChannelManager` once it asks for it. blocked_monitor_updates: Vec, + // If we've sent `commtiment_signed` for an interactive transaction construction, + // but have not received `tx_signatures` we MUST set `next_funding_txid` to the + // txid of that interactive transaction, else we MUST NOT set it. + next_funding_txid: Option, } pub(super) trait InteractivelyFunded where SP::Target: SignerProvider { @@ -1986,6 +1990,7 @@ impl ChannelContext where SP::Target: SignerProvider { local_initiated_shutdown: None, blocked_monitor_updates: Vec::new(), + next_funding_txid: None, }; Ok(channel_context) @@ -2210,6 +2215,7 @@ impl ChannelContext where SP::Target: SignerProvider { blocked_monitor_updates: Vec::new(), local_initiated_shutdown: None, + next_funding_txid: None, }) } @@ -4391,6 +4397,14 @@ impl Channel where self.context.channel_state.clear_waiting_for_batch(); } + pub fn set_next_funding_txid(&mut self, txid: &Txid) { + self.context.next_funding_txid = Some(*txid); + } + + pub fn clear_next_funding_txid(&mut self) { + self.context.next_funding_txid = None; + } + /// Unsets the existing funding information. /// /// This must only be used if the channel has not yet completed funding and has not been used. @@ -7452,10 +7466,7 @@ impl Channel where next_remote_commitment_number: INITIAL_COMMITMENT_NUMBER - self.context.cur_counterparty_commitment_transaction_number - 1, your_last_per_commitment_secret: remote_last_secret, my_current_per_commitment_point: dummy_pubkey, - // TODO(dual_funding): If we've sent `commtiment_signed` for an interactive transaction - // construction but have not received `tx_signatures` we MUST set `next_funding_txid` to the - // txid of that interactive transaction, else we MUST NOT set it. - next_funding_txid: None, + next_funding_txid: self.context.next_funding_txid, } } @@ -9384,6 +9395,7 @@ impl Writeable for Channel where SP::Target: SignerProvider { (45, cur_holder_commitment_point, option), (47, next_holder_commitment_point, option), (49, self.context.local_initiated_shutdown, option), // Added in 0.0.122 + (51, self.context.next_funding_txid, option), // Added in 0.0.124 }); Ok(()) @@ -9982,6 +9994,10 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch local_initiated_shutdown, blocked_monitor_updates: blocked_monitor_updates.unwrap(), + // If we've sent `commtiment_signed` for an interactive transaction construction, + // but have not received `tx_signatures` we MUST set `next_funding_txid` to the + // txid of that interactive transaction, else we MUST NOT set it. + next_funding_txid: None, }, dual_funding_channel_context: None, interactive_tx_constructor: None, diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 778248755df..efde359e79b 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -7762,6 +7762,7 @@ where peer_state.pending_msg_events.push(msg_send_event); } if let Some(signing_session) = signing_session_opt { + let funding_txid = signing_session.unsigned_tx.txid(); let (channel_id, channel_phase) = chan_phase_entry.remove_entry(); let res = match channel_phase { ChannelPhase::UnfundedOutboundV2(chan) => { @@ -7783,7 +7784,7 @@ where .into()))), }; match res { - Ok((channel, commitment_signed, funding_ready_for_sig_event_opt)) => { + Ok((mut channel, commitment_signed, funding_ready_for_sig_event_opt)) => { if let Some(funding_ready_for_sig_event) = funding_ready_for_sig_event_opt { let mut pending_events = self.pending_events.lock().unwrap(); pending_events.push_back((funding_ready_for_sig_event, None)); @@ -7799,6 +7800,7 @@ where update_fee: None, }, }); + channel.set_next_funding_txid(&funding_txid); peer_state.channel_by_id.insert(channel_id.clone(), ChannelPhase::Funded(channel)); }, Err((channel_phase, err)) => { @@ -7833,6 +7835,7 @@ where match channel_phase { ChannelPhase::Funded(chan) => { let (tx_signatures_opt, funding_tx_opt) = try_chan_phase_entry!(self, chan.tx_signatures(&msg), chan_phase_entry); + chan.clear_next_funding_txid(); if let Some(tx_signatures) = tx_signatures_opt { peer_state.pending_msg_events.push(events::MessageSendEvent::SendTxSignatures { node_id: *counterparty_node_id,