@@ -906,8 +906,10 @@ pub(super) struct MonitorRestoreUpdates {
906
906
#[allow(unused)]
907
907
pub(super) struct SignerResumeUpdates {
908
908
pub commitment_update: Option<msgs::CommitmentUpdate>,
909
+ pub revoke_and_ack: Option<msgs::RevokeAndACK>,
909
910
pub funding_signed: Option<msgs::FundingSigned>,
910
911
pub channel_ready: Option<msgs::ChannelReady>,
912
+ pub order: RAACommitmentOrder,
911
913
}
912
914
913
915
/// The return value of `channel_reestablish`
@@ -1215,6 +1217,14 @@ pub(super) struct ChannelContext<SP: Deref> where SP::Target: SignerProvider {
1215
1217
monitor_pending_finalized_fulfills: Vec<HTLCSource>,
1216
1218
monitor_pending_update_adds: Vec<msgs::UpdateAddHTLC>,
1217
1219
1220
+ /// If we went to send a revoke_and_ack but our signer was unable to give us a signature,
1221
+ /// we should retry at some point in the future when the signer indicates it may have a
1222
+ /// signature for us.
1223
+ ///
1224
+ /// This may also be used to make sure we send a `revoke_and_ack` after a `commitment_signed`
1225
+ /// if we need to maintain ordering of messages, but are pending the signer on a previous
1226
+ /// message.
1227
+ signer_pending_revoke_and_ack: bool,
1218
1228
/// If we went to send a commitment update (ie some messages then [`msgs::CommitmentSigned`])
1219
1229
/// but our signer (initially) refused to give us a signature, we should retry at some point in
1220
1230
/// the future when the signer indicates it may have a signature for us.
@@ -1683,6 +1693,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
1683
1693
monitor_pending_finalized_fulfills: Vec::new(),
1684
1694
monitor_pending_update_adds: Vec::new(),
1685
1695
1696
+ signer_pending_revoke_and_ack: false,
1686
1697
signer_pending_commitment_update: false,
1687
1698
signer_pending_funding: false,
1688
1699
@@ -1908,6 +1919,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
1908
1919
monitor_pending_finalized_fulfills: Vec::new(),
1909
1920
monitor_pending_update_adds: Vec::new(),
1910
1921
1922
+ signer_pending_revoke_and_ack: false,
1911
1923
signer_pending_commitment_update: false,
1912
1924
signer_pending_funding: false,
1913
1925
@@ -5373,11 +5385,6 @@ impl<SP: Deref> Channel<SP> where
5373
5385
/// blocked.
5374
5386
#[cfg(async_signing)]
5375
5387
pub fn signer_maybe_unblocked<L: Deref>(&mut self, logger: &L) -> SignerResumeUpdates where L::Target: Logger {
5376
- let commitment_update = if self.context.signer_pending_commitment_update {
5377
- log_trace!(logger, "Attempting to generate pending commitment update...");
5378
- self.context.signer_pending_commitment_update = false;
5379
- self.get_last_commitment_update_for_send(logger).ok()
5380
- } else { None };
5381
5388
let funding_signed = if self.context.signer_pending_funding && !self.context.is_outbound() {
5382
5389
log_trace!(logger, "Attempting to generate pending funding signed...");
5383
5390
self.context.signer_pending_funding = false;
@@ -5387,15 +5394,42 @@ impl<SP: Deref> Channel<SP> where
5387
5394
self.check_get_channel_ready(0, logger)
5388
5395
} else { None };
5389
5396
5390
- log_trace!(logger, "Signer unblocked with {} commitment_update, {} funding_signed and {} channel_ready",
5397
+ let mut commitment_update = if self.context.signer_pending_commitment_update {
5398
+ log_trace!(logger, "Attempting to generate pending commitment update...");
5399
+ self.context.signer_pending_commitment_update = false;
5400
+ self.get_last_commitment_update_for_send(logger).ok()
5401
+ } else { None };
5402
+ let mut revoke_and_ack = if self.context.signer_pending_revoke_and_ack {
5403
+ log_trace!(logger, "Attempting to generate pending revoke and ack...");
5404
+ self.context.signer_pending_revoke_and_ack = false;
5405
+ Some(self.get_last_revoke_and_ack())
5406
+ } else { None };
5407
+
5408
+ if self.context.resend_order == RAACommitmentOrder::CommitmentFirst
5409
+ && self.context.signer_pending_commitment_update && revoke_and_ack.is_some() {
5410
+ log_trace!(logger, "Signer unblocked for revoke and ack, but unable to send due to resend order, waiting on signer for commitment update");
5411
+ self.context.signer_pending_revoke_and_ack = true;
5412
+ revoke_and_ack = None;
5413
+ }
5414
+ if self.context.resend_order == RAACommitmentOrder::RevokeAndACKFirst
5415
+ && self.context.signer_pending_revoke_and_ack && commitment_update.is_some() {
5416
+ log_trace!(logger, "Signer unblocked for commitment update, but unable to send due to resend order, waiting on signer for revoke and ack");
5417
+ self.context.signer_pending_commitment_update = true;
5418
+ commitment_update = None;
5419
+ }
5420
+
5421
+ log_trace!(logger, "Signer unblocked with {} commitment_update, {} revoke_and_ack, {} funding_signed and {} channel_ready",
5391
5422
if commitment_update.is_some() { "a" } else { "no" },
5423
+ if revoke_and_ack.is_some() { "a" } else { "no" },
5392
5424
if funding_signed.is_some() { "a" } else { "no" },
5393
5425
if channel_ready.is_some() { "a" } else { "no" });
5394
5426
5395
5427
SignerResumeUpdates {
5396
5428
commitment_update,
5429
+ revoke_and_ack,
5397
5430
funding_signed,
5398
5431
channel_ready,
5432
+ order: self.context.resend_order.clone(),
5399
5433
}
5400
5434
}
5401
5435
@@ -9272,6 +9306,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
9272
9306
monitor_pending_finalized_fulfills: monitor_pending_finalized_fulfills.unwrap(),
9273
9307
monitor_pending_update_adds: monitor_pending_update_adds.unwrap_or(Vec::new()),
9274
9308
9309
+ signer_pending_revoke_and_ack: false,
9275
9310
signer_pending_commitment_update: false,
9276
9311
signer_pending_funding: false,
9277
9312
0 commit comments