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