@@ -479,6 +479,9 @@ mod state_flags {
479
479
pub const LOCAL_STFU_SENT: u32 = 1 << 15;
480
480
pub const REMOTE_STFU_SENT: u32 = 1 << 16;
481
481
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;
482
485
}
483
486
484
487
define_state_flags!(
@@ -511,6 +514,21 @@ define_state_flags!(
511
514
]
512
515
);
513
516
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
+
514
532
define_state_flags!(
515
533
"Flags that only apply to [`ChannelState::AwaitingChannelReady`].",
516
534
FUNDED_STATE, AwaitingChannelReadyFlags, [
@@ -568,8 +586,9 @@ enum ChannelState {
568
586
NegotiatingFunding(NegotiatingFundingFlags),
569
587
/// We have sent `funding_created` and are awaiting a `funding_signed` to advance to
570
588
/// `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),
573
592
/// We've received/sent `funding_created` and `funding_signed` and are thus now waiting on the
574
593
/// funding transaction to confirm.
575
594
AwaitingChannelReady(AwaitingChannelReadyFlags),
@@ -612,7 +631,7 @@ macro_rules! impl_state_flag {
612
631
}
613
632
};
614
633
($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]);
616
635
};
617
636
($get: ident, $set: ident, $clear: ident, $state: ident) => {
618
637
impl_state_flag!($get, $set, $clear, [$state]);
@@ -622,10 +641,12 @@ macro_rules! impl_state_flag {
622
641
impl ChannelState {
623
642
fn from_u32(state: u32) -> Result<Self, ()> {
624
643
match state {
625
- state_flags::FUNDING_NEGOTIATED => Ok(ChannelState::FundingNegotiated),
626
644
state_flags::SHUTDOWN_COMPLETE => Ok(ChannelState::ShutdownComplete),
627
645
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 {
629
650
AwaitingChannelReadyFlags::from_u32(val & !state_flags::AWAITING_CHANNEL_READY)
630
651
.map(|flags| ChannelState::AwaitingChannelReady(flags))
631
652
} else if val & state_flags::CHANNEL_READY == state_flags::CHANNEL_READY {
@@ -643,15 +664,15 @@ impl ChannelState {
643
664
fn to_u32(self) -> u32 {
644
665
match self {
645
666
ChannelState::NegotiatingFunding(flags) => flags.0,
646
- ChannelState::FundingNegotiated => state_flags::FUNDING_NEGOTIATED,
667
+ ChannelState::FundingNegotiated(flags) => state_flags::FUNDING_NEGOTIATED | flags.0 ,
647
668
ChannelState::AwaitingChannelReady(flags) => state_flags::AWAITING_CHANNEL_READY | flags.0,
648
669
ChannelState::ChannelReady(flags) => state_flags::CHANNEL_READY | flags.0,
649
670
ChannelState::ShutdownComplete => state_flags::SHUTDOWN_COMPLETE,
650
671
}
651
672
}
652
673
653
674
fn is_pre_funded_state(&self) -> bool {
654
- matches!(self, ChannelState::NegotiatingFunding(_)|ChannelState::FundingNegotiated)
675
+ matches!(self, ChannelState::NegotiatingFunding(_)|ChannelState::FundingNegotiated(_) )
655
676
}
656
677
657
678
fn is_both_sides_shutdown(&self) -> bool {
@@ -685,6 +706,9 @@ impl ChannelState {
685
706
impl_state_flag!(is_monitor_update_in_progress, set_monitor_update_in_progress, clear_monitor_update_in_progress, FUNDED_STATES);
686
707
impl_state_flag!(is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent, FUNDED_STATES);
687
708
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);
688
712
impl_state_flag!(is_our_channel_ready, set_our_channel_ready, clear_our_channel_ready, AwaitingChannelReady);
689
713
impl_state_flag!(is_their_channel_ready, set_their_channel_ready, clear_their_channel_ready, AwaitingChannelReady);
690
714
impl_state_flag!(is_waiting_for_batch, set_waiting_for_batch, clear_waiting_for_batch, AwaitingChannelReady);
@@ -2101,10 +2125,12 @@ trait InitialRemoteCommitmentReceiver<SP: Deref> where SP::Target: SignerProvide
2101
2125
context.channel_id = channel_id;
2102
2126
2103
2127
assert!(!context.channel_state.is_monitor_update_in_progress()); // We have not had any monitor(s) yet to fail update!
2104
- if context.is_batch_funding() {
2105
- context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::WAITING_FOR_BATCH);
2106
- } else {
2107
- context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2128
+ if !context.channel_state.is_interactive_signing() {
2129
+ if context.is_batch_funding() {
2130
+ context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::WAITING_FOR_BATCH);
2131
+ } else {
2132
+ context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2133
+ }
2108
2134
}
2109
2135
if holder_commitment_point.advance(&context.holder_signer, &context.secp_ctx, logger).is_err() {
2110
2136
// We only fail to advance our commitment point/number if we're currently
@@ -2356,7 +2382,9 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
2356
2382
)));
2357
2383
};
2358
2384
2359
- self.context.channel_state = ChannelState::FundingNegotiated;
2385
+ let mut channel_state = ChannelState::FundingNegotiated(FundingNegotiatedFlags::new());
2386
+ channel_state.set_interactive_signing();
2387
+ self.context.channel_state = channel_state;
2360
2388
2361
2389
// Clear the interactive transaction constructor
2362
2390
self.interactive_tx_constructor.take();
@@ -3447,7 +3475,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
3447
3475
3448
3476
fn unset_funding_info(&mut self, funding: &mut FundingScope) {
3449
3477
debug_assert!(
3450
- matches!(self.channel_state, ChannelState::FundingNegotiated)
3478
+ matches!(self.channel_state, ChannelState::FundingNegotiated(_) )
3451
3479
|| matches!(self.channel_state, ChannelState::AwaitingChannelReady(_))
3452
3480
);
3453
3481
funding.channel_transaction_parameters.funding_outpoint = None;
@@ -4411,7 +4439,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
4411
4439
4412
4440
fn if_unbroadcasted_funding<F, O>(&self, f: F) -> Option<O> where F: Fn() -> Option<O> {
4413
4441
match self.channel_state {
4414
- ChannelState::FundingNegotiated => f(),
4442
+ ChannelState::FundingNegotiated(_) => f(),
4415
4443
ChannelState::AwaitingChannelReady(flags) =>
4416
4444
if flags.is_set(AwaitingChannelReadyFlags::WAITING_FOR_BATCH) ||
4417
4445
flags.is_set(FundedStateFlags::MONITOR_UPDATE_IN_PROGRESS.into())
@@ -5622,7 +5650,7 @@ impl<SP: Deref> FundedChannel<SP> where
5622
5650
) -> Result<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>, ChannelError>
5623
5651
where L::Target: Logger
5624
5652
{
5625
- if !matches!(self.context.channel_state, ChannelState::FundingNegotiated) {
5653
+ if !matches!(self.context.channel_state, ChannelState::FundingNegotiated(_) ) {
5626
5654
return Err(ChannelError::Close(
5627
5655
(
5628
5656
"Received initial commitment_signed before funding transaction constructed!".to_owned(),
@@ -5639,7 +5667,6 @@ impl<SP: Deref> FundedChannel<SP> where
5639
5667
log_info!(logger, "Received initial commitment_signed from peer for channel {}", &self.context.channel_id());
5640
5668
5641
5669
let need_channel_ready = self.check_get_channel_ready(0, logger).is_some();
5642
- self.context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
5643
5670
self.monitor_updating_paused(false, false, need_channel_ready, Vec::new(), Vec::new(), Vec::new());
5644
5671
5645
5672
if let Some(tx_signatures) = self.interactive_tx_signing_session.as_mut().and_then(
@@ -6226,10 +6253,10 @@ impl<SP: Deref> FundedChannel<SP> where
6226
6253
}
6227
6254
}
6228
6255
6229
- pub fn tx_signatures<L: Deref>(&mut self, msg: &msgs::TxSignatures, logger: &L) -> Result<Option<msgs::TxSignatures>, ChannelError>
6256
+ pub fn tx_signatures<L: Deref>(&mut self, msg: &msgs::TxSignatures, logger: &L) -> Result<( Option<Transaction>, Option< msgs::TxSignatures>) , ChannelError>
6230
6257
where L::Target: Logger
6231
6258
{
6232
- if !matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(_ )) {
6259
+ if !matches!(self.context.channel_state, ChannelState::FundingNegotiated(flags) if flags.is_interactive_signing( )) {
6233
6260
return Err(ChannelError::close("Received tx_signatures in strange state!".to_owned()));
6234
6261
}
6235
6262
@@ -6266,21 +6293,28 @@ impl<SP: Deref> FundedChannel<SP> where
6266
6293
let (holder_tx_signatures_opt, funding_tx_opt) = signing_session.received_tx_signatures(msg.clone())
6267
6294
.map_err(|_| ChannelError::Warn("Witness count did not match contributed input count".to_string()))?;
6268
6295
6296
+ // Set `THEIR_TX_SIGNATURES_SENT` flag after all potential errors.
6297
+ self.context.channel_state.set_their_tx_signatures_sent();
6269
6298
6270
6299
if funding_tx_opt.is_some() {
6271
6300
// We have a finalized funding transaction, so we can set the funding transaction and reset the
6272
6301
// signing session fields.
6273
- self.funding.funding_transaction = funding_tx_opt;
6302
+ self.funding.funding_transaction = funding_tx_opt.clone() ;
6274
6303
self.interactive_tx_signing_session = None;
6275
6304
}
6276
6305
6277
6306
if holder_tx_signatures_opt.is_some() && self.is_awaiting_initial_mon_persist() {
6278
6307
log_debug!(logger, "Not sending tx_signatures: a monitor update is in progress. Setting monitor_pending_tx_signatures.");
6279
6308
self.context.monitor_pending_tx_signatures = holder_tx_signatures_opt;
6280
- return Ok(None);
6309
+ return Ok(( None, None) );
6281
6310
}
6282
6311
6283
- Ok(holder_tx_signatures_opt)
6312
+ if holder_tx_signatures_opt.is_some() {
6313
+ self.context.channel_state.set_our_tx_signatures_sent();
6314
+ }
6315
+
6316
+ self.context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
6317
+ Ok((funding_tx_opt, holder_tx_signatures_opt))
6284
6318
} else {
6285
6319
Err(ChannelError::Close((
6286
6320
"Unexpected tx_signatures. No funding transaction awaiting signatures".to_string(),
@@ -6541,6 +6575,9 @@ impl<SP: Deref> FundedChannel<SP> where
6541
6575
// MonitorUpdateInProgress (and we assume the user will never directly broadcast the funding
6542
6576
// transaction and waits for us to do it).
6543
6577
let tx_signatures = self.context.monitor_pending_tx_signatures.take();
6578
+ if tx_signatures.is_some() {
6579
+ self.context.channel_state.set_our_tx_signatures_sent();
6580
+ }
6544
6581
6545
6582
if self.context.channel_state.is_peer_disconnected() {
6546
6583
self.context.monitor_pending_revoke_and_ack = false;
@@ -7011,7 +7048,7 @@ impl<SP: Deref> FundedChannel<SP> where
7011
7048
if session.unsigned_tx().compute_txid() == next_funding_txid {
7012
7049
debug_assert_eq!(session.unsigned_tx().compute_txid(), self.maybe_get_next_funding_txid().unwrap());
7013
7050
7014
- let commitment_update = if !session.counterparty_sent_tx_signatures () && msg.next_local_commitment_number == 0 {
7051
+ let commitment_update = if !self.context.channel_state.is_their_tx_signatures_sent () && msg.next_local_commitment_number == 0 {
7015
7052
// if it has not received tx_signatures for that funding transaction AND
7016
7053
// if next_commitment_number is zero:
7017
7054
// MUST retransmit its commitment_signed for that funding transaction.
@@ -7030,10 +7067,10 @@ impl<SP: Deref> FundedChannel<SP> where
7030
7067
// if it has not received tx_signatures for that funding transaction AND
7031
7068
// if it has already received commitment_signed AND it should sign first, as specified in the tx_signatures requirements:
7032
7069
// MUST send its tx_signatures for that funding transaction.
7033
- !session.counterparty_sent_tx_signatures () && session.has_received_commitment_signed() && session.holder_sends_tx_signatures_first()
7070
+ !self.context.channel_state.is_their_tx_signatures_sent () && session.has_received_commitment_signed() && session.holder_sends_tx_signatures_first()
7034
7071
// else if it has already received tx_signatures for that funding transaction:
7035
7072
// MUST send its tx_signatures for that funding transaction.
7036
- ) || session.counterparty_sent_tx_signatures () {
7073
+ ) || self.context.channel_state.is_their_tx_signatures_sent () {
7037
7074
if self.context.channel_state.is_monitor_update_in_progress() {
7038
7075
// The `monitor_pending_tx_signatures` field should have already been set in `commitment_signed_initial_v2`
7039
7076
// if we were up first for signing and had a monitor update in progress, but check again just in case.
@@ -8407,9 +8444,9 @@ impl<SP: Deref> FundedChannel<SP> where
8407
8444
// If we've sent `commtiment_signed` for an interactively constructed transaction
8408
8445
// during a signing session, but have not received `tx_signatures` we MUST set `next_funding_txid`
8409
8446
// to the txid of that interactive transaction, else we MUST NOT set it.
8410
- if let Some(signing_session) = & self.interactive_tx_signing_session {
8447
+ if self.context.channel_state.is_interactive_signing() {
8411
8448
// Since we have a signing_session, this implies we've sent an initial `commitment_signed`...
8412
- if !signing_session.counterparty_sent_tx_signatures () {
8449
+ if !self.context.channel_state.is_their_tx_signatures_sent () {
8413
8450
// ...but we didn't receive a `tx_signatures` from the counterparty yet.
8414
8451
Some(self.funding_outpoint().txid)
8415
8452
} else {
@@ -9391,7 +9428,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
9391
9428
9392
9429
// Now that we're past error-generating stuff, update our local state:
9393
9430
9394
- self.context.channel_state = ChannelState::FundingNegotiated;
9431
+ self.context.channel_state = ChannelState::FundingNegotiated(FundingNegotiatedFlags::new()) ;
9395
9432
self.context.channel_id = ChannelId::v1_from_funding_outpoint(funding_txo);
9396
9433
9397
9434
// If the funding transaction is a coinbase transaction, we need to set the minimum depth to 100.
@@ -9508,7 +9545,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
9508
9545
if !self.funding.is_outbound() {
9509
9546
return Err((self, ChannelError::close("Received funding_signed for an inbound channel?".to_owned())));
9510
9547
}
9511
- if !matches!(self.context.channel_state, ChannelState::FundingNegotiated) {
9548
+ if !matches!(self.context.channel_state, ChannelState::FundingNegotiated(_) ) {
9512
9549
return Err((self, ChannelError::close("Received funding_signed in strange state!".to_owned())));
9513
9550
}
9514
9551
let mut holder_commitment_point = match self.unfunded_context.holder_commitment_point {
@@ -11236,11 +11273,12 @@ mod tests {
11236
11273
#[test]
11237
11274
fn test_channel_state_order() {
11238
11275
use crate::ln::channel::NegotiatingFundingFlags;
11276
+ use crate::ln::channel::FundingNegotiatedFlags;
11239
11277
use crate::ln::channel::AwaitingChannelReadyFlags;
11240
11278
use crate::ln::channel::ChannelReadyFlags;
11241
11279
11242
- assert!(ChannelState::NegotiatingFunding(NegotiatingFundingFlags::new()) < ChannelState::FundingNegotiated);
11243
- assert!(ChannelState::FundingNegotiated < ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new()));
11280
+ assert!(ChannelState::NegotiatingFunding(NegotiatingFundingFlags::new()) < ChannelState::FundingNegotiated(FundingNegotiatedFlags::new()) );
11281
+ assert!(ChannelState::FundingNegotiated(FundingNegotiatedFlags::new()) < ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new()));
11244
11282
assert!(ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new()) < ChannelState::ChannelReady(ChannelReadyFlags::new()));
11245
11283
assert!(ChannelState::ChannelReady(ChannelReadyFlags::new()) < ChannelState::ShutdownComplete);
11246
11284
}
0 commit comments