@@ -1074,6 +1074,8 @@ pub(super) struct ReestablishResponses {
10741074 pub order: RAACommitmentOrder,
10751075 pub announcement_sigs: Option<msgs::AnnouncementSignatures>,
10761076 pub shutdown_msg: Option<msgs::Shutdown>,
1077+ pub tx_signatures: Option<msgs::TxSignatures>,
1078+ pub tx_abort: Option<msgs::TxAbort>,
10771079}
10781080
10791081/// The first message we send to our peer after connection
@@ -2540,7 +2542,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
25402542
25412543 let mut output_index = None;
25422544 let expected_spk = self.funding.get_funding_redeemscript().to_p2wsh();
2543- for (idx, outp) in signing_session.unsigned_tx.outputs().enumerate() {
2545+ for (idx, outp) in signing_session.unsigned_tx() .outputs().enumerate() {
25442546 if outp.script_pubkey() == &expected_spk && outp.value() == self.funding.get_value_satoshis() {
25452547 if output_index.is_some() {
25462548 return Err(ChannelError::Close(
@@ -2553,7 +2555,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
25532555 }
25542556 }
25552557 let outpoint = if let Some(output_index) = output_index {
2556- OutPoint { txid: signing_session.unsigned_tx.compute_txid(), index: output_index }
2558+ OutPoint { txid: signing_session.unsigned_tx() .compute_txid(), index: output_index }
25572559 } else {
25582560 return Err(ChannelError::Close(
25592561 (
@@ -2567,7 +2569,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
25672569 let commitment_signed = self.context.get_initial_commitment_signed(&self.funding, logger);
25682570 let commitment_signed = match commitment_signed {
25692571 Ok(commitment_signed) => {
2570- self.funding.funding_transaction = Some(signing_session.unsigned_tx.build_unsigned_tx());
2572+ self.funding.funding_transaction = Some(signing_session.unsigned_tx() .build_unsigned_tx());
25712573 commitment_signed
25722574 },
25732575 Err(err) => {
@@ -6543,7 +6545,7 @@ impl<SP: Deref> FundedChannel<SP> where
65436545 }
65446546
65456547 if let Some(ref mut signing_session) = self.interactive_tx_signing_session {
6546- if msg.tx_hash != signing_session.unsigned_tx.compute_txid() {
6548+ if msg.tx_hash != signing_session.unsigned_tx() .compute_txid() {
65476549 return Err(ChannelError::Close(
65486550 (
65496551 "The txid for the transaction does not match".to_string(),
@@ -7193,7 +7195,10 @@ impl<SP: Deref> FundedChannel<SP> where
71937195 }
71947196
71957197 if msg.next_local_commitment_number >= INITIAL_COMMITMENT_NUMBER || msg.next_remote_commitment_number >= INITIAL_COMMITMENT_NUMBER ||
7196- msg.next_local_commitment_number == 0 {
7198+ (msg.next_local_commitment_number == 0 && msg.next_funding_txid.is_none()) {
7199+ // Note: This also covers the following case in the V2 channel establishment specification:
7200+ // if `next_funding_txid` is not set, and `next_commitment_number` is zero:
7201+ // MUST immediately fail the channel and broadcast any relevant latest commitment transaction.
71977202 return Err(ChannelError::close("Peer sent an invalid channel_reestablish to force close in a non-standard way".to_owned()));
71987203 }
71997204
@@ -7257,6 +7262,8 @@ impl<SP: Deref> FundedChannel<SP> where
72577262 raa: None, commitment_update: None,
72587263 order: RAACommitmentOrder::CommitmentFirst,
72597264 shutdown_msg, announcement_sigs,
7265+ tx_signatures: None,
7266+ tx_abort: None,
72607267 });
72617268 }
72627269
@@ -7266,6 +7273,8 @@ impl<SP: Deref> FundedChannel<SP> where
72667273 raa: None, commitment_update: None,
72677274 order: RAACommitmentOrder::CommitmentFirst,
72687275 shutdown_msg, announcement_sigs,
7276+ tx_signatures: None,
7277+ tx_abort: None,
72697278 });
72707279 }
72717280
@@ -7308,11 +7317,84 @@ impl<SP: Deref> FundedChannel<SP> where
73087317 log_debug!(logger, "Reconnected channel {} with no loss", &self.context.channel_id());
73097318 }
73107319
7320+ // if next_funding_txid is set:
7321+ let (commitment_update, tx_signatures, tx_abort) = if let Some(next_funding_txid) = msg.next_funding_txid {
7322+ if let Some(session) = &self.interactive_tx_signing_session {
7323+ // if next_funding_txid matches the latest interactive funding transaction:
7324+ let our_next_funding_txid = session.unsigned_tx().compute_txid();
7325+ if our_next_funding_txid == next_funding_txid {
7326+ debug_assert_eq!(session.unsigned_tx().compute_txid(), self.maybe_get_next_funding_txid().unwrap());
7327+
7328+ let commitment_update = if !session.has_received_tx_signatures() && msg.next_local_commitment_number == 0 {
7329+ // if it has not received tx_signatures for that funding transaction AND
7330+ // if next_commitment_number is zero:
7331+ // MUST retransmit its commitment_signed for that funding transaction.
7332+ let commitment_signed = self.context.get_initial_commitment_signed(&self.funding, logger)?;
7333+ Some(msgs::CommitmentUpdate {
7334+ commitment_signed: vec![commitment_signed],
7335+ update_add_htlcs: vec![],
7336+ update_fulfill_htlcs: vec![],
7337+ update_fail_htlcs: vec![],
7338+ update_fail_malformed_htlcs: vec![],
7339+ update_fee: None,
7340+ })
7341+ } else { None };
7342+ // TODO(dual_funding): For async signing support we need to hold back `tx_signatures` until the `commitment_signed` is ready.
7343+ let tx_signatures = if (
7344+ // if it has not received tx_signatures for that funding transaction AND
7345+ // if it has already received commitment_signed AND it should sign first, as specified in the tx_signatures requirements:
7346+ // MUST send its tx_signatures for that funding transaction.
7347+ !session.has_received_tx_signatures() && session.has_received_commitment_signed() && session.holder_sends_tx_signatures_first()
7348+ // else if it has already received tx_signatures for that funding transaction:
7349+ // MUST send its tx_signatures for that funding transaction.
7350+ ) || session.has_received_tx_signatures() {
7351+ if self.context.channel_state.is_monitor_update_in_progress() {
7352+ // The `monitor_pending_tx_signatures` field should have already been set in `commitment_signed_initial_v2`
7353+ // if we were up first for signing and had a monitor update in progress, but check again just in case.
7354+ debug_assert!(self.context.monitor_pending_tx_signatures.is_some(), "monitor_pending_tx_signatures should already be set");
7355+ log_debug!(logger, "Not sending tx_signatures: a monitor update is in progress. Setting monitor_pending_tx_signatures.");
7356+ if self.context.monitor_pending_tx_signatures.is_none() {
7357+ self.context.monitor_pending_tx_signatures = session.holder_tx_signatures().clone();
7358+ }
7359+ None
7360+ } else {
7361+ // If `holder_tx_signatures` is `None` here, the `tx_signatures` message will be sent
7362+ // when the holder provides their witnesses as this will queue a `tx_signatures` if the
7363+ // holder must send one.
7364+ session.holder_tx_signatures().clone()
7365+ }
7366+ } else {
7367+ None
7368+ };
7369+ if !session.has_received_commitment_signed() {
7370+ self.context.expecting_peer_commitment_signed = true;
7371+ }
7372+ (commitment_update, tx_signatures, None)
7373+ } else {
7374+ // The `next_funding_txid` does not match the latest interactive funding transaction so we
7375+ // MUST send tx_abort to let the remote know that they can forget this funding transaction.
7376+ (None, None, Some(msgs::TxAbort {
7377+ channel_id: self.context.channel_id(),
7378+ data: format!(
7379+ "next_funding_txid {} does match our latest interactive funding txid {}",
7380+ next_funding_txid, our_next_funding_txid,
7381+ ).into_bytes() }))
7382+ }
7383+ } else {
7384+ return Err(ChannelError::Warn("No active signing session. The associated funding transaction may have already been broadcast.".into()));
7385+ }
7386+ } else {
7387+ // Don't send anything related to interactive signing if `next_funding_txid` is not set.
7388+ (None, None, None)
7389+ };
7390+
73117391 Ok(ReestablishResponses {
73127392 channel_ready, shutdown_msg, announcement_sigs,
73137393 raa: required_revoke,
7314- commitment_update: None ,
7394+ commitment_update,
73157395 order: self.context.resend_order.clone(),
7396+ tx_signatures,
7397+ tx_abort,
73167398 })
73177399 } else if msg.next_local_commitment_number == next_counterparty_commitment_number - 1 {
73187400 if required_revoke.is_some() || self.context.signer_pending_revoke_and_ack {
@@ -7327,6 +7409,8 @@ impl<SP: Deref> FundedChannel<SP> where
73277409 channel_ready, shutdown_msg, announcement_sigs,
73287410 commitment_update: None, raa: None,
73297411 order: self.context.resend_order.clone(),
7412+ tx_signatures: None,
7413+ tx_abort: None,
73307414 })
73317415 } else {
73327416 let commitment_update = if self.context.resend_order == RAACommitmentOrder::RevokeAndACKFirst
@@ -7349,6 +7433,8 @@ impl<SP: Deref> FundedChannel<SP> where
73497433 channel_ready, shutdown_msg, announcement_sigs,
73507434 raa, commitment_update,
73517435 order: self.context.resend_order.clone(),
7436+ tx_signatures: None,
7437+ tx_abort: None,
73527438 })
73537439 }
73547440 } else if msg.next_local_commitment_number < next_counterparty_commitment_number {
@@ -8636,9 +8722,9 @@ impl<SP: Deref> FundedChannel<SP> where
86368722 // to the txid of that interactive transaction, else we MUST NOT set it.
86378723 if let Some(signing_session) = &self.interactive_tx_signing_session {
86388724 // Since we have a signing_session, this implies we've sent an initial `commitment_signed`...
8639- if !signing_session.counterparty_sent_tx_signatures {
8725+ if !signing_session.has_received_tx_signatures() {
86408726 // ...but we didn't receive a `tx_signatures` from the counterparty yet.
8641- Some(self.funding_outpoint ().txid )
8727+ Some(signing_session.unsigned_tx ().compute_txid() )
86428728 } else {
86438729 // ...and we received a `tx_signatures` from the counterparty.
86448730 None
0 commit comments