@@ -8282,6 +8282,10 @@ impl<SP: Deref> Channel<SP> where
8282
8282
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
8283
8283
pub context: ChannelContext<SP>,
8284
8284
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,
8285
8289
}
8286
8290
8287
8291
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -8330,7 +8334,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8330
8334
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
8331
8335
};
8332
8336
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 };
8334
8340
Ok(chan)
8335
8341
}
8336
8342
@@ -8425,14 +8431,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8425
8431
/// If we receive an error message, it may only be a rejection of the channel type we tried,
8426
8432
/// not of our ability to open any channel at all. Thus, on error, we should first call this
8427
8433
/// 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
8430
8436
) -> Result<msgs::OpenChannel, ()>
8431
8437
where
8432
- F::Target: FeeEstimator
8438
+ F::Target: FeeEstimator,
8439
+ L::Target: Logger,
8433
8440
{
8434
8441
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(( ))
8436
8443
}
8437
8444
8438
8445
/// 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 {
8441
8448
self.unfunded_context.transaction_number() == INITIAL_COMMITMENT_NUMBER
8442
8449
}
8443
8450
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 {
8445
8454
if !self.context.is_outbound() {
8446
8455
panic!("Tried to open a channel for an inbound channel?");
8447
8456
}
@@ -8453,13 +8462,25 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8453
8462
panic!("Tried to send an open_channel for a channel that has already advanced");
8454
8463
}
8455
8464
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
+ };
8460
8481
let keys = self.context.get_holder_pubkeys();
8461
8482
8462
- msgs::OpenChannel {
8483
+ Some( msgs::OpenChannel {
8463
8484
common_fields: msgs::CommonOpenChannelFields {
8464
8485
chain_hash,
8465
8486
temporary_channel_id: self.context.channel_id,
@@ -8485,7 +8506,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8485
8506
},
8486
8507
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
8487
8508
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
8488
- }
8509
+ })
8489
8510
}
8490
8511
8491
8512
// Message handlers
@@ -8542,11 +8563,29 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8542
8563
/// Indicates that the signer may have some signatures for us, so we should retry if we're
8543
8564
/// blocked.
8544
8565
#[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;
8548
8586
self.get_funding_created_msg(logger)
8549
- } else { None }
8587
+ } else { None };
8588
+ (open_channel, funding_created)
8550
8589
}
8551
8590
}
8552
8591
@@ -10359,12 +10398,12 @@ mod tests {
10359
10398
10360
10399
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
10361
10400
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();
10363
10402
10364
10403
// Now change the fee so we can check that the fee in the open_channel message is the
10365
10404
// same as the old fee.
10366
10405
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( );
10368
10407
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
10369
10408
}
10370
10409
@@ -10390,7 +10429,7 @@ mod tests {
10390
10429
10391
10430
// Create Node B's channel by receiving Node A's open_channel message
10392
10431
// 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( );
10394
10433
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10395
10434
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();
10396
10435
@@ -10522,7 +10561,7 @@ mod tests {
10522
10561
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();
10523
10562
10524
10563
// 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( );
10526
10565
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10527
10566
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();
10528
10567
@@ -10583,7 +10622,7 @@ mod tests {
10583
10622
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
10584
10623
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
10585
10624
// 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();
10587
10626
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
10588
10627
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
10589
10628
@@ -10592,7 +10631,7 @@ mod tests {
10592
10631
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
10593
10632
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
10594
10633
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( );
10596
10635
10597
10636
// Test that `InboundV1Channel::new` creates a channel with the correct value for
10598
10637
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10668,12 +10707,12 @@ mod tests {
10668
10707
10669
10708
let mut outbound_node_config = UserConfig::default();
10670
10709
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();
10672
10711
10673
10712
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);
10674
10713
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
10675
10714
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( );
10677
10716
let mut inbound_node_config = UserConfig::default();
10678
10717
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10679
10718
@@ -10709,7 +10748,7 @@ mod tests {
10709
10748
10710
10749
// Create Node B's channel by receiving Node A's open_channel message
10711
10750
// 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( );
10713
10752
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10714
10753
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();
10715
10754
@@ -10786,7 +10825,7 @@ mod tests {
10786
10825
).unwrap();
10787
10826
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10788
10827
&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
10790
10829
).unwrap();
10791
10830
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10792
10831
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11684,13 +11723,13 @@ mod tests {
11684
11723
11685
11724
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
11686
11725
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,
11688
11727
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
11689
11728
11690
11729
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
11691
11730
channel_type_features.set_zero_conf_required();
11692
11731
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( );
11694
11733
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
11695
11734
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11696
11735
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11728,13 +11767,13 @@ mod tests {
11728
11767
expected_channel_type.set_static_remote_key_required();
11729
11768
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
11730
11769
11731
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11770
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11732
11771
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11733
11772
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11734
11773
None, &logger
11735
11774
).unwrap();
11736
11775
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( );
11738
11777
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11739
11778
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11740
11779
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11766,14 +11805,14 @@ mod tests {
11766
11805
let raw_init_features = static_remote_key_required | simple_anchors_required;
11767
11806
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
11768
11807
11769
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11808
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11770
11809
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11771
11810
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11772
11811
None, &logger
11773
11812
).unwrap();
11774
11813
11775
11814
// 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( );
11777
11816
open_channel_msg.common_fields.channel_type = None;
11778
11817
11779
11818
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11813,13 +11852,13 @@ mod tests {
11813
11852
// First, we'll try to open a channel between A and B where A requests a channel type for
11814
11853
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
11815
11854
// B as it's not supported by LDK.
11816
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11855
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11817
11856
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11818
11857
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11819
11858
None, &logger
11820
11859
).unwrap();
11821
11860
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( );
11823
11862
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11824
11863
11825
11864
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11838,7 +11877,7 @@ mod tests {
11838
11877
10000000, 100000, 42, &config, 0, 42, None, &logger
11839
11878
).unwrap();
11840
11879
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( );
11842
11881
11843
11882
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11844
11883
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11889,7 +11928,7 @@ mod tests {
11889
11928
&logger
11890
11929
).unwrap();
11891
11930
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( );
11893
11932
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11894
11933
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11895
11934
&feeest,
0 commit comments