@@ -9121,9 +9121,9 @@ where
9121
9121
}
9122
9122
9123
9123
if msg.next_local_commitment_number >= INITIAL_COMMITMENT_NUMBER || msg.next_remote_commitment_number >= INITIAL_COMMITMENT_NUMBER ||
9124
- (msg.next_local_commitment_number == 0 && msg.next_funding_txid .is_none()) {
9124
+ (msg.next_local_commitment_number == 0 && msg.next_funding .is_none()) {
9125
9125
// Note: This also covers the following case in the V2 channel establishment specification:
9126
- // if `next_funding_txid ` is not set, and `next_commitment_number` is zero:
9126
+ // if `next_funding ` is not set, and `next_commitment_number` is zero:
9127
9127
// MUST immediately fail the channel and broadcast any relevant latest commitment transaction.
9128
9128
return Err(ChannelError::close("Peer sent an invalid channel_reestablish to force close in a non-standard way".to_owned()));
9129
9129
}
@@ -9174,34 +9174,135 @@ where
9174
9174
9175
9175
let announcement_sigs = self.get_announcement_sigs(node_signer, chain_hash, user_config, best_block.height, logger);
9176
9176
9177
+ let mut commitment_update = None;
9178
+ let mut tx_signatures = None;
9179
+ let mut tx_abort = None;
9180
+
9181
+ // if next_funding is set:
9182
+ if let Some(next_funding) = &msg.next_funding {
9183
+ // - if `next_funding` matches the latest interactive funding transaction
9184
+ // or the current channel funding transaction:
9185
+ if let Some(session) = &self.interactive_tx_signing_session {
9186
+ let our_next_funding_txid = session.unsigned_tx().compute_txid();
9187
+ if our_next_funding_txid != next_funding.txid {
9188
+ return Err(ChannelError::close(format!(
9189
+ "Unexpected next_funding txid: {}; expected: {}",
9190
+ next_funding.txid, our_next_funding_txid,
9191
+ )));
9192
+ }
9193
+
9194
+ if !session.has_received_commitment_signed() {
9195
+ self.context.expecting_peer_commitment_signed = true;
9196
+ }
9197
+
9198
+ // TODO(splicing): Add comment for spec requirements
9199
+ if next_funding.should_retransmit(msgs::NextFundingFlag::CommitmentSigned) {
9200
+ #[cfg(splicing)]
9201
+ let funding = self
9202
+ .pending_splice
9203
+ .as_ref()
9204
+ .and_then(|pending_splice| pending_splice.funding_negotiation.as_ref())
9205
+ .and_then(|funding_negotiation| {
9206
+ if let FundingNegotiation::AwaitingSignatures(funding) = &funding_negotiation {
9207
+ Some(funding)
9208
+ } else {
9209
+ None
9210
+ }
9211
+ })
9212
+ .or_else(|| Some(&self.funding))
9213
+ .filter(|funding| funding.get_funding_txid() == Some(next_funding.txid))
9214
+ .ok_or_else(|| {
9215
+ let message = "Failed to find funding for new commitment_signed".to_owned();
9216
+ ChannelError::Close(
9217
+ (
9218
+ message.clone(),
9219
+ ClosureReason::HolderForceClosed { message, broadcasted_latest_txn: Some(false) },
9220
+ )
9221
+ )
9222
+ })?;
9223
+ #[cfg(not(splicing))]
9224
+ let funding = &self.funding;
9225
+
9226
+ let commitment_signed = self.context.get_initial_commitment_signed_v2(&funding, logger)
9227
+ // TODO(splicing): Support async signing
9228
+ .ok_or_else(|| {
9229
+ let message = "Failed to get signatures for new commitment_signed".to_owned();
9230
+ ChannelError::Close(
9231
+ (
9232
+ message.clone(),
9233
+ ClosureReason::HolderForceClosed { message, broadcasted_latest_txn: Some(false) },
9234
+ )
9235
+ )
9236
+ })?;
9237
+
9238
+ commitment_update = Some(msgs::CommitmentUpdate {
9239
+ commitment_signed: vec![commitment_signed],
9240
+ update_add_htlcs: vec![],
9241
+ update_fulfill_htlcs: vec![],
9242
+ update_fail_htlcs: vec![],
9243
+ update_fail_malformed_htlcs: vec![],
9244
+ update_fee: None,
9245
+ });
9246
+ }
9247
+
9248
+ // - if it has already received `commitment_signed` and it should sign first
9249
+ // - MUST send its `tx_signatures` for that funding transaction.
9250
+ //
9251
+ // - if it has already received `tx_signatures` for that funding transaction:
9252
+ // - MUST send its `tx_signatures` for that funding transaction.
9253
+ if (session.has_received_commitment_signed() && session.holder_sends_tx_signatures_first())
9254
+ || self.context.channel_state.is_their_tx_signatures_sent()
9255
+ {
9256
+ // If `holder_tx_signatures` is `None` here, the `tx_signatures` message will be sent
9257
+ // when the holder provides their witnesses as this will queue a `tx_signatures` if the
9258
+ // holder must send one.
9259
+ if session.holder_tx_signatures().is_none() {
9260
+ log_debug!(logger, "Waiting for funding transaction signatures to be provided");
9261
+ } else if self.context.channel_state.is_monitor_update_in_progress() {
9262
+ log_debug!(logger, "Waiting for monitor update before providing funding transaction signatures");
9263
+ } else {
9264
+ tx_signatures = session.holder_tx_signatures().clone();
9265
+ }
9266
+ }
9267
+ } else {
9268
+ // We'll just send a `tx_abort` here if we don't have a signing session for this channel
9269
+ // on reestablish and tell our peer to just forget about it.
9270
+ // Our peer is doing something strange, but it doesn't warrant closing the channel.
9271
+ tx_abort = Some(msgs::TxAbort {
9272
+ channel_id: self.context.channel_id(),
9273
+ data:
9274
+ "No active signing session. The associated funding transaction may have already been broadcast.".as_bytes().to_vec() });
9275
+ }
9276
+ }
9277
+
9177
9278
if matches!(self.context.channel_state, ChannelState::AwaitingChannelReady(_)) {
9178
9279
// If we're waiting on a monitor update, we shouldn't re-send any channel_ready's.
9179
9280
if !self.context.channel_state.is_our_channel_ready() ||
9180
9281
self.context.channel_state.is_monitor_update_in_progress() {
9181
9282
if msg.next_remote_commitment_number != 0 {
9182
9283
return Err(ChannelError::close("Peer claimed they saw a revoke_and_ack but we haven't sent channel_ready yet".to_owned()));
9183
9284
}
9184
- // Short circuit the whole handler as there is nothing we can resend them
9285
+
9185
9286
return Ok(ReestablishResponses {
9186
9287
channel_ready: None,
9187
- channel_ready_order: ChannelReadyOrder::ChannelReadyFirst ,
9188
- raa: None, commitment_update: None ,
9189
- commitment_order: RAACommitmentOrder::CommitmentFirst ,
9288
+ channel_ready_order: ChannelReadyOrder::SignaturesFirst ,
9289
+ raa: None, commitment_update,
9290
+ commitment_order: self.context.resend_order.clone() ,
9190
9291
shutdown_msg, announcement_sigs,
9191
- tx_signatures: None ,
9292
+ tx_signatures,
9192
9293
tx_abort: None,
9193
9294
});
9194
9295
}
9195
9296
9196
9297
// We have OurChannelReady set!
9197
9298
return Ok(ReestablishResponses {
9198
9299
channel_ready: self.get_channel_ready(logger),
9199
- channel_ready_order: ChannelReadyOrder::ChannelReadyFirst ,
9200
- raa: None, commitment_update: None ,
9201
- commitment_order: RAACommitmentOrder::CommitmentFirst ,
9300
+ channel_ready_order: ChannelReadyOrder::SignaturesFirst ,
9301
+ raa: None, commitment_update,
9302
+ commitment_order: self.context.resend_order.clone() ,
9202
9303
shutdown_msg, announcement_sigs,
9203
- tx_signatures: None ,
9204
- tx_abort: None ,
9304
+ tx_signatures,
9305
+ tx_abort,
9205
9306
});
9206
9307
}
9207
9308
@@ -9244,88 +9345,6 @@ where
9244
9345
log_debug!(logger, "Reconnected channel {} with no loss", &self.context.channel_id());
9245
9346
}
9246
9347
9247
- // if next_funding_txid is set:
9248
- let (commitment_update, tx_signatures, tx_abort) = if let Some(next_funding_txid) = msg.next_funding_txid {
9249
- if let Some(session) = &self.interactive_tx_signing_session {
9250
- // if next_funding_txid matches the latest interactive funding transaction:
9251
- let our_next_funding_txid = session.unsigned_tx().compute_txid();
9252
- if our_next_funding_txid == next_funding_txid {
9253
- debug_assert_eq!(session.unsigned_tx().compute_txid(), self.maybe_get_next_funding_txid().unwrap());
9254
-
9255
- let commitment_update = if !self.context.channel_state.is_their_tx_signatures_sent() && msg.next_local_commitment_number == 0 {
9256
- // if it has not received tx_signatures for that funding transaction AND
9257
- // if next_commitment_number is zero:
9258
- // MUST retransmit its commitment_signed for that funding transaction.
9259
- let commitment_signed = self.context.get_initial_commitment_signed_v2(&self.funding, logger)
9260
- // TODO(splicing): Support async signing
9261
- .ok_or_else(|| {
9262
- let message = "Failed to get signatures for new commitment_signed".to_owned();
9263
- ChannelError::Close(
9264
- (
9265
- message.clone(),
9266
- ClosureReason::HolderForceClosed { message, broadcasted_latest_txn: Some(false) },
9267
- )
9268
- )})?;
9269
- Some(msgs::CommitmentUpdate {
9270
- commitment_signed: vec![commitment_signed],
9271
- update_add_htlcs: vec![],
9272
- update_fulfill_htlcs: vec![],
9273
- update_fail_htlcs: vec![],
9274
- update_fail_malformed_htlcs: vec![],
9275
- update_fee: None,
9276
- })
9277
- } else { None };
9278
- let tx_signatures = if (
9279
- // if it has not received tx_signatures for that funding transaction AND
9280
- // if it has already received commitment_signed AND it should sign first, as specified in the tx_signatures requirements:
9281
- // MUST send its tx_signatures for that funding transaction.
9282
- !self.context.channel_state.is_their_tx_signatures_sent() && session.has_received_commitment_signed() && session.holder_sends_tx_signatures_first()
9283
- // else if it has already received tx_signatures for that funding transaction:
9284
- // MUST send its tx_signatures for that funding transaction.
9285
- ) || self.context.channel_state.is_their_tx_signatures_sent() {
9286
- // If `holder_tx_signatures` is `None` here, the `tx_signatures` message will be sent
9287
- // when the holder provides their witnesses as this will queue a `tx_signatures` if the
9288
- // holder must send one.
9289
- if session.holder_tx_signatures().is_none() {
9290
- log_debug!(logger, "Waiting for funding transaction signatures to be provided");
9291
- None
9292
- } else if self.context.channel_state.is_monitor_update_in_progress() {
9293
- log_debug!(logger, "Waiting for monitor update before providing funding transaction signatures");
9294
- None
9295
- } else {
9296
- session.holder_tx_signatures().clone()
9297
- }
9298
- } else {
9299
- None
9300
- };
9301
- if !session.has_received_commitment_signed() {
9302
- self.context.expecting_peer_commitment_signed = true;
9303
- }
9304
- (commitment_update, tx_signatures, None)
9305
- } else {
9306
- // The `next_funding_txid` does not match the latest interactive funding transaction so we
9307
- // MUST send tx_abort to let the remote know that they can forget this funding transaction.
9308
- (None, None, Some(msgs::TxAbort {
9309
- channel_id: self.context.channel_id(),
9310
- data: format!(
9311
- "next_funding_txid {} does match our latest interactive funding txid {}",
9312
- next_funding_txid, our_next_funding_txid,
9313
- ).into_bytes() }))
9314
- }
9315
- } else {
9316
- // We'll just send a `tx_abort` here if we don't have a signing session for this channel
9317
- // on reestablish and tell our peer to just forget about it.
9318
- // Our peer is doing something strange, but it doesn't warrant closing the channel.
9319
- (None, None, Some(msgs::TxAbort {
9320
- channel_id: self.context.channel_id(),
9321
- data:
9322
- "No active signing session. The associated funding transaction may have already been broadcast.".as_bytes().to_vec() }))
9323
- }
9324
- } else {
9325
- // Don't send anything related to interactive signing if `next_funding_txid` is not set.
9326
- (None, None, None)
9327
- };
9328
-
9329
9348
Ok(ReestablishResponses {
9330
9349
channel_ready,
9331
9350
channel_ready_order: ChannelReadyOrder::SignaturesFirst,
@@ -9338,6 +9357,12 @@ where
9338
9357
tx_abort,
9339
9358
})
9340
9359
} else if msg.next_local_commitment_number == next_counterparty_commitment_number - 1 {
9360
+ debug_assert!(commitment_update.is_none());
9361
+
9362
+ // TODO(splicing): Assert in a test that we don't retransmit tx_signatures instead
9363
+ #[cfg(test)]
9364
+ assert!(tx_signatures.is_none());
9365
+
9341
9366
if required_revoke.is_some() || self.context.signer_pending_revoke_and_ack {
9342
9367
log_debug!(logger, "Reconnected channel {} with lost outbound RAA and lost remote commitment tx", &self.context.channel_id());
9343
9368
} else {
@@ -9353,7 +9378,7 @@ where
9353
9378
commitment_update: None, raa: None,
9354
9379
commitment_order: self.context.resend_order.clone(),
9355
9380
tx_signatures: None,
9356
- tx_abort: None ,
9381
+ tx_abort,
9357
9382
})
9358
9383
} else {
9359
9384
let commitment_update = if self.context.resend_order == RAACommitmentOrder::RevokeAndACKFirst
@@ -9379,7 +9404,7 @@ where
9379
9404
raa, commitment_update,
9380
9405
commitment_order: self.context.resend_order.clone(),
9381
9406
tx_signatures: None,
9382
- tx_abort: None ,
9407
+ tx_abort,
9383
9408
})
9384
9409
}
9385
9410
} else if msg.next_local_commitment_number < next_counterparty_commitment_number {
@@ -10971,15 +10996,29 @@ where
10971
10996
}
10972
10997
10973
10998
#[rustfmt::skip]
10974
- fn maybe_get_next_funding_txid (&self) -> Option<Txid > {
10999
+ fn maybe_get_next_funding (&self) -> Option<msgs::NextFunding > {
10975
11000
// If we've sent `commtiment_signed` for an interactively constructed transaction
10976
- // during a signing session, but have not received `tx_signatures` we MUST set `next_funding_txid `
11001
+ // during a signing session, but have not received `tx_signatures` we MUST set `next_funding `
10977
11002
// to the txid of that interactive transaction, else we MUST NOT set it.
10978
11003
if self.context.channel_state.is_interactive_signing() {
10979
11004
// Since we have a signing_session, this implies we've sent an initial `commitment_signed`...
10980
11005
if !self.context.channel_state.is_their_tx_signatures_sent() {
10981
11006
// ...but we didn't receive a `tx_signatures` from the counterparty yet.
10982
- self.interactive_tx_signing_session.as_ref().map(|signing_session| signing_session.unsigned_tx().compute_txid())
11007
+ self.interactive_tx_signing_session
11008
+ .as_ref()
11009
+ .map(|signing_session| {
11010
+ let mut next_funding = msgs::NextFunding {
11011
+ txid: signing_session.unsigned_tx().compute_txid(),
11012
+ retransmit_flags: 0,
11013
+ };
11014
+
11015
+ // TODO(splicing): Add comment for spec requirements
11016
+ if !signing_session.has_received_commitment_signed() {
11017
+ next_funding.retransmit(msgs::NextFundingFlag::CommitmentSigned);
11018
+ }
11019
+
11020
+ next_funding
11021
+ })
10983
11022
} else {
10984
11023
// ...and we received a `tx_signatures` from the counterparty.
10985
11024
None
@@ -11056,7 +11095,7 @@ where
11056
11095
next_remote_commitment_number: INITIAL_COMMITMENT_NUMBER - self.context.counterparty_next_commitment_transaction_number - 1,
11057
11096
your_last_per_commitment_secret: remote_last_secret,
11058
11097
my_current_per_commitment_point: dummy_pubkey,
11059
- next_funding_txid : self.maybe_get_next_funding_txid (),
11098
+ next_funding : self.maybe_get_next_funding (),
11060
11099
my_current_funding_locked: self.maybe_get_my_current_funding_locked(),
11061
11100
}
11062
11101
}
0 commit comments