@@ -8250,6 +8250,12 @@ impl<SP: Deref> Channel<SP> where
8250
8250
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
8251
8251
pub context: ChannelContext<SP>,
8252
8252
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,
8253
8259
}
8254
8260
8255
8261
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -8298,7 +8304,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8298
8304
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
8299
8305
};
8300
8306
8301
- let chan = Self { context, unfunded_context };
8307
+ let chan = Self { context, unfunded_context, signer_pending_open_channel: false };
8302
8308
Ok(chan)
8303
8309
}
8304
8310
@@ -8393,14 +8399,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8393
8399
/// If we receive an error message, it may only be a rejection of the channel type we tried,
8394
8400
/// not of our ability to open any channel at all. Thus, on error, we should first call this
8395
8401
/// 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
8398
8404
) -> Result<msgs::OpenChannel, ()>
8399
8405
where
8400
- F::Target: FeeEstimator
8406
+ F::Target: FeeEstimator,
8407
+ L::Target: Logger,
8401
8408
{
8402
8409
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(( ))
8404
8411
}
8405
8412
8406
8413
/// 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 {
8409
8416
self.unfunded_context.transaction_number() == INITIAL_COMMITMENT_NUMBER
8410
8417
}
8411
8418
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
+ {
8413
8422
if !self.context.is_outbound() {
8414
8423
panic!("Tried to open a channel for an inbound channel?");
8415
8424
}
@@ -8421,13 +8430,22 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8421
8430
panic!("Tried to send an open_channel for a channel that has already advanced");
8422
8431
}
8423
8432
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
+ };
8428
8446
let keys = self.context.get_holder_pubkeys();
8429
8447
8430
- msgs::OpenChannel {
8448
+ Some( msgs::OpenChannel {
8431
8449
common_fields: msgs::CommonOpenChannelFields {
8432
8450
chain_hash,
8433
8451
temporary_channel_id: self.context.channel_id,
@@ -8453,7 +8471,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8453
8471
},
8454
8472
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
8455
8473
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
8456
- }
8474
+ })
8457
8475
}
8458
8476
8459
8477
// Message handlers
@@ -8508,11 +8526,32 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8508
8526
/// Indicates that the signer may have some signatures for us, so we should retry if we're
8509
8527
/// blocked.
8510
8528
#[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;
8514
8552
self.get_funding_created_msg(logger)
8515
- } else { None }
8553
+ } else { None };
8554
+ (open_channel, funding_created)
8516
8555
}
8517
8556
}
8518
8557
@@ -10323,12 +10362,12 @@ mod tests {
10323
10362
10324
10363
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
10325
10364
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();
10327
10366
10328
10367
// Now change the fee so we can check that the fee in the open_channel message is the
10329
10368
// same as the old fee.
10330
10369
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( );
10332
10371
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
10333
10372
}
10334
10373
@@ -10354,7 +10393,7 @@ mod tests {
10354
10393
10355
10394
// Create Node B's channel by receiving Node A's open_channel message
10356
10395
// 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( );
10358
10397
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10359
10398
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();
10360
10399
@@ -10486,7 +10525,7 @@ mod tests {
10486
10525
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();
10487
10526
10488
10527
// 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( );
10490
10529
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10491
10530
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();
10492
10531
@@ -10547,7 +10586,7 @@ mod tests {
10547
10586
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
10548
10587
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
10549
10588
// 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();
10551
10590
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
10552
10591
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
10553
10592
@@ -10556,7 +10595,7 @@ mod tests {
10556
10595
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
10557
10596
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
10558
10597
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( );
10560
10599
10561
10600
// Test that `InboundV1Channel::new` creates a channel with the correct value for
10562
10601
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10632,12 +10671,12 @@ mod tests {
10632
10671
10633
10672
let mut outbound_node_config = UserConfig::default();
10634
10673
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();
10636
10675
10637
10676
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);
10638
10677
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
10639
10678
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( );
10641
10680
let mut inbound_node_config = UserConfig::default();
10642
10681
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10643
10682
@@ -10673,7 +10712,7 @@ mod tests {
10673
10712
10674
10713
// Create Node B's channel by receiving Node A's open_channel message
10675
10714
// 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( );
10677
10716
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10678
10717
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();
10679
10718
@@ -10750,7 +10789,7 @@ mod tests {
10750
10789
).unwrap();
10751
10790
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10752
10791
&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
10754
10793
).unwrap();
10755
10794
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10756
10795
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11648,13 +11687,13 @@ mod tests {
11648
11687
11649
11688
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
11650
11689
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,
11652
11691
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
11653
11692
11654
11693
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
11655
11694
channel_type_features.set_zero_conf_required();
11656
11695
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( );
11658
11697
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
11659
11698
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11660
11699
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11692,13 +11731,13 @@ mod tests {
11692
11731
expected_channel_type.set_static_remote_key_required();
11693
11732
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
11694
11733
11695
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11734
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11696
11735
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11697
11736
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11698
11737
None, &logger
11699
11738
).unwrap();
11700
11739
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( );
11702
11741
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11703
11742
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11704
11743
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11730,14 +11769,14 @@ mod tests {
11730
11769
let raw_init_features = static_remote_key_required | simple_anchors_required;
11731
11770
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
11732
11771
11733
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11772
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11734
11773
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11735
11774
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11736
11775
None, &logger
11737
11776
).unwrap();
11738
11777
11739
11778
// 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( );
11741
11780
open_channel_msg.common_fields.channel_type = None;
11742
11781
11743
11782
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11777,13 +11816,13 @@ mod tests {
11777
11816
// First, we'll try to open a channel between A and B where A requests a channel type for
11778
11817
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
11779
11818
// B as it's not supported by LDK.
11780
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11819
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11781
11820
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11782
11821
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11783
11822
None, &logger
11784
11823
).unwrap();
11785
11824
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( );
11787
11826
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11788
11827
11789
11828
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11802,7 +11841,7 @@ mod tests {
11802
11841
10000000, 100000, 42, &config, 0, 42, None, &logger
11803
11842
).unwrap();
11804
11843
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( );
11806
11845
11807
11846
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11808
11847
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11853,7 +11892,7 @@ mod tests {
11853
11892
&logger
11854
11893
).unwrap();
11855
11894
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( );
11857
11896
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11858
11897
let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11859
11898
&feeest,
0 commit comments