@@ -479,6 +479,9 @@ mod state_flags {
479479 pub const LOCAL_STFU_SENT: u32 = 1 << 15;
480480 pub const REMOTE_STFU_SENT: u32 = 1 << 16;
481481 pub const QUIESCENT: u32 = 1 << 17;
482+ pub const INTERACTIVE_SIGNING: u32 = 1 << 18;
483+ pub const OUR_TX_SIGNATURES_SENT: u32 = 1 << 19;
484+ pub const THEIR_TX_SIGNATURES_SENT: u32 = 1 << 20;
482485}
483486
484487define_state_flags!(
@@ -511,6 +514,21 @@ define_state_flags!(
511514 ]
512515);
513516
517+ define_state_flags!(
518+ "Flags that only apply to [`ChannelState::FundingNegotiated`].",
519+ FUNDED_STATE, FundingNegotiatedFlags, [
520+ ("Indicates we have an active interactive signing session for an interactive transaction",
521+ INTERACTIVE_SIGNING, state_flags::INTERACTIVE_SIGNING,
522+ is_interactive_signing, set_interactive_signing, clear_interactive_signing),
523+ ("Indicates they sent us a `tx_signatures` message.",
524+ THEIR_TX_SIGNATURES_SENT, state_flags::THEIR_TX_SIGNATURES_SENT,
525+ is_their_tx_signatures_sent, set_their_tx_signatures_sent, clear_their_tx_signatures_sent),
526+ ("Indicates we sent them a `tx_signatures` message.",
527+ OUR_TX_SIGNATURES_SENT, state_flags::OUR_TX_SIGNATURES_SENT,
528+ is_our_tx_signatures_sent, set_our_tx_signatures_sent, clear_our_tx_signatures_sent)
529+ ]
530+ );
531+
514532define_state_flags!(
515533 "Flags that only apply to [`ChannelState::AwaitingChannelReady`].",
516534 FUNDED_STATE, AwaitingChannelReadyFlags, [
@@ -568,8 +586,9 @@ enum ChannelState {
568586 NegotiatingFunding(NegotiatingFundingFlags),
569587 /// We have sent `funding_created` and are awaiting a `funding_signed` to advance to
570588 /// `AwaitingChannelReady`. Note that this is nonsense for an inbound channel as we immediately generate
571- /// `funding_signed` upon receipt of `funding_created`, so simply skip this state.
572- FundingNegotiated,
589+ /// `funding_signed` upon receipt of `funding_created`, so simply skip this state. For dual-funded (V2)
590+ /// channels, this state is also skipped.
591+ FundingNegotiated(FundingNegotiatedFlags),
573592 /// We've received/sent `funding_created` and `funding_signed` and are thus now waiting on the
574593 /// funding transaction to confirm.
575594 AwaitingChannelReady(AwaitingChannelReadyFlags),
@@ -612,7 +631,7 @@ macro_rules! impl_state_flag {
612631 }
613632 };
614633 ($get: ident, $set: ident, $clear: ident, FUNDED_STATES) => {
615- impl_state_flag!($get, $set, $clear, [AwaitingChannelReady, ChannelReady]);
634+ impl_state_flag!($get, $set, $clear, [FundingNegotiated, AwaitingChannelReady, ChannelReady]);
616635 };
617636 ($get: ident, $set: ident, $clear: ident, $state: ident) => {
618637 impl_state_flag!($get, $set, $clear, [$state]);
@@ -622,10 +641,12 @@ macro_rules! impl_state_flag {
622641impl ChannelState {
623642 fn from_u32(state: u32) -> Result<Self, ()> {
624643 match state {
625- state_flags::FUNDING_NEGOTIATED => Ok(ChannelState::FundingNegotiated),
626644 state_flags::SHUTDOWN_COMPLETE => Ok(ChannelState::ShutdownComplete),
627645 val => {
628- if val & state_flags::AWAITING_CHANNEL_READY == state_flags::AWAITING_CHANNEL_READY {
646+ if val & state_flags::FUNDING_NEGOTIATED == state_flags::FUNDING_NEGOTIATED {
647+ FundingNegotiatedFlags::from_u32(val & !state_flags::FUNDING_NEGOTIATED)
648+ .map(|flags| ChannelState::FundingNegotiated(flags))
649+ } else if val & state_flags::AWAITING_CHANNEL_READY == state_flags::AWAITING_CHANNEL_READY {
629650 AwaitingChannelReadyFlags::from_u32(val & !state_flags::AWAITING_CHANNEL_READY)
630651 .map(|flags| ChannelState::AwaitingChannelReady(flags))
631652 } else if val & state_flags::CHANNEL_READY == state_flags::CHANNEL_READY {
@@ -643,15 +664,15 @@ impl ChannelState {
643664 fn to_u32(self) -> u32 {
644665 match self {
645666 ChannelState::NegotiatingFunding(flags) => flags.0,
646- ChannelState::FundingNegotiated => state_flags::FUNDING_NEGOTIATED,
667+ ChannelState::FundingNegotiated(flags) => state_flags::FUNDING_NEGOTIATED | flags.0 ,
647668 ChannelState::AwaitingChannelReady(flags) => state_flags::AWAITING_CHANNEL_READY | flags.0,
648669 ChannelState::ChannelReady(flags) => state_flags::CHANNEL_READY | flags.0,
649670 ChannelState::ShutdownComplete => state_flags::SHUTDOWN_COMPLETE,
650671 }
651672 }
652673
653674 fn is_pre_funded_state(&self) -> bool {
654- matches!(self, ChannelState::NegotiatingFunding(_)|ChannelState::FundingNegotiated)
675+ matches!(self, ChannelState::NegotiatingFunding(_)|ChannelState::FundingNegotiated(_) )
655676 }
656677
657678 fn is_both_sides_shutdown(&self) -> bool {
@@ -685,6 +706,9 @@ impl ChannelState {
685706 impl_state_flag!(is_monitor_update_in_progress, set_monitor_update_in_progress, clear_monitor_update_in_progress, FUNDED_STATES);
686707 impl_state_flag!(is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent, FUNDED_STATES);
687708 impl_state_flag!(is_remote_shutdown_sent, set_remote_shutdown_sent, clear_remote_shutdown_sent, FUNDED_STATES);
709+ impl_state_flag!(is_interactive_signing, set_interactive_signing, clear_interactive_signing, FundingNegotiated);
710+ impl_state_flag!(is_our_tx_signatures_sent, set_our_tx_signatures_sent, clear_our_tx_signatures_sent, FundingNegotiated);
711+ impl_state_flag!(is_their_tx_signatures_sent, set_their_tx_signatures_sent, clear_their_tx_signatures_sent, FundingNegotiated);
688712 impl_state_flag!(is_our_channel_ready, set_our_channel_ready, clear_our_channel_ready, AwaitingChannelReady);
689713 impl_state_flag!(is_their_channel_ready, set_their_channel_ready, clear_their_channel_ready, AwaitingChannelReady);
690714 impl_state_flag!(is_waiting_for_batch, set_waiting_for_batch, clear_waiting_for_batch, AwaitingChannelReady);
@@ -2094,10 +2118,12 @@ trait InitialRemoteCommitmentReceiver<SP: Deref> where SP::Target: SignerProvide
20942118 context.channel_id = channel_id;
20952119
20962120 assert!(!context.channel_state.is_monitor_update_in_progress()); // We have not had any monitor(s) yet to fail update!
2097- if context.is_batch_funding() {
2098- context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::WAITING_FOR_BATCH);
2099- } else {
2100- context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2121+ if !context.channel_state.is_interactive_signing() {
2122+ if context.is_batch_funding() {
2123+ context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::WAITING_FOR_BATCH);
2124+ } else {
2125+ context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2126+ }
21012127 }
21022128 if holder_commitment_point.advance(&context.holder_signer, &context.secp_ctx, logger).is_err() {
21032129 // We only fail to advance our commitment point/number if we're currently
@@ -2349,7 +2375,9 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
23492375 )));
23502376 };
23512377
2352- self.context.channel_state = ChannelState::FundingNegotiated;
2378+ let mut channel_state = ChannelState::FundingNegotiated(FundingNegotiatedFlags::new());
2379+ channel_state.set_interactive_signing();
2380+ self.context.channel_state = channel_state;
23532381
23542382 // Clear the interactive transaction constructor
23552383 self.interactive_tx_constructor.take();
@@ -3440,7 +3468,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
34403468
34413469 fn unset_funding_info(&mut self, funding: &mut FundingScope) {
34423470 debug_assert!(
3443- matches!(self.channel_state, ChannelState::FundingNegotiated)
3471+ matches!(self.channel_state, ChannelState::FundingNegotiated(_) )
34443472 || matches!(self.channel_state, ChannelState::AwaitingChannelReady(_))
34453473 );
34463474 funding.channel_transaction_parameters.funding_outpoint = None;
@@ -4432,7 +4460,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
44324460
44334461 fn if_unbroadcasted_funding<F, O>(&self, f: F) -> Option<O> where F: Fn() -> Option<O> {
44344462 match self.channel_state {
4435- ChannelState::FundingNegotiated => f(),
4463+ ChannelState::FundingNegotiated(_) => f(),
44364464 ChannelState::AwaitingChannelReady(flags) =>
44374465 if flags.is_set(AwaitingChannelReadyFlags::WAITING_FOR_BATCH) ||
44384466 flags.is_set(FundedStateFlags::MONITOR_UPDATE_IN_PROGRESS.into())
@@ -5642,7 +5670,7 @@ impl<SP: Deref> FundedChannel<SP> where
56425670 ) -> Result<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>, ChannelError>
56435671 where L::Target: Logger
56445672 {
5645- if !matches!(self.context.channel_state, ChannelState::FundingNegotiated) {
5673+ if !matches!(self.context.channel_state, ChannelState::FundingNegotiated(_) ) {
56465674 return Err(ChannelError::Close(
56475675 (
56485676 "Received initial commitment_signed before funding transaction constructed!".to_owned(),
@@ -5659,7 +5687,6 @@ impl<SP: Deref> FundedChannel<SP> where
56595687 log_info!(logger, "Received initial commitment_signed from peer for channel {}", &self.context.channel_id());
56605688
56615689 let need_channel_ready = self.check_get_channel_ready(0, logger).is_some();
5662- self.context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
56635690 self.monitor_updating_paused(false, false, need_channel_ready, Vec::new(), Vec::new(), Vec::new());
56645691
56655692 if let Some(tx_signatures) = self.interactive_tx_signing_session.as_mut().and_then(
@@ -6246,10 +6273,10 @@ impl<SP: Deref> FundedChannel<SP> where
62466273 }
62476274 }
62486275
6249- pub fn tx_signatures<L: Deref>(&mut self, msg: &msgs::TxSignatures, logger: &L) -> Result<Option<msgs::TxSignatures>, ChannelError>
6276+ pub fn tx_signatures<L: Deref>(&mut self, msg: &msgs::TxSignatures, logger: &L) -> Result<( Option<Transaction>, Option< msgs::TxSignatures>) , ChannelError>
62506277 where L::Target: Logger
62516278 {
6252- if !matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(_ )) {
6279+ if !matches!(self.context.channel_state, ChannelState::FundingNegotiated(flags) if flags.is_interactive_signing( )) {
62536280 return Err(ChannelError::close("Received tx_signatures in strange state!".to_owned()));
62546281 }
62556282
@@ -6286,21 +6313,28 @@ impl<SP: Deref> FundedChannel<SP> where
62866313 let (holder_tx_signatures_opt, funding_tx_opt) = signing_session.received_tx_signatures(msg.clone())
62876314 .map_err(|_| ChannelError::Warn("Witness count did not match contributed input count".to_string()))?;
62886315
6316+ // Set `THEIR_TX_SIGNATURES_SENT` flag after all potential errors.
6317+ self.context.channel_state.set_their_tx_signatures_sent();
62896318
62906319 if funding_tx_opt.is_some() {
62916320 // We have a finalized funding transaction, so we can set the funding transaction and reset the
62926321 // signing session fields.
6293- self.funding.funding_transaction = funding_tx_opt;
6322+ self.funding.funding_transaction = funding_tx_opt.clone() ;
62946323 self.interactive_tx_signing_session = None;
62956324 }
62966325
62976326 if holder_tx_signatures_opt.is_some() && self.is_awaiting_initial_mon_persist() {
62986327 log_debug!(logger, "Not sending tx_signatures: a monitor update is in progress. Setting monitor_pending_tx_signatures.");
62996328 self.context.monitor_pending_tx_signatures = holder_tx_signatures_opt;
6300- return Ok(None);
6329+ return Ok(( None, None) );
63016330 }
63026331
6303- Ok(holder_tx_signatures_opt)
6332+ if holder_tx_signatures_opt.is_some() {
6333+ self.context.channel_state.set_our_tx_signatures_sent();
6334+ }
6335+
6336+ self.context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
6337+ Ok((funding_tx_opt, holder_tx_signatures_opt))
63046338 } else {
63056339 Err(ChannelError::Close((
63066340 "Unexpected tx_signatures. No funding transaction awaiting signatures".to_string(),
@@ -6560,6 +6594,9 @@ impl<SP: Deref> FundedChannel<SP> where
65606594 // MonitorUpdateInProgress (and we assume the user will never directly broadcast the funding
65616595 // transaction and waits for us to do it).
65626596 let tx_signatures = self.context.monitor_pending_tx_signatures.take();
6597+ if tx_signatures.is_some() {
6598+ self.context.channel_state.set_our_tx_signatures_sent();
6599+ }
65636600
65646601 if self.context.channel_state.is_peer_disconnected() {
65656602 self.context.monitor_pending_revoke_and_ack = false;
@@ -7028,7 +7065,7 @@ impl<SP: Deref> FundedChannel<SP> where
70287065 if session.unsigned_tx().compute_txid() == next_funding_txid {
70297066 debug_assert_eq!(session.unsigned_tx().compute_txid(), self.maybe_get_next_funding_txid().unwrap());
70307067
7031- let commitment_update = if !session.counterparty_sent_tx_signatures () && msg.next_local_commitment_number == 0 {
7068+ let commitment_update = if !self.context.channel_state.is_their_tx_signatures_sent () && msg.next_local_commitment_number == 0 {
70327069 // if it has not received tx_signatures for that funding transaction AND
70337070 // if next_commitment_number is zero:
70347071 // MUST retransmit its commitment_signed for that funding transaction.
@@ -7047,10 +7084,10 @@ impl<SP: Deref> FundedChannel<SP> where
70477084 // if it has not received tx_signatures for that funding transaction AND
70487085 // if it has already received commitment_signed AND it should sign first, as specified in the tx_signatures requirements:
70497086 // MUST send its tx_signatures for that funding transaction.
7050- !session.counterparty_sent_tx_signatures () && session.has_received_commitment_signed() && session.holder_sends_tx_signatures_first()
7087+ !self.context.channel_state.is_their_tx_signatures_sent () && session.has_received_commitment_signed() && session.holder_sends_tx_signatures_first()
70517088 // else if it has already received tx_signatures for that funding transaction:
70527089 // MUST send its tx_signatures for that funding transaction.
7053- ) || session.counterparty_sent_tx_signatures () {
7090+ ) || self.context.channel_state.is_their_tx_signatures_sent () {
70547091 if self.context.channel_state.is_monitor_update_in_progress() {
70557092 // The `monitor_pending_tx_signatures` field should have already been set in `commitment_signed_initial_v2`
70567093 // if we were up first for signing and had a monitor update in progress, but check again just in case.
@@ -8424,9 +8461,9 @@ impl<SP: Deref> FundedChannel<SP> where
84248461 // If we've sent `commtiment_signed` for an interactively constructed transaction
84258462 // during a signing session, but have not received `tx_signatures` we MUST set `next_funding_txid`
84268463 // to the txid of that interactive transaction, else we MUST NOT set it.
8427- if let Some(signing_session) = & self.interactive_tx_signing_session {
8464+ if self.context.channel_state.is_interactive_signing() {
84288465 // Since we have a signing_session, this implies we've sent an initial `commitment_signed`...
8429- if !signing_session.counterparty_sent_tx_signatures () {
8466+ if !self.context.channel_state.is_their_tx_signatures_sent () {
84308467 // ...but we didn't receive a `tx_signatures` from the counterparty yet.
84318468 Some(self.funding_outpoint().txid)
84328469 } else {
@@ -9406,7 +9443,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
94069443
94079444 // Now that we're past error-generating stuff, update our local state:
94089445
9409- self.context.channel_state = ChannelState::FundingNegotiated;
9446+ self.context.channel_state = ChannelState::FundingNegotiated(FundingNegotiatedFlags::new()) ;
94109447 self.context.channel_id = ChannelId::v1_from_funding_outpoint(funding_txo);
94119448
94129449 // If the funding transaction is a coinbase transaction, we need to set the minimum depth to 100.
@@ -9523,7 +9560,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
95239560 if !self.funding.is_outbound() {
95249561 return Err((self, ChannelError::close("Received funding_signed for an inbound channel?".to_owned())));
95259562 }
9526- if !matches!(self.context.channel_state, ChannelState::FundingNegotiated) {
9563+ if !matches!(self.context.channel_state, ChannelState::FundingNegotiated(_) ) {
95279564 return Err((self, ChannelError::close("Received funding_signed in strange state!".to_owned())));
95289565 }
95299566 let mut holder_commitment_point = match self.unfunded_context.holder_commitment_point {
@@ -11251,11 +11288,12 @@ mod tests {
1125111288 #[test]
1125211289 fn test_channel_state_order() {
1125311290 use crate::ln::channel::NegotiatingFundingFlags;
11291+ use crate::ln::channel::FundingNegotiatedFlags;
1125411292 use crate::ln::channel::AwaitingChannelReadyFlags;
1125511293 use crate::ln::channel::ChannelReadyFlags;
1125611294
11257- assert!(ChannelState::NegotiatingFunding(NegotiatingFundingFlags::new()) < ChannelState::FundingNegotiated);
11258- assert!(ChannelState::FundingNegotiated < ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new()));
11295+ assert!(ChannelState::NegotiatingFunding(NegotiatingFundingFlags::new()) < ChannelState::FundingNegotiated(FundingNegotiatedFlags::new()) );
11296+ assert!(ChannelState::FundingNegotiated(FundingNegotiatedFlags::new()) < ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new()));
1125911297 assert!(ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new()) < ChannelState::ChannelReady(ChannelReadyFlags::new()));
1126011298 assert!(ChannelState::ChannelReady(ChannelReadyFlags::new()) < ChannelState::ShutdownComplete);
1126111299 }
0 commit comments