Pull out regenerating RAA/CS in channel_reestablish handling
[rust-lightning] / src / ln / channel.rs
index 992807493e8d78b05b5649423df602055f96f332..b5fa5c04c05ba60b721eee5dee1cc5b7b4d2f611 100644 (file)
@@ -2082,6 +2082,71 @@ impl Channel {
                Ok(())
        }
 
+       fn get_last_revoke_and_ack(&self) -> msgs::RevokeAndACK {
+               let next_per_commitment_point = PublicKey::from_secret_key(&self.secp_ctx, &self.build_local_commitment_secret(self.cur_local_commitment_transaction_number));
+               let per_commitment_secret = chan_utils::build_commitment_secret(self.local_keys.commitment_seed, self.cur_local_commitment_transaction_number + 2);
+               msgs::RevokeAndACK {
+                       channel_id: self.channel_id,
+                       per_commitment_secret,
+                       next_per_commitment_point,
+               }
+       }
+
+       fn get_last_commitment_update(&self) -> msgs::CommitmentUpdate {
+               let mut update_add_htlcs = Vec::new();
+               let mut update_fulfill_htlcs = Vec::new();
+               let mut update_fail_htlcs = Vec::new();
+               let mut update_fail_malformed_htlcs = Vec::new();
+
+               for htlc in self.pending_outbound_htlcs.iter() {
+                       if let &OutboundHTLCState::LocalAnnounced(ref onion_packet) = &htlc.state {
+                               update_add_htlcs.push(msgs::UpdateAddHTLC {
+                                       channel_id: self.channel_id(),
+                                       htlc_id: htlc.htlc_id,
+                                       amount_msat: htlc.amount_msat,
+                                       payment_hash: htlc.payment_hash,
+                                       cltv_expiry: htlc.cltv_expiry,
+                                       onion_routing_packet: (**onion_packet).clone(),
+                               });
+                       }
+               }
+
+               for htlc in self.pending_inbound_htlcs.iter() {
+                       if let &InboundHTLCState::LocalRemoved(ref reason) = &htlc.state {
+                               match reason {
+                                       &InboundHTLCRemovalReason::FailRelay(ref err_packet) => {
+                                               update_fail_htlcs.push(msgs::UpdateFailHTLC {
+                                                       channel_id: self.channel_id(),
+                                                       htlc_id: htlc.htlc_id,
+                                                       reason: err_packet.clone()
+                                               });
+                                       },
+                                       &InboundHTLCRemovalReason::FailMalformed((ref sha256_of_onion, ref failure_code)) => {
+                                               update_fail_malformed_htlcs.push(msgs::UpdateFailMalformedHTLC {
+                                                       channel_id: self.channel_id(),
+                                                       htlc_id: htlc.htlc_id,
+                                                       sha256_of_onion: sha256_of_onion.clone(),
+                                                       failure_code: failure_code.clone(),
+                                               });
+                                       },
+                                       &InboundHTLCRemovalReason::Fulfill(ref payment_preimage) => {
+                                               update_fulfill_htlcs.push(msgs::UpdateFulfillHTLC {
+                                                       channel_id: self.channel_id(),
+                                                       htlc_id: htlc.htlc_id,
+                                                       payment_preimage: payment_preimage.clone(),
+                                               });
+                                       },
+                               }
+                       }
+               }
+
+               msgs::CommitmentUpdate {
+                       update_add_htlcs, update_fulfill_htlcs, update_fail_htlcs, update_fail_malformed_htlcs,
+                       update_fee: None, //TODO: We need to support re-generating any update_fees in the last commitment_signed!
+                       commitment_signed: self.send_commitment_no_state_update().expect("It looks like we failed to re-generate a commitment_signed we had previously sent?").0,
+               }
+       }
+
        /// May panic if some calls other than message-handling calls (which will all Err immediately)
        /// have been called between remove_uncommitted_htlcs_and_mark_paused and this call.
        pub fn channel_reestablish(&mut self, msg: &msgs::ChannelReestablish) -> Result<(Option<msgs::FundingLocked>, Option<msgs::RevokeAndACK>, Option<msgs::CommitmentUpdate>, Option<ChannelMonitor>, RAACommitmentOrder), ChannelError> {
@@ -2106,13 +2171,7 @@ impl Channel {
                        // Note that if we need to repeat our FundingLocked we'll do that in the next if block.
                        None
                } else if msg.next_remote_commitment_number == (INITIAL_COMMITMENT_NUMBER - 1) - self.cur_local_commitment_transaction_number {
-                       let next_per_commitment_point = PublicKey::from_secret_key(&self.secp_ctx, &self.build_local_commitment_secret(self.cur_local_commitment_transaction_number));
-                       let per_commitment_secret = chan_utils::build_commitment_secret(self.local_keys.commitment_seed, self.cur_local_commitment_transaction_number + 2);
-                       Some(msgs::RevokeAndACK {
-                               channel_id: self.channel_id,
-                               per_commitment_secret,
-                               next_per_commitment_point,
-                       })
+                       Some(self.get_last_revoke_and_ack())
                } else {
                        return Err(ChannelError::Close("Peer attempted to reestablish channel with a very old local commitment transaction"));
                };
@@ -2172,59 +2231,8 @@ impl Channel {
                        } else {
                                log_debug!(self, "Reconnected channel {} with only lost remote commitment tx", log_bytes!(self.channel_id()));
                        }
-                       let mut update_add_htlcs = Vec::new();
-                       let mut update_fulfill_htlcs = Vec::new();
-                       let mut update_fail_htlcs = Vec::new();
-                       let mut update_fail_malformed_htlcs = Vec::new();
-
-                       for htlc in self.pending_outbound_htlcs.iter() {
-                               if let &OutboundHTLCState::LocalAnnounced(ref onion_packet) = &htlc.state {
-                                       update_add_htlcs.push(msgs::UpdateAddHTLC {
-                                               channel_id: self.channel_id(),
-                                               htlc_id: htlc.htlc_id,
-                                               amount_msat: htlc.amount_msat,
-                                               payment_hash: htlc.payment_hash,
-                                               cltv_expiry: htlc.cltv_expiry,
-                                               onion_routing_packet: (**onion_packet).clone(),
-                                       });
-                               }
-                       }
-
-                       for htlc in self.pending_inbound_htlcs.iter() {
-                               if let &InboundHTLCState::LocalRemoved(ref reason) = &htlc.state {
-                                       match reason {
-                                               &InboundHTLCRemovalReason::FailRelay(ref err_packet) => {
-                                                       update_fail_htlcs.push(msgs::UpdateFailHTLC {
-                                                               channel_id: self.channel_id(),
-                                                               htlc_id: htlc.htlc_id,
-                                                               reason: err_packet.clone()
-                                                       });
-                                               },
-                                               &InboundHTLCRemovalReason::FailMalformed((ref sha256_of_onion, ref failure_code)) => {
-                                                       update_fail_malformed_htlcs.push(msgs::UpdateFailMalformedHTLC {
-                                                               channel_id: self.channel_id(),
-                                                               htlc_id: htlc.htlc_id,
-                                                               sha256_of_onion: sha256_of_onion.clone(),
-                                                               failure_code: failure_code.clone(),
-                                                       });
-                                               },
-                                               &InboundHTLCRemovalReason::Fulfill(ref payment_preimage) => {
-                                                       update_fulfill_htlcs.push(msgs::UpdateFulfillHTLC {
-                                                               channel_id: self.channel_id(),
-                                                               htlc_id: htlc.htlc_id,
-                                                               payment_preimage: payment_preimage.clone(),
-                                                       });
-                                               },
-                                       }
-                               }
-                       }
 
-                       return Ok((resend_funding_locked, required_revoke,
-                                       Some(msgs::CommitmentUpdate {
-                                               update_add_htlcs, update_fulfill_htlcs, update_fail_htlcs, update_fail_malformed_htlcs,
-                                               update_fee: None, //TODO: We need to support re-generating any update_fees in the last commitment_signed!
-                                               commitment_signed: self.send_commitment_no_state_update().expect("It looks like we failed to re-generate a commitment_signed we had previously sent?").0,
-                                       }), None, order));
+                       return Ok((resend_funding_locked, required_revoke, Some(self.get_last_commitment_update()), None, order));
                } else {
                        return Err(ChannelError::Close("Peer attempted to reestablish channel with a very old remote commitment transaction"));
                }