@@ -8552,6 +8552,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8552
8552
pub(super) struct InboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
8553
8553
pub context: ChannelContext<SP>,
8554
8554
pub unfunded_context: UnfundedChannelContext,
8555
+ pub signer_pending_accept_channel: bool,
8555
8556
}
8556
8557
8557
8558
/// Fetches the [`ChannelTypeFeatures`] that will be used for a channel built from a given
@@ -8641,15 +8642,17 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8641
8642
unfunded_channel_age_ticks: 0,
8642
8643
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
8643
8644
};
8644
- let chan = Self { context, unfunded_context };
8645
+ let chan = Self { context, unfunded_context, signer_pending_accept_channel: false };
8645
8646
Ok(chan)
8646
8647
}
8647
8648
8648
8649
/// Marks an inbound channel as accepted and generates a [`msgs::AcceptChannel`] message which
8649
8650
/// should be sent back to the counterparty node.
8650
8651
///
8651
8652
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8652
- pub fn accept_inbound_channel(&self) -> msgs::AcceptChannel {
8653
+ pub fn accept_inbound_channel<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8654
+ where L::Target: Logger
8655
+ {
8653
8656
if self.context.is_outbound() {
8654
8657
panic!("Tried to send accept_channel for an outbound channel?");
8655
8658
}
@@ -8663,21 +8666,33 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8663
8666
panic!("Tried to send an accept_channel for a channel that has already advanced");
8664
8667
}
8665
8668
8666
- self.generate_accept_channel_message()
8669
+ self.generate_accept_channel_message(logger )
8667
8670
}
8668
8671
8669
8672
/// This function is used to explicitly generate a [`msgs::AcceptChannel`] message for an
8670
8673
/// inbound channel. If the intention is to accept an inbound channel, use
8671
8674
/// [`InboundV1Channel::accept_inbound_channel`] instead.
8672
8675
///
8673
8676
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8674
- fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
8675
- debug_assert!(self.unfunded_context.holder_commitment_point.map(|point| point.is_available()).unwrap_or(false));
8676
- let first_per_commitment_point = self.unfunded_context.holder_commitment_point
8677
- .expect("TODO: Handle holder_commitment_point not being set").current_point();
8677
+ fn generate_accept_channel_message<L: Deref>(&mut self, _logger: &L) -> Option<msgs::AcceptChannel>
8678
+ where L::Target: Logger
8679
+ {
8680
+ let first_per_commitment_point = if let Some(holder_commitment_point) = self.unfunded_context.holder_commitment_point {
8681
+ self.signer_pending_accept_channel = false;
8682
+ holder_commitment_point.current_point()
8683
+ } else {
8684
+ #[cfg(not(async_signing))] {
8685
+ panic!("Failed getting commitment point for accept_channel message");
8686
+ }
8687
+ #[cfg(async_signing)] {
8688
+ log_trace!(_logger, "Unable to generate accept_channel message, waiting for commitment point");
8689
+ self.signer_pending_accept_channel = true;
8690
+ return None;
8691
+ }
8692
+ };
8678
8693
let keys = self.context.get_holder_pubkeys();
8679
8694
8680
- msgs::AcceptChannel {
8695
+ Some( msgs::AcceptChannel {
8681
8696
common_fields: msgs::CommonAcceptChannelFields {
8682
8697
temporary_channel_id: self.context.channel_id,
8683
8698
dust_limit_satoshis: self.context.holder_dust_limit_satoshis,
@@ -8701,16 +8716,18 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8701
8716
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
8702
8717
#[cfg(taproot)]
8703
8718
next_local_nonce: None,
8704
- }
8719
+ })
8705
8720
}
8706
8721
8707
8722
/// Enables the possibility for tests to extract a [`msgs::AcceptChannel`] message for an
8708
8723
/// inbound channel without accepting it.
8709
8724
///
8710
8725
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8711
8726
#[cfg(test)]
8712
- pub fn get_accept_channel_message(&self) -> msgs::AcceptChannel {
8713
- self.generate_accept_channel_message()
8727
+ pub fn get_accept_channel_message<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8728
+ where L::Target: Logger
8729
+ {
8730
+ self.generate_accept_channel_message(logger)
8714
8731
}
8715
8732
8716
8733
pub fn funding_created<L: Deref>(
@@ -8769,6 +8786,29 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8769
8786
8770
8787
Ok((channel, funding_signed, channel_monitor))
8771
8788
}
8789
+
8790
+ /// Indicates that the signer may have some signatures for us, so we should retry if we're
8791
+ /// blocked.
8792
+ #[allow(unused)]
8793
+ pub fn signer_maybe_unblocked<L: Deref>(&mut self, logger: &L) -> Option<msgs::AcceptChannel>
8794
+ where L::Target: Logger
8795
+ {
8796
+ if self.unfunded_context.holder_commitment_point.is_none() {
8797
+ self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
8798
+ }
8799
+ if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
8800
+ if !point.is_available() {
8801
+ point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
8802
+ }
8803
+ }
8804
+ match self.unfunded_context.holder_commitment_point {
8805
+ Some(ref mut point) if point.is_available() && self.signer_pending_accept_channel => {
8806
+ log_trace!(logger, "Attempting to generate accept_channel...");
8807
+ self.generate_accept_channel_message(logger)
8808
+ }
8809
+ _ => None
8810
+ }
8811
+ }
8772
8812
}
8773
8813
8774
8814
// A not-yet-funded outbound (from holder) channel using V2 channel establishment.
@@ -10388,10 +10428,10 @@ mod tests {
10388
10428
// Make sure A's dust limit is as we expect.
10389
10429
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
10390
10430
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10391
- 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();
10431
+ 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();
10392
10432
10393
10433
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10394
- let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10434
+ let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10395
10435
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
10396
10436
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10397
10437
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10520,10 +10560,10 @@ mod tests {
10520
10560
// Create Node B's channel by receiving Node A's open_channel message
10521
10561
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
10522
10562
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10523
- 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();
10563
+ 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();
10524
10564
10525
10565
// Node B --> Node A: accept channel
10526
- let accept_channel_msg = node_b_chan.accept_inbound_channel();
10566
+ let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10527
10567
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10528
10568
10529
10569
// Node A --> Node B: funding created
@@ -10707,10 +10747,10 @@ mod tests {
10707
10747
// Make sure A's dust limit is as we expect.
10708
10748
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
10709
10749
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10710
- 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();
10750
+ 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();
10711
10751
10712
10752
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10713
- let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10753
+ let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10714
10754
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
10715
10755
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10716
10756
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10780,11 +10820,11 @@ mod tests {
10780
10820
let mut outbound_chan = OutboundV1Channel::<&TestKeysInterface>::new(
10781
10821
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &features, 10000000, 100000, 42, &config, 0, 42, None, &logger
10782
10822
).unwrap();
10783
- let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10823
+ let mut inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10784
10824
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10785
10825
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
10786
10826
).unwrap();
10787
- outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10827
+ outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(&&logger).unwrap( ), &config.channel_handshake_limits, &features).unwrap();
10788
10828
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
10789
10829
value: Amount::from_sat(10000000), script_pubkey: outbound_chan.context.get_funding_redeemscript(),
10790
10830
}]};
@@ -11836,13 +11876,13 @@ mod tests {
11836
11876
11837
11877
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
11838
11878
11839
- let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11879
+ let mut channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11840
11880
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11841
11881
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
11842
11882
&open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false
11843
11883
).unwrap();
11844
11884
11845
- let mut accept_channel_msg = channel_b.get_accept_channel_message();
11885
+ let mut accept_channel_msg = channel_b.get_accept_channel_message(&&logger).unwrap( );
11846
11886
accept_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11847
11887
11848
11888
let res = channel_a.accept_channel(
@@ -11887,7 +11927,7 @@ mod tests {
11887
11927
11888
11928
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
11889
11929
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11890
- let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11930
+ let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11891
11931
&feeest,
11892
11932
&&keys_provider,
11893
11933
&&keys_provider,
@@ -11902,7 +11942,7 @@ mod tests {
11902
11942
true, // Allow node b to send a 0conf channel_ready.
11903
11943
).unwrap();
11904
11944
11905
- let accept_channel_msg = node_b_chan.accept_inbound_channel();
11945
+ let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
11906
11946
node_a_chan.accept_channel(
11907
11947
&accept_channel_msg,
11908
11948
&config.channel_handshake_limits,
0 commit comments