@@ -7615,6 +7615,12 @@ impl<SP: Deref> Channel<SP> where
7615
7615
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
7616
7616
pub context: ChannelContext<SP>,
7617
7617
pub unfunded_context: UnfundedChannelContext,
7618
+ /// We tried to send a `open_channel` message but our commitment point wasn't ready.
7619
+ /// This flag tells us we need to send it when we are retried once the
7620
+ /// commiment point is ready.
7621
+ ///
7622
+ /// TODO: don't need to persist this since we'll send open_channel again on connect?
7623
+ pub signer_pending_open_channel: bool,
7618
7624
}
7619
7625
7620
7626
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -7663,7 +7669,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7663
7669
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
7664
7670
};
7665
7671
7666
- let chan = Self { context, unfunded_context };
7672
+ let chan = Self { context, unfunded_context, signer_pending_open_channel: false };
7667
7673
Ok(chan)
7668
7674
}
7669
7675
@@ -7761,14 +7767,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7761
7767
/// If we receive an error message, it may only be a rejection of the channel type we tried,
7762
7768
/// not of our ability to open any channel at all. Thus, on error, we should first call this
7763
7769
/// and see if we get a new `OpenChannel` message, otherwise the channel is failed.
7764
- pub(crate) fn maybe_handle_error_without_close<F: Deref>(
7765
- &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
7770
+ pub(crate) fn maybe_handle_error_without_close<F: Deref, L: Deref >(
7771
+ &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
7766
7772
) -> Result<msgs::OpenChannel, ()>
7767
7773
where
7768
- F::Target: FeeEstimator
7774
+ F::Target: FeeEstimator,
7775
+ L::Target: Logger,
7769
7776
{
7770
7777
self.context.maybe_downgrade_channel_features(fee_estimator)?;
7771
- Ok( self.get_open_channel(chain_hash))
7778
+ self.get_open_channel(chain_hash, logger).ok_or(( ))
7772
7779
}
7773
7780
7774
7781
/// Returns true if we can resume the channel by sending the [`msgs::OpenChannel`] again.
@@ -7777,7 +7784,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7777
7784
self.unfunded_context.transaction_number() == INITIAL_COMMITMENT_NUMBER
7778
7785
}
7779
7786
7780
- pub fn get_open_channel(&self, chain_hash: ChainHash) -> msgs::OpenChannel {
7787
+ pub fn get_open_channel<L: Deref>(&mut self, chain_hash: ChainHash, logger: &L) -> Option<msgs::OpenChannel>
7788
+ where L::Target: Logger
7789
+ {
7781
7790
if !self.context.is_outbound() {
7782
7791
panic!("Tried to open a channel for an inbound channel?");
7783
7792
}
@@ -7789,13 +7798,22 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7789
7798
panic!("Tried to send an open_channel for a channel that has already advanced");
7790
7799
}
7791
7800
7792
- debug_assert!(self.unfunded_context.holder_commitment_point
7793
- .map(|point| point.is_available()).unwrap_or(false));
7794
- let first_per_commitment_point = self.unfunded_context.holder_commitment_point
7795
- .expect("TODO: Handle holder_commitment_point not being set").current_point();
7801
+ let first_per_commitment_point = if let Some(holder_commitment_point) = self.unfunded_context.holder_commitment_point {
7802
+ self.signer_pending_open_channel = false;
7803
+ holder_commitment_point.current_point()
7804
+ } else {
7805
+ #[cfg(not(async_signing))] {
7806
+ panic!("Failed getting commitment point for open_channel message");
7807
+ }
7808
+ #[cfg(async_signing)] {
7809
+ log_trace!(logger, "Unable to generate open_channel message, waiting for commitment point");
7810
+ self.signer_pending_open_channel = true;
7811
+ return None;
7812
+ }
7813
+ };
7796
7814
let keys = self.context.get_holder_pubkeys();
7797
7815
7798
- msgs::OpenChannel {
7816
+ Some( msgs::OpenChannel {
7799
7817
common_fields: msgs::CommonOpenChannelFields {
7800
7818
chain_hash,
7801
7819
temporary_channel_id: self.context.channel_id,
@@ -7821,7 +7839,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7821
7839
},
7822
7840
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
7823
7841
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
7824
- }
7842
+ })
7825
7843
}
7826
7844
7827
7845
// Message handlers
@@ -7949,11 +7967,32 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7949
7967
/// Indicates that the signer may have some signatures for us, so we should retry if we're
7950
7968
/// blocked.
7951
7969
#[cfg(async_signing)]
7952
- pub fn signer_maybe_unblocked<L: Deref>(&mut self, logger: &L) -> Option<msgs::FundingCreated> where L::Target: Logger {
7953
- if self.context.signer_pending_funding && self.context.is_outbound() {
7954
- log_trace!(logger, "Signer unblocked a funding_created");
7970
+ pub fn signer_maybe_unblocked<L: Deref>(&mut self, chain_hash: ChainHash, logger: &L) -> (Option<msgs::OpenChannel>, Option<msgs::FundingCreated>)
7971
+ where L::Target: Logger
7972
+ {
7973
+ // If we were pending a commitment point, retry the signer and advance to an
7974
+ // available state.
7975
+ if self.unfunded_context.holder_commitment_point.is_none() {
7976
+ self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
7977
+ }
7978
+ if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
7979
+ if !point.is_available() {
7980
+ point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
7981
+ }
7982
+ }
7983
+ let open_channel = match self.unfunded_context.holder_commitment_point {
7984
+ Some(ref mut point) if point.is_available() && self.signer_pending_open_channel => {
7985
+ log_trace!(logger, "Attempting to generate open_channel...");
7986
+ self.get_open_channel(chain_hash, logger)
7987
+ }
7988
+ _ => None
7989
+ };
7990
+ let funding_created = if self.context.signer_pending_funding && self.context.is_outbound() {
7991
+ log_trace!(logger, "Attempting to generate pending funding created...");
7992
+ self.context.signer_pending_funding = false;
7955
7993
self.get_funding_created_msg(logger)
7956
- } else { None }
7994
+ } else { None };
7995
+ (open_channel, funding_created)
7957
7996
}
7958
7997
}
7959
7998
@@ -9764,12 +9803,12 @@ mod tests {
9764
9803
9765
9804
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
9766
9805
let config = UserConfig::default();
9767
- 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();
9806
+ 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();
9768
9807
9769
9808
// Now change the fee so we can check that the fee in the open_channel message is the
9770
9809
// same as the old fee.
9771
9810
fee_est.fee_est = 500;
9772
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9811
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9773
9812
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
9774
9813
}
9775
9814
@@ -9795,7 +9834,7 @@ mod tests {
9795
9834
9796
9835
// Create Node B's channel by receiving Node A's open_channel message
9797
9836
// Make sure A's dust limit is as we expect.
9798
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9837
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9799
9838
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9800
9839
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();
9801
9840
@@ -9927,7 +9966,7 @@ mod tests {
9927
9966
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();
9928
9967
9929
9968
// Create Node B's channel by receiving Node A's open_channel message
9930
- let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
9969
+ let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap( );
9931
9970
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9932
9971
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();
9933
9972
@@ -9988,7 +10027,7 @@ mod tests {
9988
10027
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
9989
10028
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
9990
10029
// which is set to the lower bound + 1 (2%) of the `channel_value`.
9991
- 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();
10030
+ 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();
9992
10031
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
9993
10032
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
9994
10033
@@ -9997,7 +10036,7 @@ mod tests {
9997
10036
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
9998
10037
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
9999
10038
10000
- let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
10039
+ let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10001
10040
10002
10041
// Test that `InboundV1Channel::new` creates a channel with the correct value for
10003
10042
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10073,12 +10112,12 @@ mod tests {
10073
10112
10074
10113
let mut outbound_node_config = UserConfig::default();
10075
10114
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10076
- 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();
10115
+ 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();
10077
10116
10078
10117
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);
10079
10118
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
10080
10119
10081
- let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10120
+ let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10082
10121
let mut inbound_node_config = UserConfig::default();
10083
10122
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10084
10123
@@ -10114,7 +10153,7 @@ mod tests {
10114
10153
10115
10154
// Create Node B's channel by receiving Node A's open_channel message
10116
10155
// Make sure A's dust limit is as we expect.
10117
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10156
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10118
10157
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10119
10158
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();
10120
10159
@@ -10191,7 +10230,7 @@ mod tests {
10191
10230
).unwrap();
10192
10231
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10193
10232
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10194
- &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10233
+ &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( ), 7, &config, 0, &&logger, false
10195
10234
).unwrap();
10196
10235
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10197
10236
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11089,13 +11128,13 @@ mod tests {
11089
11128
11090
11129
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
11091
11130
let config = UserConfig::default();
11092
- let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11131
+ let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11093
11132
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
11094
11133
11095
11134
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
11096
11135
channel_type_features.set_zero_conf_required();
11097
11136
11098
- let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11137
+ let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11099
11138
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
11100
11139
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11101
11140
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11133,13 +11172,13 @@ mod tests {
11133
11172
expected_channel_type.set_static_remote_key_required();
11134
11173
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
11135
11174
11136
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11175
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11137
11176
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11138
11177
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11139
11178
None, &logger
11140
11179
).unwrap();
11141
11180
11142
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11181
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11143
11182
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11144
11183
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11145
11184
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11171,14 +11210,14 @@ mod tests {
11171
11210
let raw_init_features = static_remote_key_required | simple_anchors_required;
11172
11211
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
11173
11212
11174
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11213
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11175
11214
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11176
11215
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11177
11216
None, &logger
11178
11217
).unwrap();
11179
11218
11180
11219
// Set `channel_type` to `None` to force the implicit feature negotiation.
11181
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11220
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11182
11221
open_channel_msg.common_fields.channel_type = None;
11183
11222
11184
11223
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11218,13 +11257,13 @@ mod tests {
11218
11257
// First, we'll try to open a channel between A and B where A requests a channel type for
11219
11258
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
11220
11259
// B as it's not supported by LDK.
11221
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11260
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11222
11261
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11223
11262
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11224
11263
None, &logger
11225
11264
).unwrap();
11226
11265
11227
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11266
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11228
11267
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11229
11268
11230
11269
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11243,7 +11282,7 @@ mod tests {
11243
11282
10000000, 100000, 42, &config, 0, 42, None, &logger
11244
11283
).unwrap();
11245
11284
11246
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11285
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11247
11286
11248
11287
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11249
11288
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11294,7 +11333,7 @@ mod tests {
11294
11333
&logger
11295
11334
).unwrap();
11296
11335
11297
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11336
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11298
11337
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11299
11338
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11300
11339
&feeest,
0 commit comments