use {super::*, updater::BlockData};
#[derive(Debug, PartialEq)]
pub(crate) enum ReorgError {
Recoverable { height: u32, depth: u32 },
Unrecoverable,
}
impl fmt::Display for ReorgError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ReorgError::Recoverable { height, depth } => {
write!(f, "{depth} block deep reorg detected at height {height}")
}
ReorgError::Unrecoverable => write!(f, "unrecoverable reorg detected"),
}
}
}
impl std::error::Error for ReorgError {}
const MAX_SAVEPOINTS: u32 = 2;
const SAVEPOINT_INTERVAL: u32 = 10;
const CHAIN_TIP_DISTANCE: u32 = 21;
pub(crate) struct Reorg {}
impl Reorg {
pub(crate) fn detect_reorg(block: &BlockData, height: u32, index: &Index) -> Result {
let bitcoind_prev_blockhash = block.header.prev_blockhash;
match index.block_hash(height.checked_sub(1))? {
Some(index_prev_blockhash) if index_prev_blockhash == bitcoind_prev_blockhash => Ok(()),
Some(index_prev_blockhash) if index_prev_blockhash != bitcoind_prev_blockhash => {