Skip to content

Commit 60fb2f4

Browse files
committed
f only emit FundingTransactionReadyForSigning on initial commitment_signed exchange
1 parent 89f93b9 commit 60fb2f4

File tree

3 files changed

+29
-31
lines changed

3 files changed

+29
-31
lines changed

lightning/src/events/mod.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,10 +2161,7 @@ impl Writeable for Event {
21612161
},
21622162
&Event::FundingTransactionReadyForSigning { .. } => {
21632163
49u8.write(writer)?;
2164-
// We never write out FundingTransactionReadyForSigning events as, upon disconnection, peers
2165-
// drop any V2-established/spliced channels which have not yet exchanged the initial `commitment_signed`.
2166-
// We only exhange the initial `commitment_signed` after the client calls
2167-
// `ChannelManager::funding_transaction_signed` and ALWAYS before we send a `tx_signatures`
2164+
// We never write out FundingTransactionReadyForSigning events as they will be regenerated necessary.
21682165
},
21692166
// Note that, going forward, all new events must only write data inside of
21702167
// `write_tlv_fields`. Versions 0.0.101+ will ignore odd-numbered events that write

lightning/src/ln/channel.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,7 +1766,7 @@ where
17661766

17671767
pub fn funding_tx_constructed<L: Deref>(
17681768
&mut self, signing_session: InteractiveTxSigningSession, logger: &L,
1769-
) -> Result<(msgs::CommitmentSigned, Option<Transaction>), ChannelError>
1769+
) -> Result<msgs::CommitmentSigned, ChannelError>
17701770
where
17711771
L::Target: Logger,
17721772
{
@@ -1786,7 +1786,7 @@ where
17861786
#[rustfmt::skip]
17871787
pub fn commitment_signed<L: Deref>(
17881788
&mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, logger: &L
1789-
) -> Result<(Option<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>>, Option<ChannelMonitorUpdate>), ChannelError>
1789+
) -> Result<(Option<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>>, Option<ChannelMonitorUpdate>, Option<Transaction>), ChannelError>
17901790
where
17911791
L::Target: Logger
17921792
{
@@ -1813,7 +1813,7 @@ where
18131813
pending_splice: None,
18141814
};
18151815
let res = funded_channel.commitment_signed_initial_v2(msg, best_block, signer_provider, logger)
1816-
.map(|monitor| (Some(monitor), None))
1816+
.map(|(monitor, funding_tx_opt)| (Some(monitor), None, funding_tx_opt))
18171817
// TODO: Change to `inspect_err` when MSRV is high enough.
18181818
.map_err(|err| {
18191819
// We always expect a `ChannelError` close.
@@ -1840,15 +1840,15 @@ where
18401840
let res = if has_negotiated_pending_splice && !session_received_commitment_signed {
18411841
funded_channel
18421842
.splice_initial_commitment_signed(msg, logger)
1843-
.map(|monitor_update_opt| (None, monitor_update_opt))
1843+
.map(|monitor_update_opt| (None, monitor_update_opt, None))
18441844
} else {
18451845
funded_channel.commitment_signed(msg, logger)
1846-
.map(|monitor_update_opt| (None, monitor_update_opt))
1846+
.map(|monitor_update_opt| (None, monitor_update_opt, None))
18471847
};
18481848

18491849
#[cfg(not(splicing))]
18501850
let res = funded_channel.commitment_signed(msg, logger)
1851-
.map(|monitor_update_opt| (None, monitor_update_opt));
1851+
.map(|monitor_update_opt| (None, monitor_update_opt, None));
18521852

18531853
self.phase = ChannelPhase::Funded(funded_channel);
18541854
res
@@ -2916,7 +2916,7 @@ where
29162916
#[rustfmt::skip]
29172917
pub fn funding_tx_constructed<L: Deref>(
29182918
&mut self, mut signing_session: InteractiveTxSigningSession, logger: &L
2919-
) -> Result<(msgs::CommitmentSigned, Option<Transaction>), ChannelError>
2919+
) -> Result<msgs::CommitmentSigned, ChannelError>
29202920
where
29212921
L::Target: Logger
29222922
{
@@ -2954,7 +2954,8 @@ where
29542954
},
29552955
};
29562956

2957-
let funding_tx_opt = if signing_session.local_inputs_count() == 0 {
2957+
// Check that we have the expected number of local inputs
2958+
if signing_session.local_inputs_count() == 0 {
29582959
debug_assert_eq!(our_funding_satoshis, 0);
29592960
if signing_session.provide_holder_witnesses(self.context.channel_id, Vec::new()).is_err() {
29602961
debug_assert!(
@@ -2965,10 +2966,7 @@ where
29652966
let reason = ClosureReason::ProcessingError { err: msg.to_owned() };
29662967
return Err(ChannelError::Close((msg.to_owned(), reason)));
29672968
}
2968-
None
2969-
} else {
2970-
Some(signing_session.unsigned_tx().build_unsigned_tx())
2971-
};
2969+
}
29722970

29732971
let mut channel_state = ChannelState::FundingNegotiated(FundingNegotiatedFlags::new());
29742972
channel_state.set_interactive_signing();
@@ -2978,7 +2976,7 @@ where
29782976
self.interactive_tx_constructor.take();
29792977
self.interactive_tx_signing_session = Some(signing_session);
29802978

2981-
Ok((commitment_signed, funding_tx_opt))
2979+
Ok(commitment_signed)
29822980
}
29832981
}
29842982

@@ -6628,7 +6626,7 @@ where
66286626
#[rustfmt::skip]
66296627
pub fn commitment_signed_initial_v2<L: Deref>(
66306628
&mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, logger: &L
6631-
) -> Result<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>, ChannelError>
6629+
) -> Result<(ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>, Option<Transaction>), ChannelError>
66326630
where L::Target: Logger
66336631
{
66346632
if !self.context.channel_state.is_interactive_signing()
@@ -6657,8 +6655,11 @@ where
66576655
// so they'll be sent as soon as that's done.
66586656
self.context.monitor_pending_tx_signatures = Some(tx_signatures);
66596657
}
6658+
// Only build the unsigned transaction for signing if there are any holder inputs to actually sign
6659+
let funding_tx_opt = self.interactive_tx_signing_session.as_ref().and_then(|session|
6660+
session.local_inputs_count().gt(&0).then_some(session.unsigned_tx().build_unsigned_tx()));
66606661

6661-
Ok(channel_monitor)
6662+
Ok((channel_monitor, funding_tx_opt))
66626663
}
66636664

66646665
/// Handles an incoming `commitment_signed` message for the first commitment transaction of the

lightning/src/ln/channelmanager.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9088,20 +9088,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
90889088
peer_state.pending_msg_events.push(msg_send_event);
90899089
};
90909090
if let Some(signing_session) = signing_session_opt {
9091-
let (commitment_signed, funding_tx_opt) = chan_entry
9091+
let commitment_signed = chan_entry
90929092
.get_mut()
90939093
.funding_tx_constructed(signing_session, &self.logger)
90949094
.map_err(|err| MsgHandleErrInternal::send_err_msg_no_close(format!("{}", err), msg.channel_id))?;
9095-
if let Some(unsigned_transaction) = funding_tx_opt {
9096-
let mut pending_events = self.pending_events.lock().unwrap();
9097-
pending_events.push_back((
9098-
Event::FundingTransactionReadyForSigning {
9099-
unsigned_transaction,
9100-
counterparty_node_id,
9101-
channel_id: msg.channel_id,
9102-
user_channel_id: chan_entry.get().context().get_user_id(),
9103-
}, None));
9104-
}
91059095
peer_state.pending_msg_events.push(MessageSendEvent::UpdateHTLCs {
91069096
node_id: counterparty_node_id,
91079097
channel_id: msg.channel_id,
@@ -9631,11 +9621,21 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
96319621
let chan = chan_entry.get_mut();
96329622
let logger = WithChannelContext::from(&self.logger, &chan.context(), None);
96339623
let funding_txo = chan.funding().get_funding_txo();
9634-
let (monitor_opt, monitor_update_opt) = try_channel_entry!(
9624+
let (monitor_opt, monitor_update_opt, funding_tx_opt) = try_channel_entry!(
96359625
self, peer_state, chan.commitment_signed(msg, best_block, &self.signer_provider, &&logger),
96369626
chan_entry);
96379627

96389628
if let Some(chan) = chan.as_funded_mut() {
9629+
if let Some(unsigned_transaction) = funding_tx_opt {
9630+
let mut pending_events = self.pending_events.lock().unwrap();
9631+
pending_events.push_back((
9632+
Event::FundingTransactionReadyForSigning {
9633+
unsigned_transaction,
9634+
counterparty_node_id: *counterparty_node_id,
9635+
channel_id: msg.channel_id,
9636+
user_channel_id: chan.context.get_user_id(),
9637+
}, None));
9638+
}
96399639
if let Some(monitor) = monitor_opt {
96409640
let monitor_res = self.chain_monitor.watch_channel(monitor.channel_id(), monitor);
96419641
if let Ok(persist_state) = monitor_res {

0 commit comments

Comments
 (0)