@@ -432,6 +432,12 @@ macro_rules! define_state_flags {
432
432
is_remote_shutdown_sent, set_remote_shutdown_sent, clear_remote_shutdown_sent);
433
433
define_state_flags!($flag_type, FundedStateFlags::LOCAL_SHUTDOWN_SENT,
434
434
is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent);
435
+ define_state_flags!($flag_type, FundedStateFlags::INTERACTIVE_SIGNING,
436
+ is_interactive_signing, set_interactive_signing, clear_interactive_signing);
437
+ define_state_flags!($flag_type, FundedStateFlags::THEIR_TX_SIGNATURES_SENT,
438
+ is_their_tx_signatures_sent, set_their_tx_signatures_sent, clear_their_tx_signatures_sent);
439
+ define_state_flags!($flag_type, FundedStateFlags::OUR_TX_SIGNATURES_SENT,
440
+ is_our_tx_signatures_sent, set_our_tx_signatures_sent, clear_our_tx_signatures_sent);
435
441
436
442
impl core::ops::BitOr<FundedStateFlags> for $flag_type {
437
443
type Output = Self;
@@ -477,6 +483,9 @@ mod state_flags {
477
483
pub const LOCAL_STFU_SENT: u32 = 1 << 15;
478
484
pub const REMOTE_STFU_SENT: u32 = 1 << 16;
479
485
pub const QUIESCENT: u32 = 1 << 17;
486
+ pub const INTERACTIVE_SIGNING: u32 = 1 << 18;
487
+ pub const OUR_TX_SIGNATURES_SENT: u32 = 1 << 19;
488
+ pub const THEIR_TX_SIGNATURES_SENT: u32 = 1 << 20;
480
489
}
481
490
482
491
define_state_flags!(
@@ -495,7 +504,16 @@ define_state_flags!(
495
504
is_remote_shutdown_sent, set_remote_shutdown_sent, clear_remote_shutdown_sent),
496
505
("Indicates we sent a `shutdown` message. At this point, we may not add any new HTLCs to \
497
506
the channel.", LOCAL_SHUTDOWN_SENT, state_flags::LOCAL_SHUTDOWN_SENT,
498
- is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent)
507
+ is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent),
508
+ ("Indicates we have an active interactive signing session for an interactive transaction",
509
+ INTERACTIVE_SIGNING, state_flags::INTERACTIVE_SIGNING,
510
+ is_interactive_signing, set_interactive_signing, clear_interactive_singing),
511
+ ("Indicates they sent us a `tx_signatures` message.",
512
+ THEIR_TX_SIGNATURES_SENT, state_flags::THEIR_TX_SIGNATURES_SENT,
513
+ is_their_tx_signatures_sent, set_their_tx_signatures_sent, clear_their_tx_signatures_sent),
514
+ ("Indicates we sent them a `tx_signatures` message.",
515
+ OUR_TX_SIGNATURES_SENT, state_flags::OUR_TX_SIGNATURES_SENT,
516
+ is_our_tx_signatures_sent, set_our_tx_signatures_sent, clear_our_tx_signatures_sent)
499
517
]
500
518
);
501
519
@@ -566,7 +584,8 @@ enum ChannelState {
566
584
NegotiatingFunding(NegotiatingFundingFlags),
567
585
/// We have sent `funding_created` and are awaiting a `funding_signed` to advance to
568
586
/// `AwaitingChannelReady`. Note that this is nonsense for an inbound channel as we immediately generate
569
- /// `funding_signed` upon receipt of `funding_created`, so simply skip this state.
587
+ /// `funding_signed` upon receipt of `funding_created`, so simply skip this state. For dual-funded (V2)
588
+ /// channels, this state is also skipped.
570
589
FundingNegotiated,
571
590
/// We've received/sent `funding_created` and `funding_signed` and are thus now waiting on the
572
591
/// funding transaction to confirm.
@@ -683,6 +702,9 @@ impl ChannelState {
683
702
impl_state_flag!(is_monitor_update_in_progress, set_monitor_update_in_progress, clear_monitor_update_in_progress, FUNDED_STATES);
684
703
impl_state_flag!(is_local_shutdown_sent, set_local_shutdown_sent, clear_local_shutdown_sent, FUNDED_STATES);
685
704
impl_state_flag!(is_remote_shutdown_sent, set_remote_shutdown_sent, clear_remote_shutdown_sent, FUNDED_STATES);
705
+ impl_state_flag!(is_interactive_signing, set_interactive_signing, clear_interactive_signing, FUNDED_STATES);
706
+ impl_state_flag!(is_our_tx_signatures_sent, set_our_tx_signatures_sent, clear_our_tx_signatures_sent, FUNDED_STATES);
707
+ impl_state_flag!(is_their_tx_signatures_sent, set_their_tx_signatures_sent, clear_their_tx_signatures_sent, FUNDED_STATES);
686
708
impl_state_flag!(is_our_channel_ready, set_our_channel_ready, clear_our_channel_ready, AwaitingChannelReady);
687
709
impl_state_flag!(is_their_channel_ready, set_their_channel_ready, clear_their_channel_ready, AwaitingChannelReady);
688
710
impl_state_flag!(is_waiting_for_batch, set_waiting_for_batch, clear_waiting_for_batch, AwaitingChannelReady);
@@ -2084,10 +2106,15 @@ trait InitialRemoteCommitmentReceiver<SP: Deref> where SP::Target: SignerProvide
2084
2106
context.channel_id = channel_id;
2085
2107
2086
2108
assert!(!context.channel_state.is_monitor_update_in_progress()); // We have not had any monitor(s) yet to fail update!
2087
- if context.is_batch_funding() {
2088
- context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::WAITING_FOR_BATCH);
2089
- } else {
2090
- context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2109
+ if !matches!(
2110
+ context.channel_state,
2111
+ ChannelState::AwaitingChannelReady(flags) if flags.is_set(FundedStateFlags::INTERACTIVE_SIGNING.into())
2112
+ ) {
2113
+ if context.is_batch_funding() {
2114
+ context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::WAITING_FOR_BATCH);
2115
+ } else {
2116
+ context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2117
+ }
2091
2118
}
2092
2119
if holder_commitment_point.advance(&context.holder_signer, &context.secp_ctx, logger).is_err() {
2093
2120
// We only fail to advance our commitment point/number if we're currently
@@ -2348,7 +2375,9 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
2348
2375
)));
2349
2376
};
2350
2377
2351
- self.context.channel_state = ChannelState::FundingNegotiated;
2378
+ let mut channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
2379
+ channel_state.set_interactive_signing();
2380
+ self.context.channel_state = channel_state;
2352
2381
2353
2382
// Clear the interactive transaction constructor
2354
2383
self.interactive_tx_constructor.take();
@@ -4289,7 +4318,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
4289
4318
ChannelState::FundingNegotiated => f(),
4290
4319
ChannelState::AwaitingChannelReady(flags) =>
4291
4320
if flags.is_set(AwaitingChannelReadyFlags::WAITING_FOR_BATCH) ||
4292
- flags.is_set(FundedStateFlags::MONITOR_UPDATE_IN_PROGRESS.into())
4321
+ flags.is_set(FundedStateFlags::MONITOR_UPDATE_IN_PROGRESS.into()) ||
4322
+ (flags.is_set(FundedStateFlags::THEIR_TX_SIGNATURES_SENT.into()) && flags.is_set(FundedStateFlags::OUR_TX_SIGNATURES_SENT.into()))
4293
4323
{
4294
4324
f()
4295
4325
} else {
@@ -5440,7 +5470,7 @@ impl<SP: Deref> FundedChannel<SP> where
5440
5470
) -> Result<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>, ChannelError>
5441
5471
where L::Target: Logger
5442
5472
{
5443
- if !matches!(self.context.channel_state, ChannelState::FundingNegotiated ) {
5473
+ if !matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(_) ) {
5444
5474
return Err(ChannelError::Close(
5445
5475
(
5446
5476
"Received initial commitment_signed before funding transaction constructed!".to_owned(),
@@ -5458,7 +5488,6 @@ impl<SP: Deref> FundedChannel<SP> where
5458
5488
log_info!(logger, "Received initial commitment_signed from peer for channel {}", &self.context.channel_id());
5459
5489
5460
5490
let need_channel_ready = self.check_get_channel_ready(0, logger).is_some();
5461
- self.context.channel_state = ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::new());
5462
5491
self.monitor_updating_paused(false, false, need_channel_ready, Vec::new(), Vec::new(), Vec::new());
5463
5492
5464
5493
if let Some(tx_signatures) = self.interactive_tx_signing_session.as_mut().and_then(
@@ -6156,7 +6185,7 @@ impl<SP: Deref> FundedChannel<SP> where
6156
6185
pub fn tx_signatures<L: Deref>(&mut self, msg: &msgs::TxSignatures, logger: &L) -> Result<Option<msgs::TxSignatures>, ChannelError>
6157
6186
where L::Target: Logger
6158
6187
{
6159
- if !matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(_ )) {
6188
+ if !matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(flags) if flags.is_interactive_signing( )) {
6160
6189
return Err(ChannelError::close("Received tx_signatures in strange state!".to_owned()));
6161
6190
}
6162
6191
@@ -6201,6 +6230,12 @@ impl<SP: Deref> FundedChannel<SP> where
6201
6230
self.interactive_tx_signing_session = None;
6202
6231
}
6203
6232
6233
+ if holder_tx_signatures_opt.is_some() {
6234
+ // We set our tx_signatures as sent even if we're waiting for initial monitor persist as
6235
+ // we'll eventually send them after persist.
6236
+ self.context.channel_state.set_our_tx_signatures_sent();
6237
+ }
6238
+
6204
6239
if holder_tx_signatures_opt.is_some() && self.is_awaiting_initial_mon_persist() {
6205
6240
log_debug!(logger, "Not sending tx_signatures: a monitor update is in progress. Setting monitor_pending_tx_signatures.");
6206
6241
self.context.monitor_pending_tx_signatures = holder_tx_signatures_opt;
@@ -10348,6 +10383,7 @@ impl<SP: Deref> Writeable for FundedChannel<SP> where SP::Target: SignerProvider
10348
10383
(49, self.context.local_initiated_shutdown, option), // Added in 0.0.122
10349
10384
(51, is_manual_broadcast, option), // Added in 0.0.124
10350
10385
(53, funding_tx_broadcast_safe_event_emitted, option), // Added in 0.0.124
10386
+ (55, self.interactive_tx_signing_session, option) // Added in 0.2
10351
10387
});
10352
10388
10353
10389
Ok(())
@@ -10636,6 +10672,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
10636
10672
let mut next_holder_commitment_point_opt: Option<PublicKey> = None;
10637
10673
let mut is_manual_broadcast = None;
10638
10674
10675
+ let mut interactive_tx_signing_session: Option<InteractiveTxSigningSession> = None;
10676
+
10639
10677
read_tlv_fields!(reader, {
10640
10678
(0, announcement_sigs, option),
10641
10679
(1, minimum_depth, option),
@@ -10671,6 +10709,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
10671
10709
(49, local_initiated_shutdown, option),
10672
10710
(51, is_manual_broadcast, option),
10673
10711
(53, funding_tx_broadcast_safe_event_emitted, option),
10712
+ (55, interactive_tx_signing_session, option),
10674
10713
});
10675
10714
10676
10715
let (channel_keys_id, holder_signer) = if let Some(channel_keys_id) = channel_keys_id {
@@ -10800,6 +10839,24 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
10800
10839
&channel_parameters.counterparty_parameters.as_ref()
10801
10840
.expect("Persisted channel must have counterparty parameters").pubkeys.revocation_basepoint);
10802
10841
10842
+ let interactive_tx_signing_session = if matches!(
10843
+ channel_state,
10844
+ ChannelState::AwaitingChannelReady(flags) if flags.is_set(FundedStateFlags::INTERACTIVE_SIGNING.into())
10845
+ ) {
10846
+ if let Some(mut signing_session) = interactive_tx_signing_session {
10847
+ if let Some(ref funding_tx) = funding_transaction {
10848
+ signing_session.update_from_funding_tx_after_read(funding_tx);
10849
+ Some(signing_session)
10850
+ } else {
10851
+ None
10852
+ }
10853
+ } else {
10854
+ None
10855
+ }
10856
+ } else {
10857
+ None
10858
+ };
10859
+
10803
10860
Ok(FundedChannel {
10804
10861
funding: FundingScope {
10805
10862
value_to_self_msat,
@@ -10932,7 +10989,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
10932
10989
10933
10990
is_holder_quiescence_initiator: None,
10934
10991
},
10935
- interactive_tx_signing_session: None ,
10992
+ interactive_tx_signing_session,
10936
10993
is_v2_established,
10937
10994
holder_commitment_point,
10938
10995
})
0 commit comments