@@ -7631,6 +7631,12 @@ impl<SP: Deref> Channel<SP> where
7631
7631
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
7632
7632
pub context: ChannelContext<SP>,
7633
7633
pub unfunded_context: UnfundedChannelContext,
7634
+ /// We tried to send a `open_channel` message but our commitment point wasn't ready.
7635
+ /// This flag tells us we need to send it when we are retried once the
7636
+ /// commiment point is ready.
7637
+ ///
7638
+ /// TODO: don't need to persist this since we'll send open_channel again on connect?
7639
+ pub signer_pending_open_channel: bool,
7634
7640
}
7635
7641
7636
7642
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -7675,7 +7681,8 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7675
7681
pubkeys,
7676
7682
logger,
7677
7683
)?,
7678
- unfunded_context: UnfundedChannelContext { unfunded_channel_age_ticks: 0 }
7684
+ unfunded_context: UnfundedChannelContext { unfunded_channel_age_ticks: 0 },
7685
+ signer_pending_open_channel: false,
7679
7686
};
7680
7687
Ok(chan)
7681
7688
}
@@ -7774,14 +7781,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7774
7781
/// If we receive an error message, it may only be a rejection of the channel type we tried,
7775
7782
/// not of our ability to open any channel at all. Thus, on error, we should first call this
7776
7783
/// and see if we get a new `OpenChannel` message, otherwise the channel is failed.
7777
- pub(crate) fn maybe_handle_error_without_close<F: Deref>(
7778
- &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
7784
+ pub(crate) fn maybe_handle_error_without_close<F: Deref, L: Deref >(
7785
+ &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
7779
7786
) -> Result<msgs::OpenChannel, ()>
7780
7787
where
7781
- F::Target: FeeEstimator
7788
+ F::Target: FeeEstimator,
7789
+ L::Target: Logger,
7782
7790
{
7783
7791
self.context.maybe_downgrade_channel_features(fee_estimator)?;
7784
- Ok( self.get_open_channel(chain_hash))
7792
+ self.get_open_channel(chain_hash, logger).ok_or(( ))
7785
7793
}
7786
7794
7787
7795
/// Returns true if we can resume the channel by sending the [`msgs::OpenChannel`] again.
@@ -7790,7 +7798,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7790
7798
self.context.holder_commitment_point.transaction_number() == INITIAL_COMMITMENT_NUMBER
7791
7799
}
7792
7800
7793
- pub fn get_open_channel(&self, chain_hash: ChainHash) -> msgs::OpenChannel {
7801
+ pub fn get_open_channel<L: Deref>(&mut self, chain_hash: ChainHash, logger: &L) -> Option<msgs::OpenChannel>
7802
+ where L::Target: Logger
7803
+ {
7794
7804
if !self.context.is_outbound() {
7795
7805
panic!("Tried to open a channel for an inbound channel?");
7796
7806
}
@@ -7802,11 +7812,26 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7802
7812
panic!("Tried to send an open_channel for a channel that has already advanced");
7803
7813
}
7804
7814
7805
- debug_assert!(self.context.holder_commitment_point.is_available());
7806
- let first_per_commitment_point = self.context.holder_commitment_point.current_point().expect("TODO");
7815
+ // Note: another option here is to make commitment point a parameter of this function
7816
+ // and make a helper method get_point_for_open_channel to check + set signer_pending_open_channel
7817
+ // and call that right before anytime we call this function, so this function can remain
7818
+ // side-effect free.
7819
+ let first_per_commitment_point = if let Some(point) = self.context.holder_commitment_point.current_point() {
7820
+ self.signer_pending_open_channel = false;
7821
+ point
7822
+ } else {
7823
+ #[cfg(not(async_signing))] {
7824
+ panic!("Failed getting commitment point for open_channel message");
7825
+ }
7826
+ #[cfg(async_signing)] {
7827
+ log_trace!(logger, "Unable to generate open_channel message, waiting for commitment point");
7828
+ self.signer_pending_open_channel = true;
7829
+ return None;
7830
+ }
7831
+ };
7807
7832
let keys = self.context.get_holder_pubkeys();
7808
7833
7809
- msgs::OpenChannel {
7834
+ Some( msgs::OpenChannel {
7810
7835
common_fields: msgs::CommonOpenChannelFields {
7811
7836
chain_hash,
7812
7837
temporary_channel_id: self.context.channel_id,
@@ -7832,7 +7857,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7832
7857
},
7833
7858
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
7834
7859
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
7835
- }
7860
+ })
7836
7861
}
7837
7862
7838
7863
// Message handlers
@@ -9750,12 +9775,12 @@ mod tests {
9750
9775
9751
9776
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
9752
9777
let config = UserConfig::default();
9753
- 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();
9778
+ 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();
9754
9779
9755
9780
// Now change the fee so we can check that the fee in the open_channel message is the
9756
9781
// same as the old fee.
9757
9782
fee_est.fee_est = 500;
9758
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9783
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9759
9784
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
9760
9785
}
9761
9786
@@ -9781,7 +9806,7 @@ mod tests {
9781
9806
9782
9807
// Create Node B's channel by receiving Node A's open_channel message
9783
9808
// Make sure A's dust limit is as we expect.
9784
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9809
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9785
9810
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9786
9811
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();
9787
9812
@@ -9913,7 +9938,7 @@ mod tests {
9913
9938
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();
9914
9939
9915
9940
// Create Node B's channel by receiving Node A's open_channel message
9916
- let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
9941
+ let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap( );
9917
9942
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9918
9943
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();
9919
9944
@@ -9974,7 +9999,7 @@ mod tests {
9974
9999
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
9975
10000
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
9976
10001
// which is set to the lower bound + 1 (2%) of the `channel_value`.
9977
- 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();
10002
+ 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();
9978
10003
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
9979
10004
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
9980
10005
@@ -9983,7 +10008,7 @@ mod tests {
9983
10008
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
9984
10009
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
9985
10010
9986
- let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
10011
+ let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9987
10012
9988
10013
// Test that `InboundV1Channel::new` creates a channel with the correct value for
9989
10014
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10059,12 +10084,12 @@ mod tests {
10059
10084
10060
10085
let mut outbound_node_config = UserConfig::default();
10061
10086
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10062
- 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();
10087
+ 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();
10063
10088
10064
10089
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);
10065
10090
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
10066
10091
10067
- let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10092
+ let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10068
10093
let mut inbound_node_config = UserConfig::default();
10069
10094
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10070
10095
@@ -10100,7 +10125,7 @@ mod tests {
10100
10125
10101
10126
// Create Node B's channel by receiving Node A's open_channel message
10102
10127
// Make sure A's dust limit is as we expect.
10103
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10128
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10104
10129
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10105
10130
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();
10106
10131
@@ -10177,7 +10202,7 @@ mod tests {
10177
10202
).unwrap();
10178
10203
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10179
10204
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10180
- &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10205
+ &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( ), 7, &config, 0, &&logger, false
10181
10206
).unwrap();
10182
10207
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10183
10208
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11075,13 +11100,13 @@ mod tests {
11075
11100
11076
11101
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
11077
11102
let config = UserConfig::default();
11078
- let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11103
+ let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11079
11104
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
11080
11105
11081
11106
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
11082
11107
channel_type_features.set_zero_conf_required();
11083
11108
11084
- let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11109
+ let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11085
11110
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
11086
11111
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11087
11112
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11119,13 +11144,13 @@ mod tests {
11119
11144
expected_channel_type.set_static_remote_key_required();
11120
11145
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
11121
11146
11122
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11147
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11123
11148
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11124
11149
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11125
11150
None, &logger
11126
11151
).unwrap();
11127
11152
11128
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11153
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11129
11154
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11130
11155
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11131
11156
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11157,14 +11182,14 @@ mod tests {
11157
11182
let raw_init_features = static_remote_key_required | simple_anchors_required;
11158
11183
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
11159
11184
11160
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11185
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11161
11186
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11162
11187
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11163
11188
None, &logger
11164
11189
).unwrap();
11165
11190
11166
11191
// Set `channel_type` to `None` to force the implicit feature negotiation.
11167
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11192
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11168
11193
open_channel_msg.common_fields.channel_type = None;
11169
11194
11170
11195
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11204,13 +11229,13 @@ mod tests {
11204
11229
// First, we'll try to open a channel between A and B where A requests a channel type for
11205
11230
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
11206
11231
// B as it's not supported by LDK.
11207
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11232
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11208
11233
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11209
11234
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11210
11235
None, &logger
11211
11236
).unwrap();
11212
11237
11213
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11238
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11214
11239
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11215
11240
11216
11241
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11229,7 +11254,7 @@ mod tests {
11229
11254
10000000, 100000, 42, &config, 0, 42, None, &logger
11230
11255
).unwrap();
11231
11256
11232
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11257
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11233
11258
11234
11259
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11235
11260
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11280,7 +11305,7 @@ mod tests {
11280
11305
&logger
11281
11306
).unwrap();
11282
11307
11283
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11308
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11284
11309
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11285
11310
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11286
11311
&feeest,
0 commit comments