Remove last_block_connected from Channel
[rust-lightning] / lightning / src / ln / channel.rs
index 16d1a0f828c66e6156d02469ca2021eed11af226..0158448dd6dce2983944939c97fdf6b967001765 100644 (file)
@@ -39,7 +39,6 @@ use util::errors::APIError;
 use util::config::{UserConfig,ChannelConfig};
 
 use std;
-use std::default::Default;
 use std::{cmp,mem,fmt};
 use std::ops::Deref;
 #[cfg(any(test, feature = "fuzztarget"))]
@@ -368,9 +367,6 @@ pub(super) struct Channel<Signer: Sign> {
        /// could miss the funding_tx_confirmed_in block as well, but it serves as a useful fallback.
        funding_tx_confirmed_in: Option<BlockHash>,
        short_channel_id: Option<u64>,
-       /// Used to deduplicate block_connected callbacks, also used to verify consistency during
-       /// ChannelManager deserialization (hence pub(super))
-       pub(super) last_block_connected: BlockHash,
        funding_tx_confirmations: u64,
 
        counterparty_dust_limit_satoshis: u64,
@@ -569,7 +565,6 @@ impl<Signer: Sign> Channel<Signer> {
 
                        funding_tx_confirmed_in: None,
                        short_channel_id: None,
-                       last_block_connected: Default::default(),
                        funding_tx_confirmations: 0,
 
                        feerate_per_kw: feerate,
@@ -805,7 +800,6 @@ impl<Signer: Sign> Channel<Signer> {
 
                        funding_tx_confirmed_in: None,
                        short_channel_id: None,
-                       last_block_connected: Default::default(),
                        funding_tx_confirmations: 0,
 
                        feerate_per_kw: msg.feerate_per_kw,
@@ -3517,12 +3511,12 @@ impl<Signer: Sign> Channel<Signer> {
                                _ => true
                        }
                });
-               let non_shutdown_state = self.channel_state & (!MULTI_STATE_FLAGS);
-               if header.block_hash() != self.last_block_connected {
-                       if self.funding_tx_confirmations > 0 {
-                               self.funding_tx_confirmations += 1;
-                       }
+
+               if self.funding_tx_confirmations > 0 {
+                       self.funding_tx_confirmations += 1;
                }
+
+               let non_shutdown_state = self.channel_state & (!MULTI_STATE_FLAGS);
                if non_shutdown_state & !(ChannelState::TheirFundingLocked as u32) == ChannelState::FundingSent as u32 {
                        for &(index_in_block, tx) in txdata.iter() {
                                let funding_txo = self.get_funding_txo().unwrap();
@@ -3568,46 +3562,44 @@ impl<Signer: Sign> Channel<Signer> {
                                }
                        }
                }
-               if header.block_hash() != self.last_block_connected {
-                       self.last_block_connected = header.block_hash();
-                       self.update_time_counter = cmp::max(self.update_time_counter, header.time);
-                       if self.funding_tx_confirmations > 0 {
-                               if self.funding_tx_confirmations == self.minimum_depth as u64 {
-                                       let need_commitment_update = if non_shutdown_state == ChannelState::FundingSent as u32 {
-                                               self.channel_state |= ChannelState::OurFundingLocked as u32;
-                                               true
-                                       } else if non_shutdown_state == (ChannelState::FundingSent as u32 | ChannelState::TheirFundingLocked as u32) {
-                                               self.channel_state = ChannelState::ChannelFunded as u32 | (self.channel_state & MULTI_STATE_FLAGS);
-                                               self.update_time_counter += 1;
-                                               true
-                                       } else if non_shutdown_state == (ChannelState::FundingSent as u32 | ChannelState::OurFundingLocked as u32) {
-                                               // We got a reorg but not enough to trigger a force close, just update
-                                               // funding_tx_confirmed_in and return.
-                                               false
-                                       } else if self.channel_state < ChannelState::ChannelFunded as u32 {
-                                               panic!("Started confirming a channel in a state pre-FundingSent?: {}", self.channel_state);
+
+               self.update_time_counter = cmp::max(self.update_time_counter, header.time);
+               if self.funding_tx_confirmations > 0 {
+                       if self.funding_tx_confirmations == self.minimum_depth as u64 {
+                               let need_commitment_update = if non_shutdown_state == ChannelState::FundingSent as u32 {
+                                       self.channel_state |= ChannelState::OurFundingLocked as u32;
+                                       true
+                               } else if non_shutdown_state == (ChannelState::FundingSent as u32 | ChannelState::TheirFundingLocked as u32) {
+                                       self.channel_state = ChannelState::ChannelFunded as u32 | (self.channel_state & MULTI_STATE_FLAGS);
+                                       self.update_time_counter += 1;
+                                       true
+                               } else if non_shutdown_state == (ChannelState::FundingSent as u32 | ChannelState::OurFundingLocked as u32) {
+                                       // We got a reorg but not enough to trigger a force close, just update
+                                       // funding_tx_confirmed_in and return.
+                                       false
+                               } else if self.channel_state < ChannelState::ChannelFunded as u32 {
+                                       panic!("Started confirming a channel in a state pre-FundingSent?: {}", self.channel_state);
+                               } else {
+                                       // We got a reorg but not enough to trigger a force close, just update
+                                       // funding_tx_confirmed_in and return.
+                                       false
+                               };
+                               self.funding_tx_confirmed_in = Some(header.block_hash());
+
+                               //TODO: Note that this must be a duplicate of the previous commitment point they sent us,
+                               //as otherwise we will have a commitment transaction that they can't revoke (well, kinda,
+                               //they can by sending two revoke_and_acks back-to-back, but not really). This appears to be
+                               //a protocol oversight, but I assume I'm just missing something.
+                               if need_commitment_update {
+                                       if self.channel_state & (ChannelState::MonitorUpdateFailed as u32) == 0 {
+                                               let next_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
+                                               return Ok((Some(msgs::FundingLocked {
+                                                       channel_id: self.channel_id,
+                                                       next_per_commitment_point,
+                                               }), timed_out_htlcs));
                                        } else {
-                                               // We got a reorg but not enough to trigger a force close, just update
-                                               // funding_tx_confirmed_in and return.
-                                               false
-                                       };
-                                       self.funding_tx_confirmed_in = Some(self.last_block_connected);
-
-                                       //TODO: Note that this must be a duplicate of the previous commitment point they sent us,
-                                       //as otherwise we will have a commitment transaction that they can't revoke (well, kinda,
-                                       //they can by sending two revoke_and_acks back-to-back, but not really). This appears to be
-                                       //a protocol oversight, but I assume I'm just missing something.
-                                       if need_commitment_update {
-                                               if self.channel_state & (ChannelState::MonitorUpdateFailed as u32) == 0 {
-                                                       let next_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
-                                                       return Ok((Some(msgs::FundingLocked {
-                                                               channel_id: self.channel_id,
-                                                               next_per_commitment_point,
-                                                       }), timed_out_htlcs));
-                                               } else {
-                                                       self.monitor_pending_funding_locked = true;
-                                                       return Ok((None, timed_out_htlcs));
-                                               }
+                                               self.monitor_pending_funding_locked = true;
+                                               return Ok((None, timed_out_htlcs));
                                        }
                                }
                        }
@@ -3625,8 +3617,7 @@ impl<Signer: Sign> Channel<Signer> {
                                return true;
                        }
                }
-               self.last_block_connected = header.block_hash();
-               if Some(self.last_block_connected) == self.funding_tx_confirmed_in {
+               if Some(header.block_hash()) == self.funding_tx_confirmed_in {
                        self.funding_tx_confirmations = self.minimum_depth as u64 - 1;
                }
                false
@@ -4180,6 +4171,10 @@ impl<Signer: Sign> Channel<Signer> {
        /// Also returns the list of payment_hashes for channels which we can safely fail backwards
        /// immediately (others we will have to allow to time out).
        pub fn force_shutdown(&mut self, should_broadcast: bool) -> (Option<(OutPoint, ChannelMonitorUpdate)>, Vec<(HTLCSource, PaymentHash)>) {
+               // Note that we MUST only generate a monitor update that indicates force-closure - we're
+               // called during initialization prior to the chain_monitor in the encompassing ChannelManager
+               // being fully configured in some cases. Thus, its likely any monitor events we generate will
+               // be delayed in being processed! See the docs for `ChannelManagerReadArgs` for more.
                assert!(self.channel_state != ChannelState::ShutdownComplete as u32);
 
                // We go ahead and "free" any holding cell HTLCs or HTLCs we haven't yet committed to and
@@ -4431,8 +4426,6 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
 
                self.funding_tx_confirmed_in.write(writer)?;
                self.short_channel_id.write(writer)?;
-
-               self.last_block_connected.write(writer)?;
                self.funding_tx_confirmations.write(writer)?;
 
                self.counterparty_dust_limit_satoshis.write(writer)?;
@@ -4593,8 +4586,6 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
 
                let funding_tx_confirmed_in = Readable::read(reader)?;
                let short_channel_id = Readable::read(reader)?;
-
-               let last_block_connected = Readable::read(reader)?;
                let funding_tx_confirmations = Readable::read(reader)?;
 
                let counterparty_dust_limit_satoshis = Readable::read(reader)?;
@@ -4665,7 +4656,6 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
 
                        funding_tx_confirmed_in,
                        short_channel_id,
-                       last_block_connected,
                        funding_tx_confirmations,
 
                        counterparty_dust_limit_satoshis,