@@ -906,8 +906,10 @@ pub(super) struct MonitorRestoreUpdates {
906906#[allow(unused)]
907907pub(super) struct SignerResumeUpdates {
908908 pub commitment_update: Option<msgs::CommitmentUpdate>,
909+ pub revoke_and_ack: Option<msgs::RevokeAndACK>,
909910 pub funding_signed: Option<msgs::FundingSigned>,
910911 pub channel_ready: Option<msgs::ChannelReady>,
912+ pub order: RAACommitmentOrder,
911913}
912914
913915/// The return value of `channel_reestablish`
@@ -1215,6 +1217,14 @@ pub(super) struct ChannelContext<SP: Deref> where SP::Target: SignerProvider {
12151217 monitor_pending_finalized_fulfills: Vec<HTLCSource>,
12161218 monitor_pending_update_adds: Vec<msgs::UpdateAddHTLC>,
12171219
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,
12181228 /// If we went to send a commitment update (ie some messages then [`msgs::CommitmentSigned`])
12191229 /// but our signer (initially) refused to give us a signature, we should retry at some point in
12201230 /// 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 {
16831693 monitor_pending_finalized_fulfills: Vec::new(),
16841694 monitor_pending_update_adds: Vec::new(),
16851695
1696+ signer_pending_revoke_and_ack: false,
16861697 signer_pending_commitment_update: false,
16871698 signer_pending_funding: false,
16881699
@@ -1908,6 +1919,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
19081919 monitor_pending_finalized_fulfills: Vec::new(),
19091920 monitor_pending_update_adds: Vec::new(),
19101921
1922+ signer_pending_revoke_and_ack: false,
19111923 signer_pending_commitment_update: false,
19121924 signer_pending_funding: false,
19131925
@@ -5376,34 +5388,57 @@ impl<SP: Deref> Channel<SP> where
53765388 /// blocked.
53775389 #[cfg(async_signing)]
53785390 pub fn signer_maybe_unblocked<L: Deref>(&mut self, logger: &L) -> SignerResumeUpdates where L::Target: Logger {
5379- let commitment_update = if self.context.signer_pending_commitment_update {
5380- self.get_last_commitment_update_for_send(logger).ok()
5381- } else { None };
53825391 let funding_signed = if self.context.signer_pending_funding && !self.context.is_outbound() {
53835392 self.context.get_funding_signed_msg(logger).1
53845393 } else { None };
53855394 let channel_ready = if funding_signed.is_some() {
53865395 self.check_get_channel_ready(0, logger)
53875396 } else { None };
53885397
5389- log_trace!(logger, "Signer unblocked with {} commitment_update, {} funding_signed and {} channel_ready",
5398+ let mut commitment_update = if self.context.signer_pending_commitment_update {
5399+ log_trace!(logger, "Attempting to generate pending commitment update...");
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+ 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",
53905421 if commitment_update.is_some() { "a" } else { "no" },
5422+ if revoke_and_ack.is_some() { "a" } else { "no" },
53915423 if funding_signed.is_some() { "a" } else { "no" },
53925424 if channel_ready.is_some() { "a" } else { "no" });
53935425
53945426 SignerResumeUpdates {
53955427 commitment_update,
5428+ revoke_and_ack,
53965429 funding_signed,
53975430 channel_ready,
5431+ order: self.context.resend_order.clone(),
53985432 }
53995433 }
54005434
5401- fn get_last_revoke_and_ack(&self) -> msgs::RevokeAndACK {
5435+ fn get_last_revoke_and_ack(&mut self) -> msgs::RevokeAndACK {
54025436 debug_assert!(self.context.holder_commitment_point.transaction_number() <= INITIAL_COMMITMENT_NUMBER + 2);
54035437 // TODO: handle non-available case when get_per_commitment_point becomes async
54045438 debug_assert!(self.context.holder_commitment_point.is_available());
54055439 let next_per_commitment_point = self.context.holder_commitment_point.current_point();
54065440 let per_commitment_secret = self.context.holder_signer.as_ref().release_commitment_secret(self.context.holder_commitment_point.transaction_number() + 2);
5441+ self.context.signer_pending_revoke_and_ack = false;
54075442 msgs::RevokeAndACK {
54085443 channel_id: self.context.channel_id,
54095444 per_commitment_secret,
@@ -9279,6 +9314,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
92799314 monitor_pending_finalized_fulfills: monitor_pending_finalized_fulfills.unwrap(),
92809315 monitor_pending_update_adds: monitor_pending_update_adds.unwrap_or(Vec::new()),
92819316
9317+ signer_pending_revoke_and_ack: false,
92829318 signer_pending_commitment_update: false,
92839319 signer_pending_funding: false,
92849320
0 commit comments