@@ -434,6 +434,12 @@ macro_rules! define_state_flags {
434
434
is_remote_shutdown_sent, set_remote_shutdown_sent, clear_remote_shutdown_sent);
435
435
define_state_flags!($flag_type, FundedStateFlags::LOCAL_SHUTDOWN_SENT,
436
436
is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent);
437
+ define_state_flags!($flag_type, FundedStateFlags::INTERACTIVE_SIGNING,
438
+ is_interactive_signing, set_interactive_signing, clear_interactive_signing);
439
+ define_state_flags!($flag_type, FundedStateFlags::THEIR_TX_SIGNATURES_SENT,
440
+ is_their_tx_signatures_sent, set_their_tx_signatures_sent, clear_their_tx_signatures_sent);
441
+ define_state_flags!($flag_type, FundedStateFlags::OUR_TX_SIGNATURES_SENT,
442
+ is_our_tx_signatures_sent, set_our_tx_signatures_sent, clear_our_tx_signatures_sent);
437
443
438
444
impl core::ops::BitOr<FundedStateFlags> for $flag_type {
439
445
type Output = Self;
@@ -479,6 +485,9 @@ mod state_flags {
479
485
pub const LOCAL_STFU_SENT: u32 = 1 << 15;
480
486
pub const REMOTE_STFU_SENT: u32 = 1 << 16;
481
487
pub const QUIESCENT: u32 = 1 << 17;
488
+ pub const INTERACTIVE_SIGNING: u32 = 1 << 18;
489
+ pub const OUR_TX_SIGNATURES_SENT: u32 = 1 << 19;
490
+ pub const THEIR_TX_SIGNATURES_SENT: u32 = 1 << 20;
482
491
}
483
492
484
493
define_state_flags!(
@@ -497,7 +506,16 @@ define_state_flags!(
497
506
is_remote_shutdown_sent, set_remote_shutdown_sent, clear_remote_shutdown_sent),
498
507
("Indicates we sent a `shutdown` message. At this point, we may not add any new HTLCs to \
499
508
the channel.", LOCAL_SHUTDOWN_SENT, state_flags::LOCAL_SHUTDOWN_SENT,
500
- is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent)
509
+ is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent),
510
+ ("Indicates we have an active interactive signing session for an interactive transaction",
511
+ INTERACTIVE_SIGNING, state_flags::INTERACTIVE_SIGNING,
512
+ is_interactive_signing, set_interactive_signing, clear_interactive_singing),
513
+ ("Indicates they sent us a `tx_signatures` message.",
514
+ THEIR_TX_SIGNATURES_SENT, state_flags::THEIR_TX_SIGNATURES_SENT,
515
+ is_their_tx_signatures_sent, set_their_tx_signatures_sent, clear_their_tx_signatures_sent),
516
+ ("Indicates we sent them a `tx_signatures` message.",
517
+ OUR_TX_SIGNATURES_SENT, state_flags::OUR_TX_SIGNATURES_SENT,
518
+ is_our_tx_signatures_sent, set_our_tx_signatures_sent, clear_our_tx_signatures_sent)
501
519
]
502
520
);
503
521
@@ -568,7 +586,8 @@ 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.
589
+ /// `funding_signed` upon receipt of `funding_created`, so simply skip this state. For dual-funded (V2)
590
+ /// channels, this state is also skipped.
572
591
FundingNegotiated,
573
592
/// We've received/sent `funding_created` and `funding_signed` and are thus now waiting on the
574
593
/// funding transaction to confirm.
@@ -685,6 +704,9 @@ impl ChannelState {
685
704
impl_state_flag!(is_monitor_update_in_progress, set_monitor_update_in_progress, clear_monitor_update_in_progress, FUNDED_STATES);
686
705
impl_state_flag!(is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent, FUNDED_STATES);
687
706
impl_state_flag!(is_remote_shutdown_sent, set_remote_shutdown_sent, clear_remote_shutdown_sent, FUNDED_STATES);
707
+ impl_state_flag!(is_interactive_signing, set_interactive_signing, clear_interactive_signing, FUNDED_STATES);
708
+ impl_state_flag!(is_our_tx_signatures_sent, set_our_tx_signatures_sent, clear_our_tx_signatures_sent, FUNDED_STATES);
709
+ impl_state_flag!(is_their_tx_signatures_sent, set_their_tx_signatures_sent, clear_their_tx_signatures_sent, FUNDED_STATES);
688
710
impl_state_flag!(is_our_channel_ready, set_our_channel_ready, clear_our_channel_ready, AwaitingChannelReady);
689
711
impl_state_flag!(is_their_channel_ready, set_their_channel_ready, clear_their_channel_ready, AwaitingChannelReady);
690
712
impl_state_flag!(is_waiting_for_batch, set_waiting_for_batch, clear_waiting_for_batch, AwaitingChannelReady);
@@ -2094,10 +2116,12 @@ trait InitialRemoteCommitmentReceiver<SP: Deref> where SP::Target: SignerProvide
2094
2116
context.channel_id = channel_id;
2095
2117
2096
2118
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());
2119
+ if !context.channel_state.is_interactive_signing() {
2120
+ if context.is_batch_funding() {
2121
+ context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::WAITING_FOR_BATCH);
2122
+ } else {
2123
+ context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2124
+ }
2101
2125
}
2102
2126
if holder_commitment_point.advance(&context.holder_signer, &context.secp_ctx, logger).is_err() {
2103
2127
// We only fail to advance our commitment point/number if we're currently
@@ -2358,7 +2382,9 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
2358
2382
)));
2359
2383
};
2360
2384
2361
- self.context.channel_state = ChannelState::FundingNegotiated;
2385
+ let mut channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2386
+ channel_state.set_interactive_signing();
2387
+ self.context.channel_state = channel_state;
2362
2388
2363
2389
// Clear the interactive transaction constructor
2364
2390
self.interactive_tx_constructor.take();
@@ -4441,7 +4467,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
4441
4467
ChannelState::FundingNegotiated => f(),
4442
4468
ChannelState::AwaitingChannelReady(flags) =>
4443
4469
if flags.is_set(AwaitingChannelReadyFlags::WAITING_FOR_BATCH) ||
4444
- flags.is_set(FundedStateFlags::MONITOR_UPDATE_IN_PROGRESS.into())
4470
+ flags.is_set(FundedStateFlags::MONITOR_UPDATE_IN_PROGRESS.into()) ||
4471
+ (flags.is_set(FundedStateFlags::THEIR_TX_SIGNATURES_SENT.into()) && flags.is_set(FundedStateFlags::OUR_TX_SIGNATURES_SENT.into()))
4445
4472
{
4446
4473
f()
4447
4474
} else {
@@ -5648,7 +5675,7 @@ impl<SP: Deref> FundedChannel<SP> where
5648
5675
) -> Result<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>, ChannelError>
5649
5676
where L::Target: Logger
5650
5677
{
5651
- if !matches!(self.context.channel_state, ChannelState::FundingNegotiated ) {
5678
+ if !matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(_) ) {
5652
5679
return Err(ChannelError::Close(
5653
5680
(
5654
5681
"Received initial commitment_signed before funding transaction constructed!".to_owned(),
@@ -5666,7 +5693,6 @@ impl<SP: Deref> FundedChannel<SP> where
5666
5693
log_info!(logger, "Received initial commitment_signed from peer for channel {}", &self.context.channel_id());
5667
5694
5668
5695
let need_channel_ready = self.check_get_channel_ready(0, logger).is_some();
5669
- self.context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
5670
5696
self.monitor_updating_paused(false, false, need_channel_ready, Vec::new(), Vec::new(), Vec::new());
5671
5697
5672
5698
if let Some(tx_signatures) = self.interactive_tx_signing_session.as_mut().and_then(
@@ -6256,7 +6282,7 @@ impl<SP: Deref> FundedChannel<SP> where
6256
6282
pub fn tx_signatures<L: Deref>(&mut self, msg: &msgs::TxSignatures, logger: &L) -> Result<Option<msgs::TxSignatures>, ChannelError>
6257
6283
where L::Target: Logger
6258
6284
{
6259
- if !matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(_ )) {
6285
+ if !matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(flags) if flags.is_interactive_signing( )) {
6260
6286
return Err(ChannelError::close("Received tx_signatures in strange state!".to_owned()));
6261
6287
}
6262
6288
@@ -6293,6 +6319,8 @@ impl<SP: Deref> FundedChannel<SP> where
6293
6319
let (holder_tx_signatures_opt, funding_tx_opt) = signing_session.received_tx_signatures(msg.clone())
6294
6320
.map_err(|_| ChannelError::Warn("Witness count did not match contributed input count".to_string()))?;
6295
6321
6322
+ // Set `THEIR_TX_SIGNATURES_SENT` flag after all potential errors.
6323
+ self.context.channel_state.set_their_tx_signatures_sent();
6296
6324
6297
6325
if funding_tx_opt.is_some() {
6298
6326
// We have a finalized funding transaction, so we can set the funding transaction and reset the
@@ -6307,6 +6335,10 @@ impl<SP: Deref> FundedChannel<SP> where
6307
6335
return Ok(None);
6308
6336
}
6309
6337
6338
+ if holder_tx_signatures_opt.is_some() {
6339
+ self.context.channel_state.set_our_tx_signatures_sent();
6340
+ }
6341
+
6310
6342
Ok(holder_tx_signatures_opt)
6311
6343
} else {
6312
6344
Err(ChannelError::Close((
@@ -6529,7 +6561,7 @@ impl<SP: Deref> FundedChannel<SP> where
6529
6561
// first received the funding_signed.
6530
6562
let mut funding_broadcastable = None;
6531
6563
if let Some(funding_transaction) = &self.funding.funding_transaction {
6532
- if (self.funding.is_outbound() || self.is_v2_established()) &&
6564
+ if (self.funding.is_outbound() || ( self.is_v2_established() && self.context.channel_state.is_their_tx_signatures_sent() )) &&
6533
6565
(matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(flags) if !flags.is_set(AwaitingChannelReadyFlags::WAITING_FOR_BATCH)) ||
6534
6566
matches!(self.context.channel_state, ChannelState::ChannelReady(_)))
6535
6567
{
@@ -6567,6 +6599,9 @@ impl<SP: Deref> FundedChannel<SP> where
6567
6599
// MonitorUpdateInProgress (and we assume the user will never directly broadcast the funding
6568
6600
// transaction and waits for us to do it).
6569
6601
let tx_signatures = self.context.monitor_pending_tx_signatures.take();
6602
+ if tx_signatures.is_some() {
6603
+ self.context.channel_state.set_our_tx_signatures_sent();
6604
+ }
6570
6605
6571
6606
if self.context.channel_state.is_peer_disconnected() {
6572
6607
self.context.monitor_pending_revoke_and_ack = false;
@@ -7035,7 +7070,7 @@ impl<SP: Deref> FundedChannel<SP> where
7035
7070
if session.unsigned_tx().compute_txid() == next_funding_txid {
7036
7071
debug_assert_eq!(session.unsigned_tx().compute_txid(), self.maybe_get_next_funding_txid().unwrap());
7037
7072
7038
- let commitment_update = if !session.counterparty_sent_tx_signatures () && msg.next_local_commitment_number == 0 {
7073
+ let commitment_update = if !self.context.channel_state.is_their_tx_signatures_sent () && msg.next_local_commitment_number == 0 {
7039
7074
// if it has not received tx_signatures for that funding transaction AND
7040
7075
// if next_commitment_number is zero:
7041
7076
// MUST retransmit its commitment_signed for that funding transaction.
@@ -7054,10 +7089,10 @@ impl<SP: Deref> FundedChannel<SP> where
7054
7089
// MUST send its tx_signatures for that funding transaction.
7055
7090
// else if it HAS received commitment_signed AND has received tx_signatures for that funding transaction:
7056
7091
// MUST send its tx_signatures for that funding transaction.
7057
- let tx_signatures = if session.has_received_commitment_signed( ) && ((
7058
- !session.counterparty_sent_tx_signatures () &&
7092
+ let tx_signatures = if (our_commitment_transaction == INITIAL_COMMITMENT_NUMBER - 1 ) && ((
7093
+ !self.context.channel_state.is_their_tx_signatures_sent () &&
7059
7094
session.holder_sends_tx_signatures_first()
7060
- ) || session.counterparty_sent_tx_signatures ()) {
7095
+ ) || self.context.channel_state.is_their_tx_signatures_sent ()) {
7061
7096
// This should have already been set in `commitment_signed_initial_v2`, but check again
7062
7097
// just in case.
7063
7098
if self.context.channel_state.is_monitor_update_in_progress() {
@@ -7073,7 +7108,7 @@ impl<SP: Deref> FundedChannel<SP> where
7073
7108
session.holder_tx_signatures().clone()
7074
7109
}
7075
7110
} else {
7076
- if !session.has_received_commitment_signed() {
7111
+ if our_commitment_transaction == INITIAL_COMMITMENT_NUMBER - 1 {
7077
7112
self.context.expecting_peer_commitment_signed = true;
7078
7113
}
7079
7114
None
@@ -8429,9 +8464,9 @@ impl<SP: Deref> FundedChannel<SP> where
8429
8464
// If we've sent `commtiment_signed` for an interactively constructed transaction
8430
8465
// during a signing session, but have not received `tx_signatures` we MUST set `next_funding_txid`
8431
8466
// to the txid of that interactive transaction, else we MUST NOT set it.
8432
- if let Some(signing_session) = & self.interactive_tx_signing_session {
8467
+ if self.context.channel_state.is_interactive_signing() {
8433
8468
// Since we have a signing_session, this implies we've sent an initial `commitment_signed`...
8434
- if !signing_session.counterparty_sent_tx_signatures () {
8469
+ if !self.context.channel_state.is_their_tx_signatures_sent () {
8435
8470
// ...but we didn't receive a `tx_signatures` from the counterparty yet.
8436
8471
Some(self.funding_outpoint().txid)
8437
8472
} else {
@@ -10612,6 +10647,7 @@ impl<SP: Deref> Writeable for FundedChannel<SP> where SP::Target: SignerProvider
10612
10647
(49, self.context.local_initiated_shutdown, option), // Added in 0.0.122
10613
10648
(51, is_manual_broadcast, option), // Added in 0.0.124
10614
10649
(53, funding_tx_broadcast_safe_event_emitted, option), // Added in 0.0.124
10650
+ (55, self.interactive_tx_signing_session, option) // Added in 0.2
10615
10651
});
10616
10652
10617
10653
Ok(())
@@ -10891,6 +10927,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
10891
10927
let mut next_holder_commitment_point_opt: Option<PublicKey> = None;
10892
10928
let mut is_manual_broadcast = None;
10893
10929
10930
+ let mut interactive_tx_signing_session: Option<InteractiveTxSigningSession> = None;
10931
+
10894
10932
read_tlv_fields!(reader, {
10895
10933
(0, announcement_sigs, option),
10896
10934
(1, minimum_depth, option),
@@ -10926,6 +10964,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
10926
10964
(49, local_initiated_shutdown, option),
10927
10965
(51, is_manual_broadcast, option),
10928
10966
(53, funding_tx_broadcast_safe_event_emitted, option),
10967
+ (55, interactive_tx_signing_session, option),
10929
10968
});
10930
10969
10931
10970
let holder_signer = signer_provider.derive_channel_signer(channel_keys_id);
@@ -11048,6 +11087,15 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
11048
11087
&channel_parameters.counterparty_parameters.as_ref()
11049
11088
.expect("Persisted channel must have counterparty parameters").pubkeys.revocation_basepoint);
11050
11089
11090
+ let interactive_tx_signing_session = if channel_state.is_interactive_signing() {
11091
+ interactive_tx_signing_session.zip(funding_transaction.as_ref()).map(|(mut session, funding_tx)| {
11092
+ session.update_from_funding_tx_after_read(funding_tx);
11093
+ session
11094
+ })
11095
+ } else {
11096
+ None
11097
+ };
11098
+
11051
11099
Ok(FundedChannel {
11052
11100
funding: FundingScope {
11053
11101
value_to_self_msat,
@@ -11180,7 +11228,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
11180
11228
11181
11229
is_holder_quiescence_initiator: None,
11182
11230
},
11183
- interactive_tx_signing_session: None ,
11231
+ interactive_tx_signing_session,
11184
11232
is_v2_established,
11185
11233
holder_commitment_point,
11186
11234
#[cfg(splicing)]
0 commit comments