Skip to content

Commit 3dec982

Browse files
committed
Handle fallible commitment point when getting accept_channel
Similar to `open_channel`, if a signer cannot provide a commitment point immediately, we set a flag to remember we're waiting for a point to send `accept_channel`. We make sure to get the first two points before moving on, so when we advance our commitment we always have a point available.
1 parent ceddf3c commit 3dec982

File tree

2 files changed

+98
-38
lines changed

2 files changed

+98
-38
lines changed

lightning/src/ln/channel.rs

Lines changed: 63 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8552,6 +8552,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
85528552
pub(super) struct InboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
85538553
pub context: ChannelContext<SP>,
85548554
pub unfunded_context: UnfundedChannelContext,
8555+
pub signer_pending_accept_channel: bool,
85558556
}
85568557

85578558
/// Fetches the [`ChannelTypeFeatures`] that will be used for a channel built from a given
@@ -8641,15 +8642,17 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
86418642
unfunded_channel_age_ticks: 0,
86428643
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
86438644
};
8644-
let chan = Self { context, unfunded_context };
8645+
let chan = Self { context, unfunded_context, signer_pending_accept_channel: false };
86458646
Ok(chan)
86468647
}
86478648

86488649
/// Marks an inbound channel as accepted and generates a [`msgs::AcceptChannel`] message which
86498650
/// should be sent back to the counterparty node.
86508651
///
86518652
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8652-
pub fn accept_inbound_channel(&self) -> msgs::AcceptChannel {
8653+
pub fn accept_inbound_channel<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8654+
where L::Target: Logger
8655+
{
86538656
if self.context.is_outbound() {
86548657
panic!("Tried to send accept_channel for an outbound channel?");
86558658
}
@@ -8663,21 +8666,33 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
86638666
panic!("Tried to send an accept_channel for a channel that has already advanced");
86648667
}
86658668

8666-
self.generate_accept_channel_message()
8669+
self.generate_accept_channel_message(logger)
86678670
}
86688671

86698672
/// This function is used to explicitly generate a [`msgs::AcceptChannel`] message for an
86708673
/// inbound channel. If the intention is to accept an inbound channel, use
86718674
/// [`InboundV1Channel::accept_inbound_channel`] instead.
86728675
///
86738676
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8674-
fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
8675-
debug_assert!(self.unfunded_context.holder_commitment_point.map(|point| point.is_available()).unwrap_or(false));
8676-
let first_per_commitment_point = self.unfunded_context.holder_commitment_point
8677-
.expect("TODO: Handle holder_commitment_point not being set").current_point();
8677+
fn generate_accept_channel_message<L: Deref>(&mut self, _logger: &L) -> Option<msgs::AcceptChannel>
8678+
where L::Target: Logger
8679+
{
8680+
let first_per_commitment_point = if let Some(holder_commitment_point) = self.unfunded_context.holder_commitment_point {
8681+
self.signer_pending_accept_channel = false;
8682+
holder_commitment_point.current_point()
8683+
} else {
8684+
#[cfg(not(async_signing))] {
8685+
panic!("Failed getting commitment point for accept_channel message");
8686+
}
8687+
#[cfg(async_signing)] {
8688+
log_trace!(_logger, "Unable to generate accept_channel message, waiting for commitment point");
8689+
self.signer_pending_accept_channel = true;
8690+
return None;
8691+
}
8692+
};
86788693
let keys = self.context.get_holder_pubkeys();
86798694

8680-
msgs::AcceptChannel {
8695+
Some(msgs::AcceptChannel {
86818696
common_fields: msgs::CommonAcceptChannelFields {
86828697
temporary_channel_id: self.context.channel_id,
86838698
dust_limit_satoshis: self.context.holder_dust_limit_satoshis,
@@ -8701,16 +8716,18 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
87018716
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
87028717
#[cfg(taproot)]
87038718
next_local_nonce: None,
8704-
}
8719+
})
87058720
}
87068721

87078722
/// Enables the possibility for tests to extract a [`msgs::AcceptChannel`] message for an
87088723
/// inbound channel without accepting it.
87098724
///
87108725
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
87118726
#[cfg(test)]
8712-
pub fn get_accept_channel_message(&self) -> msgs::AcceptChannel {
8713-
self.generate_accept_channel_message()
8727+
pub fn get_accept_channel_message<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8728+
where L::Target: Logger
8729+
{
8730+
self.generate_accept_channel_message(logger)
87148731
}
87158732

87168733
pub fn funding_created<L: Deref>(
@@ -8769,6 +8786,29 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
87698786

87708787
Ok((channel, funding_signed, channel_monitor))
87718788
}
8789+
8790+
/// Indicates that the signer may have some signatures for us, so we should retry if we're
8791+
/// blocked.
8792+
#[allow(unused)]
8793+
pub fn signer_maybe_unblocked<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8794+
where L::Target: Logger
8795+
{
8796+
if self.unfunded_context.holder_commitment_point.is_none() {
8797+
self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
8798+
}
8799+
if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
8800+
if !point.is_available() {
8801+
point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
8802+
}
8803+
}
8804+
match self.unfunded_context.holder_commitment_point {
8805+
Some(ref mut point) if point.is_available() && self.signer_pending_accept_channel => {
8806+
log_trace!(logger, "Attempting to generate accept_channel...");
8807+
self.generate_accept_channel_message(logger)
8808+
}
8809+
_ => None
8810+
}
8811+
}
87728812
}
87738813

87748814
// A not-yet-funded outbound (from holder) channel using V2 channel establishment.
@@ -10388,10 +10428,10 @@ mod tests {
1038810428
// Make sure A's dust limit is as we expect.
1038910429
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1039010430
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10391-
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
10431+
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
1039210432

1039310433
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10394-
let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10434+
let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1039510435
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
1039610436
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1039710437
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10520,10 +10560,10 @@ mod tests {
1052010560
// Create Node B's channel by receiving Node A's open_channel message
1052110561
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
1052210562
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10523-
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
10563+
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
1052410564

1052510565
// Node B --> Node A: accept channel
10526-
let accept_channel_msg = node_b_chan.accept_inbound_channel();
10566+
let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1052710567
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1052810568

1052910569
// Node A --> Node B: funding created
@@ -10707,10 +10747,10 @@ mod tests {
1070710747
// Make sure A's dust limit is as we expect.
1070810748
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1070910749
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10710-
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
10750+
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
1071110751

1071210752
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10713-
let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10753+
let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1071410754
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
1071510755
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1071610756
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10780,11 +10820,11 @@ mod tests {
1078010820
let mut outbound_chan = OutboundV1Channel::<&TestKeysInterface>::new(
1078110821
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &features, 10000000, 100000, 42, &config, 0, 42, None, &logger
1078210822
).unwrap();
10783-
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10823+
let mut inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
1078410824
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
1078510825
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
1078610826
).unwrap();
10787-
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10827+
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(&&logger).unwrap(), &config.channel_handshake_limits, &features).unwrap();
1078810828
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
1078910829
value: Amount::from_sat(10000000), script_pubkey: outbound_chan.context.get_funding_redeemscript(),
1079010830
}]};
@@ -11836,13 +11876,13 @@ mod tests {
1183611876

1183711877
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1183811878

11839-
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11879+
let mut channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1184011880
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
1184111881
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
1184211882
&open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false
1184311883
).unwrap();
1184411884

11845-
let mut accept_channel_msg = channel_b.get_accept_channel_message();
11885+
let mut accept_channel_msg = channel_b.get_accept_channel_message(&&logger).unwrap();
1184611886
accept_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
1184711887

1184811888
let res = channel_a.accept_channel(
@@ -11887,7 +11927,7 @@ mod tests {
1188711927

1188811928
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1188911929
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11890-
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11930+
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
1189111931
&feeest,
1189211932
&&keys_provider,
1189311933
&&keys_provider,
@@ -11902,7 +11942,7 @@ mod tests {
1190211942
true, // Allow node b to send a 0conf channel_ready.
1190311943
).unwrap();
1190411944

11905-
let accept_channel_msg = node_b_chan.accept_inbound_channel();
11945+
let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1190611946
node_a_chan.accept_channel(
1190711947
&accept_channel_msg,
1190811948
&config.channel_handshake_limits,

lightning/src/ln/channelmanager.rs

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7690,11 +7690,14 @@ where
76907690
&self.channel_type_features(), &peer_state.latest_features, &open_channel_msg,
76917691
user_channel_id, &self.default_configuration, best_block_height, &self.logger, accept_0conf
76927692
).map_err(|err| MsgHandleErrInternal::from_chan_no_close(err, *temporary_channel_id)
7693-
).map(|channel| {
7694-
let message_send_event = events::MessageSendEvent::SendAcceptChannel {
7695-
node_id: *counterparty_node_id,
7696-
msg: channel.accept_inbound_channel(),
7697-
};
7693+
).map(|mut channel| {
7694+
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
7695+
let message_send_event = channel.accept_inbound_channel(&&logger).map(|msg| {
7696+
events::MessageSendEvent::SendAcceptChannel {
7697+
node_id: *counterparty_node_id,
7698+
msg,
7699+
}
7700+
});
76987701
(*temporary_channel_id, ChannelPhase::UnfundedInboundV1(channel), message_send_event)
76997702
})
77007703
},
@@ -7715,7 +7718,7 @@ where
77157718
node_id: channel.context.get_counterparty_node_id(),
77167719
msg: channel.accept_inbound_dual_funded_channel()
77177720
};
7718-
(channel.context.channel_id(), ChannelPhase::UnfundedInboundV2(channel), message_send_event)
7721+
(channel.context.channel_id(), ChannelPhase::UnfundedInboundV2(channel), Some(message_send_event))
77197722
})
77207723
},
77217724
}
@@ -7783,7 +7786,9 @@ where
77837786
let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
77847787
channel_phase.context_mut().set_outbound_scid_alias(outbound_scid_alias);
77857788

7786-
peer_state.pending_msg_events.push(message_send_event);
7789+
if let Some(message_send_event) = message_send_event {
7790+
peer_state.pending_msg_events.push(message_send_event);
7791+
}
77877792
peer_state.channel_by_id.insert(channel_id, channel_phase);
77887793

77897794
Ok(())
@@ -7959,15 +7964,18 @@ where
79597964

79607965
let (mut channel_phase, message_send_event) = match msg {
79617966
OpenChannelMessageRef::V1(msg) => {
7962-
let channel = InboundV1Channel::new(
7967+
let mut channel = InboundV1Channel::new(
79637968
&self.fee_estimator, &self.entropy_source, &self.signer_provider, *counterparty_node_id,
79647969
&self.channel_type_features(), &peer_state.latest_features, msg, user_channel_id,
79657970
&self.default_configuration, best_block_height, &self.logger, /*is_0conf=*/false
79667971
).map_err(|e| MsgHandleErrInternal::from_chan_no_close(e, msg.common_fields.temporary_channel_id))?;
7967-
let message_send_event = events::MessageSendEvent::SendAcceptChannel {
7968-
node_id: *counterparty_node_id,
7969-
msg: channel.accept_inbound_channel(),
7970-
};
7972+
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
7973+
let message_send_event = channel.accept_inbound_channel(&&logger).map(|msg| {
7974+
events::MessageSendEvent::SendAcceptChannel {
7975+
node_id: *counterparty_node_id,
7976+
msg,
7977+
}
7978+
});
79717979
(ChannelPhase::UnfundedInboundV1(channel), message_send_event)
79727980
},
79737981
OpenChannelMessageRef::V2(msg) => {
@@ -7980,14 +7988,16 @@ where
79807988
node_id: *counterparty_node_id,
79817989
msg: channel.accept_inbound_dual_funded_channel(),
79827990
};
7983-
(ChannelPhase::UnfundedInboundV2(channel), message_send_event)
7991+
(ChannelPhase::UnfundedInboundV2(channel), Some(message_send_event))
79847992
},
79857993
};
79867994

79877995
let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
79887996
channel_phase.context_mut().set_outbound_scid_alias(outbound_scid_alias);
79897997

7990-
peer_state.pending_msg_events.push(message_send_event);
7998+
if let Some(message_send_event) = message_send_event {
7999+
peer_state.pending_msg_events.push(message_send_event);
8000+
}
79918001
peer_state.channel_by_id.insert(channel_phase.context().channel_id(), channel_phase);
79928002

79938003
Ok(())
@@ -9521,7 +9531,17 @@ where
95219531
}
95229532
None
95239533
}
9524-
ChannelPhase::UnfundedInboundV1(_) | ChannelPhase::UnfundedInboundV2(_) | ChannelPhase::UnfundedOutboundV2(_) => None,
9534+
ChannelPhase::UnfundedInboundV1(chan) => {
9535+
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9536+
if let Some(msg) = chan.signer_maybe_unblocked(&&logger) {
9537+
pending_msg_events.push(events::MessageSendEvent::SendAcceptChannel {
9538+
node_id,
9539+
msg,
9540+
});
9541+
}
9542+
None
9543+
},
9544+
ChannelPhase::UnfundedInboundV2(_) | ChannelPhase::UnfundedOutboundV2(_) => None,
95259545
}
95269546
};
95279547

0 commit comments

Comments
 (0)