@@ -7587,6 +7587,12 @@ impl<SP: Deref> Channel<SP> where
7587
7587
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
7588
7588
pub context: ChannelContext<SP>,
7589
7589
pub unfunded_context: UnfundedChannelContext,
7590
+ /// We tried to send a `open_channel` message but our commitment point wasn't ready.
7591
+ /// This flag tells us we need to send it when we are retried once the
7592
+ /// commiment point is ready.
7593
+ ///
7594
+ /// TODO: don't need to persist this since we'll send open_channel again on connect?
7595
+ pub signer_pending_open_channel: bool,
7590
7596
}
7591
7597
7592
7598
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -7631,7 +7637,8 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7631
7637
pubkeys,
7632
7638
logger,
7633
7639
)?,
7634
- unfunded_context: UnfundedChannelContext { unfunded_channel_age_ticks: 0 }
7640
+ unfunded_context: UnfundedChannelContext { unfunded_channel_age_ticks: 0 },
7641
+ signer_pending_open_channel: false,
7635
7642
};
7636
7643
Ok(chan)
7637
7644
}
@@ -7730,14 +7737,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7730
7737
/// If we receive an error message, it may only be a rejection of the channel type we tried,
7731
7738
/// not of our ability to open any channel at all. Thus, on error, we should first call this
7732
7739
/// and see if we get a new `OpenChannel` message, otherwise the channel is failed.
7733
- pub(crate) fn maybe_handle_error_without_close<F: Deref>(
7734
- &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
7740
+ pub(crate) fn maybe_handle_error_without_close<F: Deref, L: Deref >(
7741
+ &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
7735
7742
) -> Result<msgs::OpenChannel, ()>
7736
7743
where
7737
- F::Target: FeeEstimator
7744
+ F::Target: FeeEstimator,
7745
+ L::Target: Logger,
7738
7746
{
7739
7747
self.context.maybe_downgrade_channel_features(fee_estimator)?;
7740
- Ok( self.get_open_channel(chain_hash))
7748
+ self.get_open_channel(chain_hash, logger).ok_or(( ))
7741
7749
}
7742
7750
7743
7751
/// Returns true if we can resume the channel by sending the [`msgs::OpenChannel`] again.
@@ -7746,7 +7754,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7746
7754
self.context.holder_commitment_point.transaction_number() == INITIAL_COMMITMENT_NUMBER
7747
7755
}
7748
7756
7749
- pub fn get_open_channel(&self, chain_hash: ChainHash) -> msgs::OpenChannel {
7757
+ pub fn get_open_channel<L: Deref>(&mut self, chain_hash: ChainHash, logger: &L) -> Option<msgs::OpenChannel>
7758
+ where L::Target: Logger
7759
+ {
7750
7760
if !self.context.is_outbound() {
7751
7761
panic!("Tried to open a channel for an inbound channel?");
7752
7762
}
@@ -7758,11 +7768,26 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7758
7768
panic!("Tried to send an open_channel for a channel that has already advanced");
7759
7769
}
7760
7770
7761
- debug_assert!(self.context.holder_commitment_point.is_available());
7762
- let first_per_commitment_point = self.context.holder_commitment_point.current_point().expect("TODO");
7771
+ // Note: another option here is to make commitment point a parameter of this function
7772
+ // and make a helper method get_point_for_open_channel to check + set signer_pending_open_channel
7773
+ // and call that right before anytime we call this function, so this function can remain
7774
+ // side-effect free.
7775
+ let first_per_commitment_point = if let Some(point) = self.context.holder_commitment_point.current_point() {
7776
+ self.signer_pending_open_channel = false;
7777
+ point
7778
+ } else {
7779
+ #[cfg(not(async_signing))] {
7780
+ panic!("Failed getting commitment point for open_channel message");
7781
+ }
7782
+ #[cfg(async_signing)] {
7783
+ log_trace!(logger, "Unable to generate open_channel message, waiting for commitment point");
7784
+ self.signer_pending_open_channel = true;
7785
+ return None;
7786
+ }
7787
+ };
7763
7788
let keys = self.context.get_holder_pubkeys();
7764
7789
7765
- msgs::OpenChannel {
7790
+ Some( msgs::OpenChannel {
7766
7791
common_fields: msgs::CommonOpenChannelFields {
7767
7792
chain_hash,
7768
7793
temporary_channel_id: self.context.channel_id,
@@ -7788,7 +7813,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7788
7813
},
7789
7814
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
7790
7815
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
7791
- }
7816
+ })
7792
7817
}
7793
7818
7794
7819
// Message handlers
@@ -9693,12 +9718,12 @@ mod tests {
9693
9718
9694
9719
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
9695
9720
let config = UserConfig::default();
9696
- 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();
9721
+ 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();
9697
9722
9698
9723
// Now change the fee so we can check that the fee in the open_channel message is the
9699
9724
// same as the old fee.
9700
9725
fee_est.fee_est = 500;
9701
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9726
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9702
9727
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
9703
9728
}
9704
9729
@@ -9724,7 +9749,7 @@ mod tests {
9724
9749
9725
9750
// Create Node B's channel by receiving Node A's open_channel message
9726
9751
// Make sure A's dust limit is as we expect.
9727
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9752
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9728
9753
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9729
9754
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();
9730
9755
@@ -9856,7 +9881,7 @@ mod tests {
9856
9881
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();
9857
9882
9858
9883
// Create Node B's channel by receiving Node A's open_channel message
9859
- let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
9884
+ let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap( );
9860
9885
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9861
9886
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();
9862
9887
@@ -9917,7 +9942,7 @@ mod tests {
9917
9942
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
9918
9943
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
9919
9944
// which is set to the lower bound + 1 (2%) of the `channel_value`.
9920
- 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();
9945
+ 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();
9921
9946
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
9922
9947
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
9923
9948
@@ -9926,7 +9951,7 @@ mod tests {
9926
9951
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
9927
9952
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
9928
9953
9929
- let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
9954
+ let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9930
9955
9931
9956
// Test that `InboundV1Channel::new` creates a channel with the correct value for
9932
9957
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10002,12 +10027,12 @@ mod tests {
10002
10027
10003
10028
let mut outbound_node_config = UserConfig::default();
10004
10029
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10005
- 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();
10030
+ 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();
10006
10031
10007
10032
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);
10008
10033
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
10009
10034
10010
- let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10035
+ let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10011
10036
let mut inbound_node_config = UserConfig::default();
10012
10037
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10013
10038
@@ -10043,7 +10068,7 @@ mod tests {
10043
10068
10044
10069
// Create Node B's channel by receiving Node A's open_channel message
10045
10070
// Make sure A's dust limit is as we expect.
10046
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10071
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10047
10072
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10048
10073
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();
10049
10074
@@ -10120,7 +10145,7 @@ mod tests {
10120
10145
).unwrap();
10121
10146
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10122
10147
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10123
- &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10148
+ &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( ), 7, &config, 0, &&logger, false
10124
10149
).unwrap();
10125
10150
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10126
10151
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11016,13 +11041,13 @@ mod tests {
11016
11041
11017
11042
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
11018
11043
let config = UserConfig::default();
11019
- let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11044
+ let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11020
11045
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
11021
11046
11022
11047
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
11023
11048
channel_type_features.set_zero_conf_required();
11024
11049
11025
- let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11050
+ let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11026
11051
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
11027
11052
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11028
11053
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11060,13 +11085,13 @@ mod tests {
11060
11085
expected_channel_type.set_static_remote_key_required();
11061
11086
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
11062
11087
11063
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11088
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11064
11089
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11065
11090
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11066
11091
None, &logger
11067
11092
).unwrap();
11068
11093
11069
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11094
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11070
11095
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11071
11096
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11072
11097
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11098,14 +11123,14 @@ mod tests {
11098
11123
let raw_init_features = static_remote_key_required | simple_anchors_required;
11099
11124
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
11100
11125
11101
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11126
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11102
11127
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11103
11128
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11104
11129
None, &logger
11105
11130
).unwrap();
11106
11131
11107
11132
// Set `channel_type` to `None` to force the implicit feature negotiation.
11108
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11133
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11109
11134
open_channel_msg.common_fields.channel_type = None;
11110
11135
11111
11136
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11145,13 +11170,13 @@ mod tests {
11145
11170
// First, we'll try to open a channel between A and B where A requests a channel type for
11146
11171
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
11147
11172
// B as it's not supported by LDK.
11148
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11173
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11149
11174
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11150
11175
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11151
11176
None, &logger
11152
11177
).unwrap();
11153
11178
11154
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11179
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11155
11180
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11156
11181
11157
11182
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11170,7 +11195,7 @@ mod tests {
11170
11195
10000000, 100000, 42, &config, 0, 42, None, &logger
11171
11196
).unwrap();
11172
11197
11173
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11198
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11174
11199
11175
11200
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11176
11201
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11221,7 +11246,7 @@ mod tests {
11221
11246
&logger
11222
11247
).unwrap();
11223
11248
11224
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11249
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11225
11250
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11226
11251
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11227
11252
&feeest,
0 commit comments