From 24df2644b74197440c3c663f62deb38b4ab563e9 Mon Sep 17 00:00:00 2001 From: rustaceanrob Date: Mon, 3 Jun 2024 14:39:16 -1000 Subject: [PATCH] chain: extend fn MSRV --- src/chain/header_chain.rs | 41 ++++++++++++++++----------------------- src/lib.rs | 4 ++-- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/chain/header_chain.rs b/src/chain/header_chain.rs index 1f0a6a9..bc4177c 100644 --- a/src/chain/header_chain.rs +++ b/src/chain/header_chain.rs @@ -154,7 +154,7 @@ impl HeaderChain { locators } - // Extend the current chain, potentially rewriting history + // Extend the current chain, potentially rewriting history. Higher order functions should decide what we extend pub(crate) fn extend(&mut self, batch: &[Header]) -> Vec { let mut reorged = Vec::new(); // We cannot extend from nothing @@ -180,38 +180,31 @@ impl HeaderChain { .expect("cannot extend from empty batch") .prev_blockhash )); - while let Some((height, header)) = self.headers.iter_mut().next_back() { + // Supporting MSRV of 1.63 requires this round-about way of removing the headers instead of `pop_last` + // Find the header that matches the new batch prev block hash, collecting the disconnected headers + for (height, header) in self.headers.iter().rev() { if header.block_hash().ne(&batch .first() .expect("cannot extend from empty batch") .prev_blockhash) { - reorged.push(DisconnectedHeader::new(*height, *header)); + reorged.push(DisconnectedHeader::new(*height, header.block_hash())); } else { - let anchor_height = self.height(); - for (index, header) in batch.iter().enumerate() { - self.headers - .insert(anchor_height + 1 + index as u32, *header); - } + break; } } - // // Remove items from the top of the chain until they link. - // while self.tip().ne(&batch - // .first() - // .expect("cannot extend from empty batch") - // .prev_blockhash) - // { - // if let Some((height, header)) = self.headers.pop_last() { - // reorged.push(DisconnectedHeader::new(height, header)); - // } - // } - // let current_anchor = self.height(); - // for (index, header) in batch.iter().enumerate() { - // self.headers - // .insert(current_anchor + 1 + index as u32, *header); - // } + // Actually remove anything that should no longer be connected + for removal in reorged.iter() { + self.remove(&removal.height); + } + // Add back the new headers, starting at the proper link + let current_anchor = self.height(); + for (index, header) in batch.iter().enumerate() { + self.headers + .insert(current_anchor + 1 + index as u32, *header); + } } - reorged.iter().rev().copied().collect() + reorged } fn remove(&mut self, height: &u32) { diff --git a/src/lib.rs b/src/lib.rs index b4e6ab1..e7c6f57 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,11 +45,11 @@ pub struct DisconnectedHeader { /// The height where this header used to be in the chain. pub height: u32, /// The reorganized header. - pub header: Header, + pub header: BlockHash, } impl DisconnectedHeader { - pub(crate) fn new(height: u32, header: Header) -> Self { + pub(crate) fn new(height: u32, header: BlockHash) -> Self { Self { height, header } } }