Skip to content

Commit 86be2d5

Browse files
committed
Handle fallible commitment point when getting accept_channel
1 parent 470c5e4 commit 86be2d5

File tree

2 files changed

+50
-27
lines changed

2 files changed

+50
-27
lines changed

lightning/src/ln/channel.rs

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7995,6 +7995,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
79957995
pub(super) struct InboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
79967996
pub context: ChannelContext<SP>,
79977997
pub unfunded_context: UnfundedChannelContext,
7998+
pub signer_pending_accept_channel: bool,
79987999
}
79998000

80008001
/// Fetches the [`ChannelTypeFeatures`] that will be used for a channel built from a given
@@ -8084,15 +8085,17 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
80848085
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
80858086
};
80868087

8087-
let chan = Self { context, unfunded_context };
8088+
let chan = Self { context, unfunded_context, signer_pending_accept_channel: false };
80888089
Ok(chan)
80898090
}
80908091

80918092
/// Marks an inbound channel as accepted and generates a [`msgs::AcceptChannel`] message which
80928093
/// should be sent back to the counterparty node.
80938094
///
80948095
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8095-
pub fn accept_inbound_channel(&mut self) -> msgs::AcceptChannel {
8096+
pub fn accept_inbound_channel<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8097+
where L::Target: Logger
8098+
{
80968099
if self.context.is_outbound() {
80978100
panic!("Tried to send accept_channel for an outbound channel?");
80988101
}
@@ -8106,21 +8109,33 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
81068109
panic!("Tried to send an accept_channel for a channel that has already advanced");
81078110
}
81088111

8109-
self.generate_accept_channel_message()
8112+
self.generate_accept_channel_message(logger)
81108113
}
81118114

81128115
/// This function is used to explicitly generate a [`msgs::AcceptChannel`] message for an
81138116
/// inbound channel. If the intention is to accept an inbound channel, use
81148117
/// [`InboundV1Channel::accept_inbound_channel`] instead.
81158118
///
81168119
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8117-
fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
8118-
debug_assert!(self.unfunded_context.holder_commitment_point.map(|point| point.is_available()).unwrap_or(false));
8119-
let first_per_commitment_point = self.unfunded_context.holder_commitment_point
8120-
.expect("TODO: Handle holder_commitment_point not being set").current_point();
8120+
fn generate_accept_channel_message<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8121+
where L::Target: Logger
8122+
{
8123+
let first_per_commitment_point = if let Some(holder_commitment_point) = self.unfunded_context.holder_commitment_point {
8124+
self.signer_pending_accept_channel = false;
8125+
holder_commitment_point.current_point()
8126+
} else {
8127+
#[cfg(not(async_signing))] {
8128+
panic!("Failed getting commitment point for accept_channel message");
8129+
}
8130+
#[cfg(async_signing)] {
8131+
log_trace!(logger, "Unable to generate accept_channel message, waiting for commitment point");
8132+
self.signer_pending_accept_channel = true;
8133+
return None;
8134+
}
8135+
};
81218136
let keys = self.context.get_holder_pubkeys();
81228137

8123-
msgs::AcceptChannel {
8138+
Some(msgs::AcceptChannel {
81248139
common_fields: msgs::CommonAcceptChannelFields {
81258140
temporary_channel_id: self.context.channel_id,
81268141
dust_limit_satoshis: self.context.holder_dust_limit_satoshis,
@@ -8144,16 +8159,18 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
81448159
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
81458160
#[cfg(taproot)]
81468161
next_local_nonce: None,
8147-
}
8162+
})
81488163
}
81498164

81508165
/// Enables the possibility for tests to extract a [`msgs::AcceptChannel`] message for an
81518166
/// inbound channel without accepting it.
81528167
///
81538168
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
81548169
#[cfg(test)]
8155-
pub fn get_accept_channel_message(&self) -> msgs::AcceptChannel {
8156-
self.generate_accept_channel_message()
8170+
pub fn get_accept_channel_message<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8171+
where L::Target: Logger
8172+
{
8173+
self.generate_accept_channel_message(logger)
81578174
}
81588175

81598176
fn check_funding_created_signature<L: Deref>(&mut self, sig: &Signature, logger: &L) -> Result<CommitmentTransaction, ChannelError> where L::Target: Logger {
@@ -9834,7 +9851,7 @@ mod tests {
98349851
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();
98359852

98369853
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
9837-
let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
9854+
let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
98389855
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
98399856
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
98409857
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -9966,7 +9983,7 @@ mod tests {
99669983
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();
99679984

99689985
// Node B --> Node A: accept channel
9969-
let accept_channel_msg = node_b_chan.accept_inbound_channel();
9986+
let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
99709987
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
99719988

99729989
// Node A --> Node B: funding created
@@ -10153,7 +10170,7 @@ mod tests {
1015310170
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();
1015410171

1015510172
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10156-
let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10173+
let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1015710174
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
1015810175
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1015910176
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10223,11 +10240,11 @@ mod tests {
1022310240
let mut outbound_chan = OutboundV1Channel::<&TestKeysInterface>::new(
1022410241
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &features, 10000000, 100000, 42, &config, 0, 42, None, &logger
1022510242
).unwrap();
10226-
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10243+
let mut inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
1022710244
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
1022810245
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
1022910246
).unwrap();
10230-
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10247+
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(&&logger).unwrap(), &config.channel_handshake_limits, &features).unwrap();
1023110248
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
1023210249
value: Amount::from_sat(10000000), script_pubkey: outbound_chan.context.get_funding_redeemscript(),
1023310250
}]};
@@ -11279,13 +11296,13 @@ mod tests {
1127911296

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

11282-
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11299+
let mut channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1128311300
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
1128411301
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
1128511302
&open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false
1128611303
).unwrap();
1128711304

11288-
let mut accept_channel_msg = channel_b.get_accept_channel_message();
11305+
let mut accept_channel_msg = channel_b.get_accept_channel_message(&&logger).unwrap();
1128911306
accept_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
1129011307

1129111308
let res = channel_a.accept_channel(
@@ -11345,7 +11362,7 @@ mod tests {
1134511362
true, // Allow node b to send a 0conf channel_ready.
1134611363
).unwrap();
1134711364

11348-
let accept_channel_msg = node_b_chan.accept_inbound_channel();
11365+
let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap();
1134911366
node_a_chan.accept_channel(
1135011367
&accept_channel_msg,
1135111368
&config.channel_handshake_limits,

lightning/src/ln/channelmanager.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7446,10 +7446,13 @@ where
74467446
let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
74477447
channel.context.set_outbound_scid_alias(outbound_scid_alias);
74487448

7449-
peer_state.pending_msg_events.push(events::MessageSendEvent::SendAcceptChannel {
7450-
node_id: channel.context.get_counterparty_node_id(),
7451-
msg: channel.accept_inbound_channel(),
7452-
});
7449+
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
7450+
if let Some(msg) = channel.accept_inbound_channel(&&logger) {
7451+
peer_state.pending_msg_events.push(events::MessageSendEvent::SendAcceptChannel {
7452+
node_id: channel.context.get_counterparty_node_id(),
7453+
msg,
7454+
});
7455+
}
74537456

74547457
peer_state.channel_by_id.insert(temporary_channel_id.clone(), ChannelPhase::UnfundedInboundV1(channel));
74557458

@@ -7637,10 +7640,13 @@ where
76377640
let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
76387641
channel.context.set_outbound_scid_alias(outbound_scid_alias);
76397642

7640-
peer_state.pending_msg_events.push(events::MessageSendEvent::SendAcceptChannel {
7641-
node_id: counterparty_node_id.clone(),
7642-
msg: channel.accept_inbound_channel(),
7643-
});
7643+
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
7644+
if let Some(msg) = channel.accept_inbound_channel(&&logger) {
7645+
peer_state.pending_msg_events.push(events::MessageSendEvent::SendAcceptChannel {
7646+
node_id: counterparty_node_id.clone(),
7647+
msg,
7648+
});
7649+
}
76447650
peer_state.channel_by_id.insert(channel_id, ChannelPhase::UnfundedInboundV1(channel));
76457651
Ok(())
76467652
}

0 commit comments

Comments
 (0)