Skip to content

Commit a2a1882

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 310503c commit a2a1882

File tree

2 files changed

+101
-48
lines changed

2 files changed

+101
-48
lines changed

lightning/src/ln/channel.rs

+75-36
Original file line numberDiff line numberDiff line change
@@ -8250,6 +8250,12 @@ impl<SP: Deref> Channel<SP> where
82508250
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
82518251
pub context: ChannelContext<SP>,
82528252
pub unfunded_context: UnfundedChannelContext,
8253+
/// We tried to send a `open_channel` message but our commitment point wasn't ready.
8254+
/// This flag tells us we need to send it when we are retried once the
8255+
/// commiment point is ready.
8256+
///
8257+
/// TODO: don't need to persist this since we'll send open_channel again on connect?
8258+
pub signer_pending_open_channel: bool,
82538259
}
82548260

82558261
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -8298,7 +8304,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
82988304
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
82998305
};
83008306

8301-
let chan = Self { context, unfunded_context };
8307+
let chan = Self { context, unfunded_context, signer_pending_open_channel: false };
83028308
Ok(chan)
83038309
}
83048310

@@ -8393,14 +8399,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
83938399
/// If we receive an error message, it may only be a rejection of the channel type we tried,
83948400
/// not of our ability to open any channel at all. Thus, on error, we should first call this
83958401
/// and see if we get a new `OpenChannel` message, otherwise the channel is failed.
8396-
pub(crate) fn maybe_handle_error_without_close<F: Deref>(
8397-
&mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
8402+
pub(crate) fn maybe_handle_error_without_close<F: Deref, L: Deref>(
8403+
&mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
83988404
) -> Result<msgs::OpenChannel, ()>
83998405
where
8400-
F::Target: FeeEstimator
8406+
F::Target: FeeEstimator,
8407+
L::Target: Logger,
84018408
{
84028409
self.context.maybe_downgrade_channel_features(fee_estimator)?;
8403-
Ok(self.get_open_channel(chain_hash))
8410+
self.get_open_channel(chain_hash, logger).ok_or(())
84048411
}
84058412

84068413
/// Returns true if we can resume the channel by sending the [`msgs::OpenChannel`] again.
@@ -8409,7 +8416,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
84098416
self.unfunded_context.transaction_number() == INITIAL_COMMITMENT_NUMBER
84108417
}
84118418

8412-
pub fn get_open_channel(&self, chain_hash: ChainHash) -> msgs::OpenChannel {
8419+
pub fn get_open_channel<L: Deref>(&mut self, chain_hash: ChainHash, _logger: &L) -> Option<msgs::OpenChannel>
8420+
where L::Target: Logger
8421+
{
84138422
if !self.context.is_outbound() {
84148423
panic!("Tried to open a channel for an inbound channel?");
84158424
}
@@ -8421,13 +8430,22 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
84218430
panic!("Tried to send an open_channel for a channel that has already advanced");
84228431
}
84238432

8424-
debug_assert!(self.unfunded_context.holder_commitment_point
8425-
.map(|point| point.is_available()).unwrap_or(false));
8426-
let first_per_commitment_point = self.unfunded_context.holder_commitment_point
8427-
.expect("TODO: Handle holder_commitment_point not being set").current_point();
8433+
let first_per_commitment_point = if let Some(holder_commitment_point) = self.unfunded_context.holder_commitment_point {
8434+
self.signer_pending_open_channel = false;
8435+
holder_commitment_point.current_point()
8436+
} else {
8437+
#[cfg(not(async_signing))] {
8438+
panic!("Failed getting commitment point for open_channel message");
8439+
}
8440+
#[cfg(async_signing)] {
8441+
log_trace!(_logger, "Unable to generate open_channel message, waiting for commitment point");
8442+
self.signer_pending_open_channel = true;
8443+
return None;
8444+
}
8445+
};
84288446
let keys = self.context.get_holder_pubkeys();
84298447

8430-
msgs::OpenChannel {
8448+
Some(msgs::OpenChannel {
84318449
common_fields: msgs::CommonOpenChannelFields {
84328450
chain_hash,
84338451
temporary_channel_id: self.context.channel_id,
@@ -8453,7 +8471,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
84538471
},
84548472
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
84558473
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
8456-
}
8474+
})
84578475
}
84588476

84598477
// Message handlers
@@ -8508,11 +8526,32 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
85088526
/// Indicates that the signer may have some signatures for us, so we should retry if we're
85098527
/// blocked.
85108528
#[cfg(async_signing)]
8511-
pub fn signer_maybe_unblocked<L: Deref>(&mut self, logger: &L) -> Option<msgs::FundingCreated> where L::Target: Logger {
8512-
if self.context.signer_pending_funding && self.context.is_outbound() {
8513-
log_trace!(logger, "Signer unblocked a funding_created");
8529+
pub fn signer_maybe_unblocked<L: Deref>(&mut self, chain_hash: ChainHash, logger: &L) -> (Option<msgs::OpenChannel>, Option<msgs::FundingCreated>)
8530+
where L::Target: Logger
8531+
{
8532+
// If we were pending a commitment point, retry the signer and advance to an
8533+
// available state.
8534+
if self.unfunded_context.holder_commitment_point.is_none() {
8535+
self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
8536+
}
8537+
if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
8538+
if !point.is_available() {
8539+
point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
8540+
}
8541+
}
8542+
let open_channel = match self.unfunded_context.holder_commitment_point {
8543+
Some(ref mut point) if point.is_available() && self.signer_pending_open_channel => {
8544+
log_trace!(logger, "Attempting to generate open_channel...");
8545+
self.get_open_channel(chain_hash, logger)
8546+
}
8547+
_ => None
8548+
};
8549+
let funding_created = if self.context.signer_pending_funding && self.context.is_outbound() {
8550+
log_trace!(logger, "Attempting to generate pending funding created...");
8551+
self.context.signer_pending_funding = false;
85148552
self.get_funding_created_msg(logger)
8515-
} else { None }
8553+
} else { None };
8554+
(open_channel, funding_created)
85168555
}
85178556
}
85188557

@@ -10323,12 +10362,12 @@ mod tests {
1032310362

1032410363
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
1032510364
let config = UserConfig::default();
10326-
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();
10365+
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();
1032710366

1032810367
// Now change the fee so we can check that the fee in the open_channel message is the
1032910368
// same as the old fee.
1033010369
fee_est.fee_est = 500;
10331-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10370+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1033210371
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
1033310372
}
1033410373

@@ -10354,7 +10393,7 @@ mod tests {
1035410393

1035510394
// Create Node B's channel by receiving Node A's open_channel message
1035610395
// Make sure A's dust limit is as we expect.
10357-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10396+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1035810397
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1035910398
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();
1036010399

@@ -10486,7 +10525,7 @@ mod tests {
1048610525
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();
1048710526

1048810527
// Create Node B's channel by receiving Node A's open_channel message
10489-
let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
10528+
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
1049010529
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1049110530
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();
1049210531

@@ -10547,7 +10586,7 @@ mod tests {
1054710586
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
1054810587
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
1054910588
// which is set to the lower bound + 1 (2%) of the `channel_value`.
10550-
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();
10589+
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();
1055110590
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
1055210591
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
1055310592

@@ -10556,7 +10595,7 @@ mod tests {
1055610595
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
1055710596
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
1055810597

10559-
let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
10598+
let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1056010599

1056110600
// Test that `InboundV1Channel::new` creates a channel with the correct value for
1056210601
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10632,12 +10671,12 @@ mod tests {
1063210671

1063310672
let mut outbound_node_config = UserConfig::default();
1063410673
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10635-
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();
10674+
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();
1063610675

1063710676
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);
1063810677
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
1063910678

10640-
let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10679+
let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1064110680
let mut inbound_node_config = UserConfig::default();
1064210681
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
1064310682

@@ -10673,7 +10712,7 @@ mod tests {
1067310712

1067410713
// Create Node B's channel by receiving Node A's open_channel message
1067510714
// Make sure A's dust limit is as we expect.
10676-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10715+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1067710716
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1067810717
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();
1067910718

@@ -10750,7 +10789,7 @@ mod tests {
1075010789
).unwrap();
1075110790
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
1075210791
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10753-
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10792+
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
1075410793
).unwrap();
1075510794
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
1075610795
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11648,13 +11687,13 @@ mod tests {
1164811687

1164911688
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
1165011689
let config = UserConfig::default();
11651-
let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11690+
let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
1165211691
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
1165311692

1165411693
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
1165511694
channel_type_features.set_zero_conf_required();
1165611695

11657-
let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11696+
let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1165811697
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
1165911698
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1166011699
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11692,13 +11731,13 @@ mod tests {
1169211731
expected_channel_type.set_static_remote_key_required();
1169311732
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
1169411733

11695-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11734+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1169611735
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1169711736
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1169811737
None, &logger
1169911738
).unwrap();
1170011739

11701-
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11740+
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1170211741
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1170311742
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
1170411743
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11730,14 +11769,14 @@ mod tests {
1173011769
let raw_init_features = static_remote_key_required | simple_anchors_required;
1173111770
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
1173211771

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

1173911778
// Set `channel_type` to `None` to force the implicit feature negotiation.
11740-
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11779+
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1174111780
open_channel_msg.common_fields.channel_type = None;
1174211781

1174311782
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11777,13 +11816,13 @@ mod tests {
1177711816
// First, we'll try to open a channel between A and B where A requests a channel type for
1177811817
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
1177911818
// B as it's not supported by LDK.
11780-
let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11819+
let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
1178111820
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
1178211821
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
1178311822
None, &logger
1178411823
).unwrap();
1178511824

11786-
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11825+
let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1178711826
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
1178811827

1178911828
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11802,7 +11841,7 @@ mod tests {
1180211841
10000000, 100000, 42, &config, 0, 42, None, &logger
1180311842
).unwrap();
1180411843

11805-
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11844+
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1180611845

1180711846
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1180811847
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11853,7 +11892,7 @@ mod tests {
1185311892
&logger
1185411893
).unwrap();
1185511894

11856-
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11895+
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1185711896
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
1185811897
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
1185911898
&feeest,

0 commit comments

Comments
 (0)