Skip to content

Commit 8058a60

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 08251ca commit 8058a60

File tree

2 files changed

+98
-38
lines changed

2 files changed

+98
-38
lines changed

lightning/src/ln/channel.rs

+63-23
Original file line numberDiff line numberDiff line change
@@ -8586,6 +8586,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
85868586
pub(super) struct InboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
85878587
pub context: ChannelContext<SP>,
85888588
pub unfunded_context: UnfundedChannelContext,
8589+
pub signer_pending_accept_channel: bool,
85898590
}
85908591

85918592
/// Fetches the [`ChannelTypeFeatures`] that will be used for a channel built from a given
@@ -8675,15 +8676,17 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
86758676
unfunded_channel_age_ticks: 0,
86768677
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
86778678
};
8678-
let chan = Self { context, unfunded_context };
8679+
let chan = Self { context, unfunded_context, signer_pending_accept_channel: false };
86798680
Ok(chan)
86808681
}
86818682

86828683
/// Marks an inbound channel as accepted and generates a [`msgs::AcceptChannel`] message which
86838684
/// should be sent back to the counterparty node.
86848685
///
86858686
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8686-
pub fn accept_inbound_channel(&self) -> msgs::AcceptChannel {
8687+
pub fn accept_inbound_channel<L: Deref>(
8688+
&mut self, logger: &L
8689+
) -> Option<msgs::AcceptChannel> where L::Target: Logger {
86878690
if self.context.is_outbound() {
86888691
panic!("Tried to send accept_channel for an outbound channel?");
86898692
}
@@ -8697,21 +8700,36 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
86978700
panic!("Tried to send an accept_channel for a channel that has already advanced");
86988701
}
86998702

8700-
self.generate_accept_channel_message()
8703+
self.generate_accept_channel_message(logger)
87018704
}
87028705

87038706
/// This function is used to explicitly generate a [`msgs::AcceptChannel`] message for an
87048707
/// inbound channel. If the intention is to accept an inbound channel, use
87058708
/// [`InboundV1Channel::accept_inbound_channel`] instead.
87068709
///
87078710
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8708-
fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
8709-
debug_assert!(self.unfunded_context.holder_commitment_point.map(|point| point.is_available()).unwrap_or(false));
8710-
let first_per_commitment_point = self.unfunded_context.holder_commitment_point
8711-
.expect("TODO: Handle holder_commitment_point not being set").current_point();
8711+
fn generate_accept_channel_message<L: Deref>(
8712+
&mut self, _logger: &L
8713+
) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8714+
let first_per_commitment_point = match self.unfunded_context.holder_commitment_point {
8715+
Some(holder_commitment_point) if holder_commitment_point.is_available() => {
8716+
self.signer_pending_accept_channel = false;
8717+
holder_commitment_point.current_point()
8718+
},
8719+
_ => {
8720+
#[cfg(not(async_signing))] {
8721+
panic!("Failed getting commitment point for accept_channel message");
8722+
}
8723+
#[cfg(async_signing)] {
8724+
log_trace!(_logger, "Unable to generate accept_channel message, waiting for commitment point");
8725+
self.signer_pending_accept_channel = true;
8726+
return None;
8727+
}
8728+
}
8729+
};
87128730
let keys = self.context.get_holder_pubkeys();
87138731

8714-
msgs::AcceptChannel {
8732+
Some(msgs::AcceptChannel {
87158733
common_fields: msgs::CommonAcceptChannelFields {
87168734
temporary_channel_id: self.context.channel_id,
87178735
dust_limit_satoshis: self.context.holder_dust_limit_satoshis,
@@ -8735,16 +8753,18 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
87358753
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
87368754
#[cfg(taproot)]
87378755
next_local_nonce: None,
8738-
}
8756+
})
87398757
}
87408758

87418759
/// Enables the possibility for tests to extract a [`msgs::AcceptChannel`] message for an
87428760
/// inbound channel without accepting it.
87438761
///
87448762
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
87458763
#[cfg(test)]
8746-
pub fn get_accept_channel_message(&self) -> msgs::AcceptChannel {
8747-
self.generate_accept_channel_message()
8764+
pub fn get_accept_channel_message<L: Deref>(
8765+
&mut self, logger: &L
8766+
) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8767+
self.generate_accept_channel_message(logger)
87488768
}
87498769

87508770
pub fn funding_created<L: Deref>(
@@ -8803,6 +8823,26 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
88038823

88048824
Ok((channel, funding_signed, channel_monitor))
88058825
}
8826+
8827+
/// Indicates that the signer may have some signatures for us, so we should retry if we're
8828+
/// blocked.
8829+
#[allow(unused)]
8830+
pub fn signer_maybe_unblocked<L: Deref>(
8831+
&mut self, logger: &L
8832+
) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8833+
if self.unfunded_context.holder_commitment_point.is_none() {
8834+
self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
8835+
}
8836+
if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
8837+
if !point.is_available() {
8838+
point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
8839+
}
8840+
}
8841+
if self.signer_pending_accept_channel {
8842+
log_trace!(logger, "Attempting to generate accept_channel...");
8843+
self.generate_accept_channel_message(logger)
8844+
} else { None }
8845+
}
88068846
}
88078847

88088848
// A not-yet-funded outbound (from holder) channel using V2 channel establishment.
@@ -10424,10 +10464,10 @@ mod tests {
1042410464
// Make sure A's dust limit is as we expect.
1042510465
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1042610466
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10427-
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();
10467+
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();
1042810468

1042910469
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10430-
let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10470+
let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1043110471
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
1043210472
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1043310473
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10556,10 +10596,10 @@ mod tests {
1055610596
// Create Node B's channel by receiving Node A's open_channel message
1055710597
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
1055810598
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10559-
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();
10599+
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();
1056010600

1056110601
// Node B --> Node A: accept channel
10562-
let accept_channel_msg = node_b_chan.accept_inbound_channel();
10602+
let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1056310603
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1056410604

1056510605
// Node A --> Node B: funding created
@@ -10743,10 +10783,10 @@ mod tests {
1074310783
// Make sure A's dust limit is as we expect.
1074410784
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1074510785
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10746-
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();
10786+
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();
1074710787

1074810788
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10749-
let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10789+
let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1075010790
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
1075110791
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1075210792
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10816,11 +10856,11 @@ mod tests {
1081610856
let mut outbound_chan = OutboundV1Channel::<&TestKeysInterface>::new(
1081710857
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &features, 10000000, 100000, 42, &config, 0, 42, None, &logger
1081810858
).unwrap();
10819-
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10859+
let mut inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
1082010860
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
1082110861
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
1082210862
).unwrap();
10823-
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10863+
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(&&logger).unwrap(), &config.channel_handshake_limits, &features).unwrap();
1082410864
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
1082510865
value: Amount::from_sat(10000000), script_pubkey: outbound_chan.context.get_funding_redeemscript(),
1082610866
}]};
@@ -11872,13 +11912,13 @@ mod tests {
1187211912

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

11875-
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11915+
let mut channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1187611916
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
1187711917
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
1187811918
&open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false
1187911919
).unwrap();
1188011920

11881-
let mut accept_channel_msg = channel_b.get_accept_channel_message();
11921+
let mut accept_channel_msg = channel_b.get_accept_channel_message(&&logger).unwrap();
1188211922
accept_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
1188311923

1188411924
let res = channel_a.accept_channel(
@@ -11923,7 +11963,7 @@ mod tests {
1192311963

1192411964
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1192511965
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11926-
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11966+
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
1192711967
&feeest,
1192811968
&&keys_provider,
1192911969
&&keys_provider,
@@ -11938,7 +11978,7 @@ mod tests {
1193811978
true, // Allow node b to send a 0conf channel_ready.
1193911979
).unwrap();
1194011980

11941-
let accept_channel_msg = node_b_chan.accept_inbound_channel();
11981+
let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1194211982
node_a_chan.accept_channel(
1194311983
&accept_channel_msg,
1194411984
&config.channel_handshake_limits,

lightning/src/ln/channelmanager.rs

+35-15
Original file line numberDiff line numberDiff line change
@@ -7736,11 +7736,14 @@ where
77367736
&self.channel_type_features(), &peer_state.latest_features, &open_channel_msg,
77377737
user_channel_id, &self.default_configuration, best_block_height, &self.logger, accept_0conf
77387738
).map_err(|err| MsgHandleErrInternal::from_chan_no_close(err, *temporary_channel_id)
7739-
).map(|channel| {
7740-
let message_send_event = events::MessageSendEvent::SendAcceptChannel {
7741-
node_id: *counterparty_node_id,
7742-
msg: channel.accept_inbound_channel(),
7743-
};
7739+
).map(|mut channel| {
7740+
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
7741+
let message_send_event = channel.accept_inbound_channel(&&logger).map(|msg| {
7742+
events::MessageSendEvent::SendAcceptChannel {
7743+
node_id: *counterparty_node_id,
7744+
msg,
7745+
}
7746+
});
77447747
(*temporary_channel_id, ChannelPhase::UnfundedInboundV1(channel), message_send_event)
77457748
})
77467749
},
@@ -7761,7 +7764,7 @@ where
77617764
node_id: channel.context.get_counterparty_node_id(),
77627765
msg: channel.accept_inbound_dual_funded_channel()
77637766
};
7764-
(channel.context.channel_id(), ChannelPhase::UnfundedInboundV2(channel), message_send_event)
7767+
(channel.context.channel_id(), ChannelPhase::UnfundedInboundV2(channel), Some(message_send_event))
77657768
})
77667769
},
77677770
}
@@ -7829,7 +7832,9 @@ where
78297832
let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
78307833
channel_phase.context_mut().set_outbound_scid_alias(outbound_scid_alias);
78317834

7832-
peer_state.pending_msg_events.push(message_send_event);
7835+
if let Some(message_send_event) = message_send_event {
7836+
peer_state.pending_msg_events.push(message_send_event);
7837+
}
78337838
peer_state.channel_by_id.insert(channel_id, channel_phase);
78347839

78357840
Ok(())
@@ -8005,15 +8010,18 @@ where
80058010

80068011
let (mut channel_phase, message_send_event) = match msg {
80078012
OpenChannelMessageRef::V1(msg) => {
8008-
let channel = InboundV1Channel::new(
8013+
let mut channel = InboundV1Channel::new(
80098014
&self.fee_estimator, &self.entropy_source, &self.signer_provider, *counterparty_node_id,
80108015
&self.channel_type_features(), &peer_state.latest_features, msg, user_channel_id,
80118016
&self.default_configuration, best_block_height, &self.logger, /*is_0conf=*/false
80128017
).map_err(|e| MsgHandleErrInternal::from_chan_no_close(e, msg.common_fields.temporary_channel_id))?;
8013-
let message_send_event = events::MessageSendEvent::SendAcceptChannel {
8014-
node_id: *counterparty_node_id,
8015-
msg: channel.accept_inbound_channel(),
8016-
};
8018+
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
8019+
let message_send_event = channel.accept_inbound_channel(&&logger).map(|msg| {
8020+
events::MessageSendEvent::SendAcceptChannel {
8021+
node_id: *counterparty_node_id,
8022+
msg,
8023+
}
8024+
});
80178025
(ChannelPhase::UnfundedInboundV1(channel), message_send_event)
80188026
},
80198027
OpenChannelMessageRef::V2(msg) => {
@@ -8026,14 +8034,16 @@ where
80268034
node_id: *counterparty_node_id,
80278035
msg: channel.accept_inbound_dual_funded_channel(),
80288036
};
8029-
(ChannelPhase::UnfundedInboundV2(channel), message_send_event)
8037+
(ChannelPhase::UnfundedInboundV2(channel), Some(message_send_event))
80308038
},
80318039
};
80328040

80338041
let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
80348042
channel_phase.context_mut().set_outbound_scid_alias(outbound_scid_alias);
80358043

8036-
peer_state.pending_msg_events.push(message_send_event);
8044+
if let Some(message_send_event) = message_send_event {
8045+
peer_state.pending_msg_events.push(message_send_event);
8046+
}
80378047
peer_state.channel_by_id.insert(channel_phase.context().channel_id(), channel_phase);
80388048

80398049
Ok(())
@@ -9579,7 +9589,17 @@ where
95799589
}
95809590
None
95819591
}
9582-
ChannelPhase::UnfundedInboundV1(_) | ChannelPhase::UnfundedInboundV2(_) | ChannelPhase::UnfundedOutboundV2(_) => None,
9592+
ChannelPhase::UnfundedInboundV1(chan) => {
9593+
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9594+
if let Some(msg) = chan.signer_maybe_unblocked(&&logger) {
9595+
pending_msg_events.push(events::MessageSendEvent::SendAcceptChannel {
9596+
node_id,
9597+
msg,
9598+
});
9599+
}
9600+
None
9601+
},
9602+
ChannelPhase::UnfundedInboundV2(_) | ChannelPhase::UnfundedOutboundV2(_) => None,
95839603
}
95849604
};
95859605

0 commit comments

Comments
 (0)