Add assertions for in-order block [dis]connection in ChannelManager
[rust-lightning] / lightning / src / ln / channelmanager.rs
index bb9dbaba774a37ce22c6b1a003cf6acb62a60714..997570ea31a8e27609b629d721b2e7746d08595f 100644 (file)
@@ -3302,6 +3302,16 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
 
                let _persistence_guard = PersistenceNotifierGuard::new(&self.total_consistency_lock, &self.persistence_notifier);
 
+
+               // This assertion should be enforced in tests, however we have a number of tests that
+               // were written before this requirement and do not meet it.
+               #[cfg(not(test))]
+               {
+                       assert_eq!(*self.last_block_hash.read().unwrap(), header.prev_blockhash,
+                               "Blocks must be connected in chain-order - the connected header must build on the last connected header");
+                       assert_eq!(self.latest_block_height.load(Ordering::Acquire) as u64, height as u64 - 1,
+                               "Blocks must be connected in chain-order - the connected header must build on the last connected header");
+               }
                self.latest_block_height.store(height as usize, Ordering::Release);
                *self.last_block_hash.write().unwrap() = block_hash;
 
@@ -3418,6 +3428,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
                // See the docs for `ChannelManagerReadArgs` for more.
                let _persistence_guard = PersistenceNotifierGuard::new(&self.total_consistency_lock, &self.persistence_notifier);
 
+               assert_eq!(*self.last_block_hash.read().unwrap(), header.block_hash(),
+                       "Blocks must be disconnected in chain-order - the disconnected header must be the last connected header");
                self.latest_block_height.fetch_sub(1, Ordering::AcqRel);
                *self.last_block_hash.write().unwrap() = header.prev_blockhash;