@@ -8586,6 +8586,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
8586
8586
pub(super) struct InboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
8587
8587
pub context: ChannelContext<SP>,
8588
8588
pub unfunded_context: UnfundedChannelContext,
8589
+ pub signer_pending_accept_channel: bool,
8589
8590
}
8590
8591
8591
8592
/// Fetches the [`ChannelTypeFeatures`] that will be used for a channel built from a given
@@ -8675,15 +8676,17 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8675
8676
unfunded_channel_age_ticks: 0,
8676
8677
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
8677
8678
};
8678
- let chan = Self { context, unfunded_context };
8679
+ let chan = Self { context, unfunded_context, signer_pending_accept_channel: false };
8679
8680
Ok(chan)
8680
8681
}
8681
8682
8682
8683
/// Marks an inbound channel as accepted and generates a [`msgs::AcceptChannel`] message which
8683
8684
/// should be sent back to the counterparty node.
8684
8685
///
8685
8686
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8686
- pub fn accept_inbound_channel(&self) -> msgs::AcceptChannel {
8687
+ pub fn accept_inbound_channel<L: Deref>(
8688
+ &mut self, logger: &L
8689
+ ) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8687
8690
if self.context.is_outbound() {
8688
8691
panic!("Tried to send accept_channel for an outbound channel?");
8689
8692
}
@@ -8697,21 +8700,36 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8697
8700
panic!("Tried to send an accept_channel for a channel that has already advanced");
8698
8701
}
8699
8702
8700
- self.generate_accept_channel_message()
8703
+ self.generate_accept_channel_message(logger )
8701
8704
}
8702
8705
8703
8706
/// This function is used to explicitly generate a [`msgs::AcceptChannel`] message for an
8704
8707
/// inbound channel. If the intention is to accept an inbound channel, use
8705
8708
/// [`InboundV1Channel::accept_inbound_channel`] instead.
8706
8709
///
8707
8710
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8708
- fn generate_accept_channel_message(&self) -> msgs::AcceptChannel {
8709
- debug_assert!(self.unfunded_context.holder_commitment_point.map(|point| point.is_available()).unwrap_or(false));
8710
- let first_per_commitment_point = self.unfunded_context.holder_commitment_point
8711
- .expect("TODO: Handle holder_commitment_point not being set").current_point();
8711
+ fn generate_accept_channel_message<L: Deref>(
8712
+ &mut self, _logger: &L
8713
+ ) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8714
+ let first_per_commitment_point = match self.unfunded_context.holder_commitment_point {
8715
+ Some(holder_commitment_point) if holder_commitment_point.is_available() => {
8716
+ self.signer_pending_accept_channel = false;
8717
+ holder_commitment_point.current_point()
8718
+ },
8719
+ _ => {
8720
+ #[cfg(not(async_signing))] {
8721
+ panic!("Failed getting commitment point for accept_channel message");
8722
+ }
8723
+ #[cfg(async_signing)] {
8724
+ log_trace!(_logger, "Unable to generate accept_channel message, waiting for commitment point");
8725
+ self.signer_pending_accept_channel = true;
8726
+ return None;
8727
+ }
8728
+ }
8729
+ };
8712
8730
let keys = self.context.get_holder_pubkeys();
8713
8731
8714
- msgs::AcceptChannel {
8732
+ Some( msgs::AcceptChannel {
8715
8733
common_fields: msgs::CommonAcceptChannelFields {
8716
8734
temporary_channel_id: self.context.channel_id,
8717
8735
dust_limit_satoshis: self.context.holder_dust_limit_satoshis,
@@ -8735,16 +8753,18 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8735
8753
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
8736
8754
#[cfg(taproot)]
8737
8755
next_local_nonce: None,
8738
- }
8756
+ })
8739
8757
}
8740
8758
8741
8759
/// Enables the possibility for tests to extract a [`msgs::AcceptChannel`] message for an
8742
8760
/// inbound channel without accepting it.
8743
8761
///
8744
8762
/// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
8745
8763
#[cfg(test)]
8746
- pub fn get_accept_channel_message(&self) -> msgs::AcceptChannel {
8747
- self.generate_accept_channel_message()
8764
+ pub fn get_accept_channel_message<L: Deref>(
8765
+ &mut self, logger: &L
8766
+ ) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8767
+ self.generate_accept_channel_message(logger)
8748
8768
}
8749
8769
8750
8770
pub fn funding_created<L: Deref>(
@@ -8803,6 +8823,26 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
8803
8823
8804
8824
Ok((channel, funding_signed, channel_monitor))
8805
8825
}
8826
+
8827
+ /// Indicates that the signer may have some signatures for us, so we should retry if we're
8828
+ /// blocked.
8829
+ #[allow(unused)]
8830
+ pub fn signer_maybe_unblocked<L: Deref>(
8831
+ &mut self, logger: &L
8832
+ ) -> Option<msgs::AcceptChannel> where L::Target: Logger {
8833
+ if self.unfunded_context.holder_commitment_point.is_none() {
8834
+ self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx);
8835
+ }
8836
+ if let Some(ref mut point) = self.unfunded_context.holder_commitment_point {
8837
+ if !point.is_available() {
8838
+ point.try_resolve_pending(&self.context.holder_signer, &self.context.secp_ctx, logger);
8839
+ }
8840
+ }
8841
+ if self.signer_pending_accept_channel {
8842
+ log_trace!(logger, "Attempting to generate accept_channel...");
8843
+ self.generate_accept_channel_message(logger)
8844
+ } else { None }
8845
+ }
8806
8846
}
8807
8847
8808
8848
// A not-yet-funded outbound (from holder) channel using V2 channel establishment.
@@ -10424,10 +10464,10 @@ mod tests {
10424
10464
// Make sure A's dust limit is as we expect.
10425
10465
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
10426
10466
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10427
- 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();
10467
+ 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();
10428
10468
10429
10469
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10430
- let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10470
+ let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10431
10471
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
10432
10472
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10433
10473
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10556,10 +10596,10 @@ mod tests {
10556
10596
// Create Node B's channel by receiving Node A's open_channel message
10557
10597
let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
10558
10598
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10559
- 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();
10599
+ 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();
10560
10600
10561
10601
// Node B --> Node A: accept channel
10562
- let accept_channel_msg = node_b_chan.accept_inbound_channel();
10602
+ let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10563
10603
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10564
10604
10565
10605
// Node A --> Node B: funding created
@@ -10743,10 +10783,10 @@ mod tests {
10743
10783
// Make sure A's dust limit is as we expect.
10744
10784
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
10745
10785
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10746
- 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();
10786
+ 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();
10747
10787
10748
10788
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
10749
- let mut accept_channel_msg = node_b_chan.accept_inbound_channel();
10789
+ let mut accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
10750
10790
accept_channel_msg.common_fields.dust_limit_satoshis = 546;
10751
10791
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
10752
10792
node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10816,11 +10856,11 @@ mod tests {
10816
10856
let mut outbound_chan = OutboundV1Channel::<&TestKeysInterface>::new(
10817
10857
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &features, 10000000, 100000, 42, &config, 0, 42, None, &logger
10818
10858
).unwrap();
10819
- let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10859
+ let mut inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10820
10860
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10821
10861
&features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
10822
10862
).unwrap();
10823
- outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10863
+ outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(&&logger).unwrap( ), &config.channel_handshake_limits, &features).unwrap();
10824
10864
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
10825
10865
value: Amount::from_sat(10000000), script_pubkey: outbound_chan.context.get_funding_redeemscript(),
10826
10866
}]};
@@ -11872,13 +11912,13 @@ mod tests {
11872
11912
11873
11913
let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
11874
11914
11875
- let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11915
+ let mut channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11876
11916
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11877
11917
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
11878
11918
&open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false
11879
11919
).unwrap();
11880
11920
11881
- let mut accept_channel_msg = channel_b.get_accept_channel_message();
11921
+ let mut accept_channel_msg = channel_b.get_accept_channel_message(&&logger).unwrap( );
11882
11922
accept_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11883
11923
11884
11924
let res = channel_a.accept_channel(
@@ -11923,7 +11963,7 @@ mod tests {
11923
11963
11924
11964
let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
11925
11965
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11926
- let node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11966
+ let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11927
11967
&feeest,
11928
11968
&&keys_provider,
11929
11969
&&keys_provider,
@@ -11938,7 +11978,7 @@ mod tests {
11938
11978
true, // Allow node b to send a 0conf channel_ready.
11939
11979
).unwrap();
11940
11980
11941
- let accept_channel_msg = node_b_chan.accept_inbound_channel();
11981
+ let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
11942
11982
node_a_chan.accept_channel(
11943
11983
&accept_channel_msg,
11944
11984
&config.channel_handshake_limits,
0 commit comments