Skip to content

Commit 879c6ab

Browse files
committed
Handle fallible commitment point for open_channel message
In the event that a signer cannot provide a commitment point immediately, we set a flag to remember we're waiting for this before we can send `open_channel`. We make sure to get the first two commitment points, so when we advance commitments, we always have a commitment point available.
1 parent 35c1139 commit 879c6ab

File tree

2 files changed

+101
-48
lines changed

2 files changed

+101
-48
lines changed

lightning/src/ln/channel.rs

Lines changed: 75 additions & 36 deletions
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
@@ -7949,11 +7967,32 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
79497967
/// Indicates that the signer may have some signatures for us, so we should retry if we're
79507968
/// blocked.
79517969
#[cfg(async_signing)]
7952-
pub fn signer_maybe_unblocked<L: Deref>(&mut self, logger: &L) -> Option<msgs::FundingCreated> where L::Target: Logger {
7953-
if self.context.signer_pending_funding && self.context.is_outbound() {
7954-
log_trace!(logger, "Signer unblocked a funding_created");
7970+
pub fn signer_maybe_unblocked<L: Deref>(&mut self, chain_hash: ChainHash, logger: &L) -> (Option<msgs::OpenChannel>, Option<msgs::FundingCreated>)
7971+
where L::Target: Logger
7972+
{
7973+
// If we were pending a commitment point, retry the signer and advance to an
7974+
// available state.
7975+
if self.unfunded_context.holder_commitment_point.is_none() {
7976+
self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
7977+
}
7978+
if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
7979+
if !point.is_available() {
7980+
point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
7981+
}
7982+
}
7983+
let open_channel = match self.unfunded_context.holder_commitment_point {
7984+
Some(ref mut point) if point.is_available() && self.signer_pending_open_channel => {
7985+
log_trace!(logger, "Attempting to generate open_channel...");
7986+
self.get_open_channel(chain_hash, logger)
7987+
}
7988+
_ => None
7989+
};
7990+
let funding_created = if self.context.signer_pending_funding && self.context.is_outbound() {
7991+
log_trace!(logger, "Attempting to generate pending funding created...");
7992+
self.context.signer_pending_funding = false;
79557993
self.get_funding_created_msg(logger)
7956-
} else { None }
7994+
} else { None };
7995+
(open_channel, funding_created)
79577996
}
79587997
}
79597998

@@ -9764,12 +9803,12 @@ mod tests {
97649803

97659804
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
97669805
let config = UserConfig::default();
9767-
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();
9806+
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();
97689807

97699808
// Now change the fee so we can check that the fee in the open_channel message is the
97709809
// same as the old fee.
97719810
fee_est.fee_est = 500;
9772-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9811+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
97739812
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
97749813
}
97759814

@@ -9795,7 +9834,7 @@ mod tests {
97959834

97969835
// Create Node B's channel by receiving Node A's open_channel message
97979836
// Make sure A's dust limit is as we expect.
9798-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9837+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
97999838
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
98009839
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();
98019840

@@ -9927,7 +9966,7 @@ mod tests {
99279966
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();
99289967

99299968
// Create Node B's channel by receiving Node A's open_channel message
9930-
let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
9969+
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
99319970
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
99329971
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();
99339972

@@ -9988,7 +10027,7 @@ mod tests {
998810027
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
998910028
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
999010029
// which is set to the lower bound + 1 (2%) of the `channel_value`.
9991-
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();
10030+
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();
999210031
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
999310032
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
999410033

@@ -9997,7 +10036,7 @@ mod tests {
999710036
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
999810037
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
999910038

10000-
let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
10039+
let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1000110040

1000210041
// Test that `InboundV1Channel::new` creates a channel with the correct value for
1000310042
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10073,12 +10112,12 @@ mod tests {
1007310112

1007410113
let mut outbound_node_config = UserConfig::default();
1007510114
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10076-
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();
10115+
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();
1007710116

1007810117
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);
1007910118
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
1008010119

10081-
let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10120+
let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1008210121
let mut inbound_node_config = UserConfig::default();
1008310122
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
1008410123

@@ -10114,7 +10153,7 @@ mod tests {
1011410153

1011510154
// Create Node B's channel by receiving Node A's open_channel message
1011610155
// Make sure A's dust limit is as we expect.
10117-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10156+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1011810157
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1011910158
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();
1012010159

@@ -10191,7 +10230,7 @@ mod tests {
1019110230
).unwrap();
1019210231
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
1019310232
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10194-
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10233+
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
1019510234
).unwrap();
1019610235
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
1019710236
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11089,13 +11128,13 @@ mod tests {
1108911128

1109011129
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
1109111130
let config = UserConfig::default();
11092-
let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11131+
let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
1109311132
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
1109411133

1109511134
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
1109611135
channel_type_features.set_zero_conf_required();
1109711136

11098-
let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11137+
let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1109911138
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
1110011139
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1110111140
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11133,13 +11172,13 @@ mod tests {
1113311172
expected_channel_type.set_static_remote_key_required();
1113411173
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
1113511174

11136-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11175+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1113711176
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1113811177
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1113911178
None, &logger
1114011179
).unwrap();
1114111180

11142-
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11181+
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1114311182
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1114411183
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
1114511184
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11171,14 +11210,14 @@ mod tests {
1117111210
let raw_init_features = static_remote_key_required | simple_anchors_required;
1117211211
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
1117311212

11174-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11213+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1117511214
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1117611215
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1117711216
None, &logger
1117811217
).unwrap();
1117911218

1118011219
// Set `channel_type` to `None` to force the implicit feature negotiation.
11181-
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11220+
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1118211221
open_channel_msg.common_fields.channel_type = None;
1118311222

1118411223
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11218,13 +11257,13 @@ mod tests {
1121811257
// First, we'll try to open a channel between A and B where A requests a channel type for
1121911258
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
1122011259
// B as it's not supported by LDK.
11221-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11260+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1122211261
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1122311262
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1122411263
None, &logger
1122511264
).unwrap();
1122611265

11227-
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11266+
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1122811267
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
1122911268

1123011269
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11243,7 +11282,7 @@ mod tests {
1124311282
10000000, 100000, 42, &config, 0, 42, None, &logger
1124411283
).unwrap();
1124511284

11246-
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11285+
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1124711286

1124811287
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1124911288
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11294,7 +11333,7 @@ mod tests {
1129411333
&logger
1129511334
).unwrap();
1129611335

11297-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11336+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1129811337
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1129911338
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
1130011339
&feeest,

0 commit comments

Comments
 (0)