Skip to content

Commit d66866e

Browse files
alecchendevvalentinewallace
authored andcommitted
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. When initializing a context, we set the `signer_pending_open_channel` flag to false, and leave setting this flag for where we attempt to generate a message. When checking to send messages when a signer is unblocked, we must handle both when we haven't gotten any commitment point, as well as when we've gotten the first but not the second point.
1 parent dfe3c8c commit d66866e

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
@@ -8282,6 +8282,10 @@ impl<SP: Deref> Channel<SP> where
82828282
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
82838283
pub context: ChannelContext<SP>,
82848284
pub unfunded_context: UnfundedChannelContext,
8285+
/// We tried to send an `open_channel` message but our commitment point wasn't ready.
8286+
/// This flag tells us we need to send it when we are retried once the
8287+
/// commitment point is ready.
8288+
pub signer_pending_open_channel: bool,
82858289
}
82868290

82878291
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -8330,7 +8334,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
83308334
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
83318335
};
83328336

8333-
let chan = Self { context, unfunded_context };
8337+
// We initialize `signer_pending_open_channel` to false, and leave setting the flag
8338+
// for when we try to generate the open_channel message.
8339+
let chan = Self { context, unfunded_context, signer_pending_open_channel: false };
83348340
Ok(chan)
83358341
}
83368342

@@ -8425,14 +8431,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
84258431
/// If we receive an error message, it may only be a rejection of the channel type we tried,
84268432
/// not of our ability to open any channel at all. Thus, on error, we should first call this
84278433
/// and see if we get a new `OpenChannel` message, otherwise the channel is failed.
8428-
pub(crate) fn maybe_handle_error_without_close<F: Deref>(
8429-
&mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
8434+
pub(crate) fn maybe_handle_error_without_close<F: Deref, L: Deref>(
8435+
&mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
84308436
) -> Result<msgs::OpenChannel, ()>
84318437
where
8432-
F::Target: FeeEstimator
8438+
F::Target: FeeEstimator,
8439+
L::Target: Logger,
84338440
{
84348441
self.context.maybe_downgrade_channel_features(fee_estimator)?;
8435-
Ok(self.get_open_channel(chain_hash))
8442+
self.get_open_channel(chain_hash, logger).ok_or(())
84368443
}
84378444

84388445
/// Returns true if we can resume the channel by sending the [`msgs::OpenChannel`] again.
@@ -8441,7 +8448,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
84418448
self.unfunded_context.transaction_number() == INITIAL_COMMITMENT_NUMBER
84428449
}
84438450

8444-
pub fn get_open_channel(&self, chain_hash: ChainHash) -> msgs::OpenChannel {
8451+
pub fn get_open_channel<L: Deref>(
8452+
&mut self, chain_hash: ChainHash, _logger: &L
8453+
) -> Option<msgs::OpenChannel> where L::Target: Logger {
84458454
if !self.context.is_outbound() {
84468455
panic!("Tried to open a channel for an inbound channel?");
84478456
}
@@ -8453,13 +8462,25 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
84538462
panic!("Tried to send an open_channel for a channel that has already advanced");
84548463
}
84558464

8456-
debug_assert!(self.unfunded_context.holder_commitment_point
8457-
.map(|point| point.is_available()).unwrap_or(false));
8458-
let first_per_commitment_point = self.unfunded_context.holder_commitment_point
8459-
.expect("TODO: Handle holder_commitment_point not being set").current_point();
8465+
let first_per_commitment_point = match self.unfunded_context.holder_commitment_point {
8466+
Some(holder_commitment_point) if holder_commitment_point.is_available() => {
8467+
self.signer_pending_open_channel = false;
8468+
holder_commitment_point.current_point()
8469+
},
8470+
_ => {
8471+
#[cfg(not(async_signing))] {
8472+
panic!("Failed getting commitment point for open_channel message");
8473+
}
8474+
#[cfg(async_signing)] {
8475+
log_trace!(_logger, "Unable to generate open_channel message, waiting for commitment point");
8476+
self.signer_pending_open_channel = true;
8477+
return None;
8478+
}
8479+
}
8480+
};
84608481
let keys = self.context.get_holder_pubkeys();
84618482

8462-
msgs::OpenChannel {
8483+
Some(msgs::OpenChannel {
84638484
common_fields: msgs::CommonOpenChannelFields {
84648485
chain_hash,
84658486
temporary_channel_id: self.context.channel_id,
@@ -8485,7 +8506,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
84858506
},
84868507
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
84878508
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
8488-
}
8509+
})
84898510
}
84908511

84918512
// Message handlers
@@ -8542,11 +8563,29 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
85428563
/// Indicates that the signer may have some signatures for us, so we should retry if we're
85438564
/// blocked.
85448565
#[cfg(async_signing)]
8545-
pub fn signer_maybe_unblocked<L: Deref>(&mut self, logger: &L) -> Option<msgs::FundingCreated> where L::Target: Logger {
8546-
if self.context.signer_pending_funding && self.context.is_outbound() {
8547-
log_trace!(logger, "Signer unblocked a funding_created");
8566+
pub fn signer_maybe_unblocked<L: Deref>(
8567+
&mut self, chain_hash: ChainHash, logger: &L
8568+
) -> (Option<msgs::OpenChannel>, Option<msgs::FundingCreated>) where L::Target: Logger {
8569+
// If we were pending a commitment point, retry the signer and advance to an
8570+
// available state.
8571+
if self.unfunded_context.holder_commitment_point.is_none() {
8572+
self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
8573+
}
8574+
if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
8575+
if !point.is_available() {
8576+
point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
8577+
}
8578+
}
8579+
let open_channel = if self.signer_pending_open_channel {
8580+
log_trace!(logger, "Attempting to generate open_channel...");
8581+
self.get_open_channel(chain_hash, logger)
8582+
} else { None };
8583+
let funding_created = if self.context.signer_pending_funding && self.context.is_outbound() {
8584+
log_trace!(logger, "Attempting to generate pending funding created...");
8585+
self.context.signer_pending_funding = false;
85488586
self.get_funding_created_msg(logger)
8549-
} else { None }
8587+
} else { None };
8588+
(open_channel, funding_created)
85508589
}
85518590
}
85528591

@@ -10359,12 +10398,12 @@ mod tests {
1035910398

1036010399
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
1036110400
let config = UserConfig::default();
10362-
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();
10401+
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();
1036310402

1036410403
// Now change the fee so we can check that the fee in the open_channel message is the
1036510404
// same as the old fee.
1036610405
fee_est.fee_est = 500;
10367-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10406+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1036810407
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
1036910408
}
1037010409

@@ -10390,7 +10429,7 @@ mod tests {
1039010429

1039110430
// Create Node B's channel by receiving Node A's open_channel message
1039210431
// Make sure A's dust limit is as we expect.
10393-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10432+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1039410433
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1039510434
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();
1039610435

@@ -10522,7 +10561,7 @@ mod tests {
1052210561
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();
1052310562

1052410563
// Create Node B's channel by receiving Node A's open_channel message
10525-
let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
10564+
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
1052610565
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1052710566
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();
1052810567

@@ -10583,7 +10622,7 @@ mod tests {
1058310622
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
1058410623
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
1058510624
// which is set to the lower bound + 1 (2%) of the `channel_value`.
10586-
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();
10625+
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();
1058710626
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
1058810627
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
1058910628

@@ -10592,7 +10631,7 @@ mod tests {
1059210631
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
1059310632
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
1059410633

10595-
let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
10634+
let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1059610635

1059710636
// Test that `InboundV1Channel::new` creates a channel with the correct value for
1059810637
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10668,12 +10707,12 @@ mod tests {
1066810707

1066910708
let mut outbound_node_config = UserConfig::default();
1067010709
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10671-
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();
10710+
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();
1067210711

1067310712
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);
1067410713
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
1067510714

10676-
let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10715+
let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1067710716
let mut inbound_node_config = UserConfig::default();
1067810717
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
1067910718

@@ -10709,7 +10748,7 @@ mod tests {
1070910748

1071010749
// Create Node B's channel by receiving Node A's open_channel message
1071110750
// Make sure A's dust limit is as we expect.
10712-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10751+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1071310752
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1071410753
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();
1071510754

@@ -10786,7 +10825,7 @@ mod tests {
1078610825
).unwrap();
1078710826
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
1078810827
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10789-
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10828+
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
1079010829
).unwrap();
1079110830
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
1079210831
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11684,13 +11723,13 @@ mod tests {
1168411723

1168511724
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
1168611725
let config = UserConfig::default();
11687-
let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11726+
let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
1168811727
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
1168911728

1169011729
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
1169111730
channel_type_features.set_zero_conf_required();
1169211731

11693-
let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11732+
let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1169411733
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
1169511734
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1169611735
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11728,13 +11767,13 @@ mod tests {
1172811767
expected_channel_type.set_static_remote_key_required();
1172911768
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
1173011769

11731-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11770+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1173211771
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1173311772
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1173411773
None, &logger
1173511774
).unwrap();
1173611775

11737-
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11776+
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1173811777
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1173911778
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
1174011779
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11766,14 +11805,14 @@ mod tests {
1176611805
let raw_init_features = static_remote_key_required | simple_anchors_required;
1176711806
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
1176811807

11769-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11808+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1177011809
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1177111810
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1177211811
None, &logger
1177311812
).unwrap();
1177411813

1177511814
// Set `channel_type` to `None` to force the implicit feature negotiation.
11776-
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11815+
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1177711816
open_channel_msg.common_fields.channel_type = None;
1177811817

1177911818
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11813,13 +11852,13 @@ mod tests {
1181311852
// First, we'll try to open a channel between A and B where A requests a channel type for
1181411853
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
1181511854
// B as it's not supported by LDK.
11816-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11855+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1181711856
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1181811857
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1181911858
None, &logger
1182011859
).unwrap();
1182111860

11822-
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11861+
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1182311862
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
1182411863

1182511864
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11838,7 +11877,7 @@ mod tests {
1183811877
10000000, 100000, 42, &config, 0, 42, None, &logger
1183911878
).unwrap();
1184011879

11841-
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11880+
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1184211881

1184311882
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1184411883
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11889,7 +11928,7 @@ mod tests {
1188911928
&logger
1189011929
).unwrap();
1189111930

11892-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11931+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1189311932
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1189411933
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
1189511934
&feeest,

0 commit comments

Comments
 (0)