@@ -8556,6 +8556,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8556
8556
pub(super) struct InboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
8557
8557
pub context: ChannelContext<SP>,
8558
8558
pub unfunded_context: UnfundedChannelContext,
8559
+ pub signer_pending_accept_channel: bool,
8559
8560
}
8560
8561
8561
8562
/// Fetches the [`ChannelTypeFeatures`] that will be used for a channel built from a given
@@ -8645,15 +8646,17 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8645
8646
unfunded_channel_age_ticks: 0,
8646
8647
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
8647
8648
};
8648
- let chan = Self { context, unfunded_context };
8649
+ let chan = Self { context, unfunded_context, signer_pending_accept_channel: false };
8649
8650
Ok(chan)
8650
8651
}
8651
8652
8652
8653
/// Marks an inbound channel as accepted and generates a [`msgs::AcceptChannel`] message which
8653
8654
/// should be sent back to the counterparty node.
8654
8655
///
8655
8656
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8656
- pub fn accept_inbound_channel(&self) -> msgs::AcceptChannel {
8657
+ pub fn accept_inbound_channel<L: Deref>(
8658
+ &mut self, logger: &L
8659
+ ) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8657
8660
if self.context.is_outbound() {
8658
8661
panic!("Tried to send accept_channel for an outbound channel?");
8659
8662
}
@@ -8667,21 +8670,36 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8667
8670
panic!("Tried to send an accept_channel for a channel that has already advanced");
8668
8671
}
8669
8672
8670
- self.generate_accept_channel_message()
8673
+ self.generate_accept_channel_message(logger )
8671
8674
}
8672
8675
8673
8676
/// This function is used to explicitly generate a [`msgs::AcceptChannel`] message for an
8674
8677
/// inbound channel. If the intention is to accept an inbound channel, use
8675
8678
/// [`InboundV1Channel::accept_inbound_channel`] instead.
8676
8679
///
8677
8680
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8678
- fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
8679
- debug_assert!(self.unfunded_context.holder_commitment_point.map(|point| point.is_available()).unwrap_or(false));
8680
- let first_per_commitment_point = self.unfunded_context.holder_commitment_point
8681
- .expect("TODO: Handle holder_commitment_point not being set").current_point();
8681
+ fn generate_accept_channel_message<L: Deref>(
8682
+ &mut self, _logger: &L
8683
+ ) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8684
+ let first_per_commitment_point = match self.unfunded_context.holder_commitment_point {
8685
+ Some(holder_commitment_point) if holder_commitment_point.is_available() => {
8686
+ self.signer_pending_accept_channel = false;
8687
+ holder_commitment_point.current_point()
8688
+ },
8689
+ _ => {
8690
+ #[cfg(not(async_signing))] {
8691
+ panic!("Failed getting commitment point for accept_channel message");
8692
+ }
8693
+ #[cfg(async_signing)] {
8694
+ log_trace!(_logger, "Unable to generate accept_channel message, waiting for commitment point");
8695
+ self.signer_pending_accept_channel = true;
8696
+ return None;
8697
+ }
8698
+ }
8699
+ };
8682
8700
let keys = self.context.get_holder_pubkeys();
8683
8701
8684
- msgs::AcceptChannel {
8702
+ Some( msgs::AcceptChannel {
8685
8703
common_fields: msgs::CommonAcceptChannelFields {
8686
8704
temporary_channel_id: self.context.channel_id,
8687
8705
dust_limit_satoshis: self.context.holder_dust_limit_satoshis,
@@ -8705,16 +8723,18 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8705
8723
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
8706
8724
#[cfg(taproot)]
8707
8725
next_local_nonce: None,
8708
- }
8726
+ })
8709
8727
}
8710
8728
8711
8729
/// Enables the possibility for tests to extract a [`msgs::AcceptChannel`] message for an
8712
8730
/// inbound channel without accepting it.
8713
8731
///
8714
8732
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8715
8733
#[cfg(test)]
8716
- pub fn get_accept_channel_message(&self) -> msgs::AcceptChannel {
8717
- self.generate_accept_channel_message()
8734
+ pub fn get_accept_channel_message<L: Deref>(
8735
+ &mut self, logger: &L
8736
+ ) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8737
+ self.generate_accept_channel_message(logger)
8718
8738
}
8719
8739
8720
8740
pub fn funding_created<L: Deref>(
@@ -8773,6 +8793,26 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8773
8793
8774
8794
Ok((channel, funding_signed, channel_monitor))
8775
8795
}
8796
+
8797
+ /// Indicates that the signer may have some signatures for us, so we should retry if we're
8798
+ /// blocked.
8799
+ #[allow(unused)]
8800
+ pub fn signer_maybe_unblocked<L: Deref>(
8801
+ &mut self, logger: &L
8802
+ ) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8803
+ if self.unfunded_context.holder_commitment_point.is_none() {
8804
+ self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
8805
+ }
8806
+ if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
8807
+ if !point.is_available() {
8808
+ point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
8809
+ }
8810
+ }
8811
+ if self.signer_pending_accept_channel {
8812
+ log_trace!(logger, "Attempting to generate accept_channel...");
8813
+ self.generate_accept_channel_message(logger)
8814
+ } else { None }
8815
+ }
8776
8816
}
8777
8817
8778
8818
// A not-yet-funded outbound (from holder) channel using V2 channel establishment.
@@ -10392,10 +10432,10 @@ mod tests {
10392
10432
// Make sure A's dust limit is as we expect.
10393
10433
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
10394
10434
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10395
- 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();
10435
+ 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();
10396
10436
10397
10437
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10398
- let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10438
+ let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10399
10439
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
10400
10440
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10401
10441
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10524,10 +10564,10 @@ mod tests {
10524
10564
// Create Node B's channel by receiving Node A's open_channel message
10525
10565
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
10526
10566
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10527
- 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();
10567
+ 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();
10528
10568
10529
10569
// Node B --> Node A: accept channel
10530
- let accept_channel_msg = node_b_chan.accept_inbound_channel();
10570
+ let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10531
10571
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10532
10572
10533
10573
// Node A --> Node B: funding created
@@ -10711,10 +10751,10 @@ mod tests {
10711
10751
// Make sure A's dust limit is as we expect.
10712
10752
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
10713
10753
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10714
- 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();
10754
+ 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();
10715
10755
10716
10756
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10717
- let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10757
+ let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10718
10758
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
10719
10759
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10720
10760
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10784,11 +10824,11 @@ mod tests {
10784
10824
let mut outbound_chan = OutboundV1Channel::<&TestKeysInterface>::new(
10785
10825
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &features, 10000000, 100000, 42, &config, 0, 42, None, &logger
10786
10826
).unwrap();
10787
- let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10827
+ let mut inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10788
10828
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10789
10829
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
10790
10830
).unwrap();
10791
- outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10831
+ outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(&&logger).unwrap( ), &config.channel_handshake_limits, &features).unwrap();
10792
10832
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
10793
10833
value: Amount::from_sat(10000000), script_pubkey: outbound_chan.context.get_funding_redeemscript(),
10794
10834
}]};
@@ -11840,13 +11880,13 @@ mod tests {
11840
11880
11841
11881
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
11842
11882
11843
- let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11883
+ let mut channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11844
11884
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11845
11885
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
11846
11886
&open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false
11847
11887
).unwrap();
11848
11888
11849
- let mut accept_channel_msg = channel_b.get_accept_channel_message();
11889
+ let mut accept_channel_msg = channel_b.get_accept_channel_message(&&logger).unwrap( );
11850
11890
accept_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11851
11891
11852
11892
let res = channel_a.accept_channel(
@@ -11891,7 +11931,7 @@ mod tests {
11891
11931
11892
11932
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
11893
11933
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11894
- let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11934
+ let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11895
11935
&feeest,
11896
11936
&&keys_provider,
11897
11937
&&keys_provider,
@@ -11906,7 +11946,7 @@ mod tests {
11906
11946
true, // Allow node b to send a 0conf channel_ready.
11907
11947
).unwrap();
11908
11948
11909
- let accept_channel_msg = node_b_chan.accept_inbound_channel();
11949
+ let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
11910
11950
node_a_chan.accept_channel(
11911
11951
&accept_channel_msg,
11912
11952
&config.channel_handshake_limits,
0 commit comments