@@ -8586,6 +8586,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
85868586pub(super) struct InboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
85878587 pub context: ChannelContext<SP>,
85888588 pub unfunded_context: UnfundedChannelContext,
8589+ pub signer_pending_accept_channel: bool,
85898590}
85908591
85918592/// 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 {
86758676 unfunded_channel_age_ticks: 0,
86768677 holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
86778678 };
8678- let chan = Self { context, unfunded_context };
8679+ let chan = Self { context, unfunded_context, signer_pending_accept_channel: false };
86798680 Ok(chan)
86808681 }
86818682
86828683 /// Marks an inbound channel as accepted and generates a [`msgs::AcceptChannel`] message which
86838684 /// should be sent back to the counterparty node.
86848685 ///
86858686 /// [`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 {
86878690 if self.context.is_outbound() {
86888691 panic!("Tried to send accept_channel for an outbound channel?");
86898692 }
@@ -8697,21 +8700,36 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
86978700 panic!("Tried to send an accept_channel for a channel that has already advanced");
86988701 }
86998702
8700- self.generate_accept_channel_message()
8703+ self.generate_accept_channel_message(logger )
87018704 }
87028705
87038706 /// This function is used to explicitly generate a [`msgs::AcceptChannel`] message for an
87048707 /// inbound channel. If the intention is to accept an inbound channel, use
87058708 /// [`InboundV1Channel::accept_inbound_channel`] instead.
87068709 ///
87078710 /// [`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+ };
87128730 let keys = self.context.get_holder_pubkeys();
87138731
8714- msgs::AcceptChannel {
8732+ Some( msgs::AcceptChannel {
87158733 common_fields: msgs::CommonAcceptChannelFields {
87168734 temporary_channel_id: self.context.channel_id,
87178735 dust_limit_satoshis: self.context.holder_dust_limit_satoshis,
@@ -8735,16 +8753,18 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
87358753 channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
87368754 #[cfg(taproot)]
87378755 next_local_nonce: None,
8738- }
8756+ })
87398757 }
87408758
87418759 /// Enables the possibility for tests to extract a [`msgs::AcceptChannel`] message for an
87428760 /// inbound channel without accepting it.
87438761 ///
87448762 /// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel
87458763 #[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)
87488768 }
87498769
87508770 pub fn funding_created<L: Deref>(
@@ -8803,6 +8823,26 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
88038823
88048824 Ok((channel, funding_signed, channel_monitor))
88058825 }
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+ }
88068846}
88078847
88088848// A not-yet-funded outbound (from holder) channel using V2 channel establishment.
@@ -10424,10 +10464,10 @@ mod tests {
1042410464 // Make sure A's dust limit is as we expect.
1042510465 let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1042610466 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();
1042810468
1042910469 // 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( );
1043110471 accept_channel_msg.common_fields.dust_limit_satoshis = 546;
1043210472 node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1043310473 node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10556,10 +10596,10 @@ mod tests {
1055610596 // Create Node B's channel by receiving Node A's open_channel message
1055710597 let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap();
1055810598 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();
1056010600
1056110601 // 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( );
1056310603 node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1056410604
1056510605 // Node A --> Node B: funding created
@@ -10743,10 +10783,10 @@ mod tests {
1074310783 // Make sure A's dust limit is as we expect.
1074410784 let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1074510785 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();
1074710787
1074810788 // 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( );
1075010790 accept_channel_msg.common_fields.dust_limit_satoshis = 546;
1075110791 node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features(&config)).unwrap();
1075210792 node_a_chan.context.holder_dust_limit_satoshis = 1560;
@@ -10816,11 +10856,11 @@ mod tests {
1081610856 let mut outbound_chan = OutboundV1Channel::<&TestKeysInterface>::new(
1081710857 &feeest, &&keys_provider, &&keys_provider, node_b_node_id, &features, 10000000, 100000, 42, &config, 0, 42, None, &logger
1081810858 ).unwrap();
10819- let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10859+ let mut inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
1082010860 &feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
1082110861 &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap(), 7, &config, 0, &&logger, false
1082210862 ).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();
1082410864 let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
1082510865 value: Amount::from_sat(10000000), script_pubkey: outbound_chan.context.get_funding_redeemscript(),
1082610866 }]};
@@ -11872,13 +11912,13 @@ mod tests {
1187211912
1187311913 let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1187411914
11875- let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11915+ let mut channel_b = InboundV1Channel::<&TestKeysInterface>::new(
1187611916 &fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
1187711917 &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
1187811918 &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false
1187911919 ).unwrap();
1188011920
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( );
1188211922 accept_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
1188311923
1188411924 let res = channel_a.accept_channel(
@@ -11923,7 +11963,7 @@ mod tests {
1192311963
1192411964 let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap();
1192511965 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(
1192711967 &feeest,
1192811968 &&keys_provider,
1192911969 &&keys_provider,
@@ -11938,7 +11978,7 @@ mod tests {
1193811978 true, // Allow node b to send a 0conf channel_ready.
1193911979 ).unwrap();
1194011980
11941- let accept_channel_msg = node_b_chan.accept_inbound_channel();
11981+ let accept_channel_msg = node_b_chan.accept_inbound_channel(&&logger).unwrap( );
1194211982 node_a_chan.accept_channel(
1194311983 &accept_channel_msg,
1194411984 &config.channel_handshake_limits,
0 commit comments