Skip to content

Commit c6d76c9

Browse files
committed
Handle fallible commitment point when getting open_channel message
1 parent bcd5a07 commit c6d76c9

File tree

2 files changed

+68
-43
lines changed

2 files changed

+68
-43
lines changed

lightning/src/ln/channel.rs

+50-32
Original file line numberDiff line numberDiff line change
@@ -7615,6 +7615,12 @@ impl<SP: Deref> Channel<SP> where
76157615
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
76167616
pub context: ChannelContext<SP>,
76177617
pub unfunded_context: UnfundedChannelContext,
7618+
/// We tried to send a `open_channel` message but our commitment point wasn't ready.
7619+
/// This flag tells us we need to send it when we are retried once the
7620+
/// commiment point is ready.
7621+
///
7622+
/// TODO: don't need to persist this since we'll send open_channel again on connect?
7623+
pub signer_pending_open_channel: bool,
76187624
}
76197625

76207626
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -7663,7 +7669,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
76637669
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
76647670
};
76657671

7666-
let chan = Self { context, unfunded_context };
7672+
let chan = Self { context, unfunded_context, signer_pending_open_channel: false };
76677673
Ok(chan)
76687674
}
76697675

@@ -7761,14 +7767,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
77617767
/// If we receive an error message, it may only be a rejection of the channel type we tried,
77627768
/// not of our ability to open any channel at all. Thus, on error, we should first call this
77637769
/// and see if we get a new `OpenChannel` message, otherwise the channel is failed.
7764-
pub(crate) fn maybe_handle_error_without_close<F: Deref>(
7765-
&mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
7770+
pub(crate) fn maybe_handle_error_without_close<F: Deref, L: Deref>(
7771+
&mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
77667772
) -> Result<msgs::OpenChannel, ()>
77677773
where
7768-
F::Target: FeeEstimator
7774+
F::Target: FeeEstimator,
7775+
L::Target: Logger,
77697776
{
77707777
self.context.maybe_downgrade_channel_features(fee_estimator)?;
7771-
Ok(self.get_open_channel(chain_hash))
7778+
self.get_open_channel(chain_hash, logger).ok_or(())
77727779
}
77737780

77747781
/// Returns true if we can resume the channel by sending the [`msgs::OpenChannel`] again.
@@ -7777,7 +7784,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
77777784
self.unfunded_context.transaction_number() == INITIAL_COMMITMENT_NUMBER
77787785
}
77797786

7780-
pub fn get_open_channel(&self, chain_hash: ChainHash) -> msgs::OpenChannel {
7787+
pub fn get_open_channel<L: Deref>(&mut self, chain_hash: ChainHash, logger: &L) -> Option<msgs::OpenChannel>
7788+
where L::Target: Logger
7789+
{
77817790
if !self.context.is_outbound() {
77827791
panic!("Tried to open a channel for an inbound channel?");
77837792
}
@@ -7789,13 +7798,22 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
77897798
panic!("Tried to send an open_channel for a channel that has already advanced");
77907799
}
77917800

7792-
debug_assert!(self.unfunded_context.holder_commitment_point
7793-
.map(|point| point.is_available()).unwrap_or(false));
7794-
let first_per_commitment_point = self.unfunded_context.holder_commitment_point
7795-
.expect("TODO: Handle holder_commitment_point not being set").current_point();
7801+
let first_per_commitment_point = if let Some(holder_commitment_point) = self.unfunded_context.holder_commitment_point {
7802+
self.signer_pending_open_channel = false;
7803+
holder_commitment_point.current_point()
7804+
} else {
7805+
#[cfg(not(async_signing))] {
7806+
panic!("Failed getting commitment point for open_channel message");
7807+
}
7808+
#[cfg(async_signing)] {
7809+
log_trace!(logger, "Unable to generate open_channel message, waiting for commitment point");
7810+
self.signer_pending_open_channel = true;
7811+
return None;
7812+
}
7813+
};
77967814
let keys = self.context.get_holder_pubkeys();
77977815

7798-
msgs::OpenChannel {
7816+
Some(msgs::OpenChannel {
77997817
common_fields: msgs::CommonOpenChannelFields {
78007818
chain_hash,
78017819
temporary_channel_id: self.context.channel_id,
@@ -7821,7 +7839,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
78217839
},
78227840
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
78237841
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
7824-
}
7842+
})
78257843
}
78267844

78277845
// Message handlers
@@ -9760,12 +9778,12 @@ mod tests {
97609778

97619779
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
97629780
let config = UserConfig::default();
9763-
let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&bounded_fee_estimator, &&keys_provider, &&keys_provider, node_a_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
9781+
let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&bounded_fee_estimator, &&keys_provider, &&keys_provider, node_a_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
97649782

97659783
// Now change the fee so we can check that the fee in the open_channel message is the
97669784
// same as the old fee.
97679785
fee_est.fee_est = 500;
9768-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9786+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
97699787
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
97709788
}
97719789

@@ -9791,7 +9809,7 @@ mod tests {
97919809

97929810
// Create Node B's channel by receiving Node A's open_channel message
97939811
// Make sure A's dust limit is as we expect.
9794-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9812+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
97959813
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
97969814
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();
97979815

@@ -9923,7 +9941,7 @@ mod tests {
99239941
let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
99249942

99259943
// Create Node B's channel by receiving Node A's open_channel message
9926-
let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
9944+
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
99279945
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
99289946
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();
99299947

@@ -9984,7 +10002,7 @@ mod tests {
998410002
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
998510003
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
998610004
// which is set to the lower bound + 1 (2%) of the `channel_value`.
9987-
let chan_1 = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(&config_2_percent), 10000000, 100000, 42, &config_2_percent, 0, 42, None, &logger).unwrap();
10005+
let mut chan_1 = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(&config_2_percent), 10000000, 100000, 42, &config_2_percent, 0, 42, None, &logger).unwrap();
998810006
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
998910007
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
999010008

@@ -9993,7 +10011,7 @@ mod tests {
999310011
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
999410012
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
999510013

9996-
let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
10014+
let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
999710015

999810016
// Test that `InboundV1Channel::new` creates a channel with the correct value for
999910017
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10069,12 +10087,12 @@ mod tests {
1006910087

1007010088
let mut outbound_node_config = UserConfig::default();
1007110089
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10072-
let chan = OutboundV1Channel::<&TestKeysInterface>::new(&&fee_est, &&keys_provider, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(&outbound_node_config), channel_value_satoshis, 100_000, 42, &outbound_node_config, 0, 42, None, &logger).unwrap();
10090+
let mut chan = OutboundV1Channel::<&TestKeysInterface>::new(&&fee_est, &&keys_provider, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(&outbound_node_config), channel_value_satoshis, 100_000, 42, &outbound_node_config, 0, 42, None, &logger).unwrap();
1007310091

1007410092
let expected_outbound_selected_chan_reserve = cmp::max(MIN_THEIR_CHAN_RESERVE_SATOSHIS, (chan.context.channel_value_satoshis as f64 * outbound_selected_channel_reserve_perc) as u64);
1007510093
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
1007610094

10077-
let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10095+
let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1007810096
let mut inbound_node_config = UserConfig::default();
1007910097
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
1008010098

@@ -10110,7 +10128,7 @@ mod tests {
1011010128

1011110129
// Create Node B's channel by receiving Node A's open_channel message
1011210130
// Make sure A's dust limit is as we expect.
10113-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10131+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1011410132
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1011510133
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();
1011610134

@@ -10187,7 +10205,7 @@ mod tests {
1018710205
).unwrap();
1018810206
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
1018910207
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10190-
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10208+
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
1019110209
).unwrap();
1019210210
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
1019310211
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11085,13 +11103,13 @@ mod tests {
1108511103

1108611104
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
1108711105
let config = UserConfig::default();
11088-
let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11106+
let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
1108911107
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
1109011108

1109111109
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
1109211110
channel_type_features.set_zero_conf_required();
1109311111

11094-
let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11112+
let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1109511113
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
1109611114
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1109711115
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11129,13 +11147,13 @@ mod tests {
1112911147
expected_channel_type.set_static_remote_key_required();
1113011148
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
1113111149

11132-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11150+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1113311151
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1113411152
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1113511153
None, &logger
1113611154
).unwrap();
1113711155

11138-
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11156+
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1113911157
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1114011158
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
1114111159
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11167,14 +11185,14 @@ mod tests {
1116711185
let raw_init_features = static_remote_key_required | simple_anchors_required;
1116811186
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
1116911187

11170-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11188+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1117111189
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1117211190
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1117311191
None, &logger
1117411192
).unwrap();
1117511193

1117611194
// Set `channel_type` to `None` to force the implicit feature negotiation.
11177-
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11195+
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1117811196
open_channel_msg.common_fields.channel_type = None;
1117911197

1118011198
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11214,13 +11232,13 @@ mod tests {
1121411232
// First, we'll try to open a channel between A and B where A requests a channel type for
1121511233
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
1121611234
// B as it's not supported by LDK.
11217-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11235+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1121811236
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1121911237
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1122011238
None, &logger
1122111239
).unwrap();
1122211240

11223-
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11241+
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1122411242
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
1122511243

1122611244
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11239,7 +11257,7 @@ mod tests {
1123911257
10000000, 100000, 42, &config, 0, 42, None, &logger
1124011258
).unwrap();
1124111259

11242-
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11260+
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1124311261

1124411262
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1124511263
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11290,7 +11308,7 @@ mod tests {
1129011308
&logger
1129111309
).unwrap();
1129211310

11293-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11311+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1129411312
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1129511313
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
1129611314
&feeest,

lightning/src/ln/channelmanager.rs

+18-11
Original file line numberDiff line numberDiff line change
@@ -3258,7 +3258,7 @@ where
32583258
}
32593259
}
32603260

3261-
let channel = {
3261+
let mut channel = {
32623262
let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
32633263
let their_features = &peer_state.latest_features;
32643264
let config = if override_config.is_some() { override_config.as_ref().unwrap() } else { &self.default_configuration };
@@ -3273,7 +3273,8 @@ where
32733273
},
32743274
}
32753275
};
3276-
let res = channel.get_open_channel(self.chain_hash);
3276+
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
3277+
let res = channel.get_open_channel(self.chain_hash, &&logger);
32773278

32783279
let temporary_channel_id = channel.context.channel_id();
32793280
match peer_state.channel_by_id.entry(temporary_channel_id) {
@@ -3287,10 +3288,12 @@ where
32873288
hash_map::Entry::Vacant(entry) => { entry.insert(ChannelPhase::UnfundedOutboundV1(channel)); }
32883289
}
32893290

3290-
peer_state.pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
3291-
node_id: their_network_key,
3292-
msg: res,
3293-
});
3291+
if let Some(msg) = res {
3292+
peer_state.pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
3293+
node_id: their_network_key,
3294+
msg,
3295+
});
3296+
}
32943297
Ok(temporary_channel_id)
32953298
}
32963299

@@ -10736,10 +10739,13 @@ where
1073610739
}
1073710740

1073810741
ChannelPhase::UnfundedOutboundV1(chan) => {
10739-
pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
10740-
node_id: chan.context.get_counterparty_node_id(),
10741-
msg: chan.get_open_channel(self.chain_hash),
10742-
});
10742+
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
10743+
if let Some(msg) = chan.get_open_channel(self.chain_hash, &&logger) {
10744+
pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
10745+
node_id: chan.context.get_counterparty_node_id(),
10746+
msg,
10747+
});
10748+
}
1074310749
}
1074410750

1074510751
// TODO(dual_funding): Combine this match arm with above once #[cfg(any(dual_funding, splicing))] is removed.
@@ -10854,7 +10860,8 @@ where
1085410860
let peer_state = &mut *peer_state_lock;
1085510861
match peer_state.channel_by_id.get_mut(&msg.channel_id) {
1085610862
Some(ChannelPhase::UnfundedOutboundV1(ref mut chan)) => {
10857-
if let Ok(msg) = chan.maybe_handle_error_without_close(self.chain_hash, &self.fee_estimator) {
10863+
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
10864+
if let Ok(msg) = chan.maybe_handle_error_without_close(self.chain_hash, &self.fee_estimator, &&logger) {
1085810865
peer_state.pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
1085910866
node_id: counterparty_node_id,
1086010867
msg,

0 commit comments

Comments
 (0)