diff --git a/consensus/src/consensus/factory.rs b/consensus/src/consensus/factory.rs index 6e9dedfaac..6d4ffad7d7 100644 --- a/consensus/src/consensus/factory.rs +++ b/consensus/src/consensus/factory.rs @@ -40,7 +40,7 @@ pub enum ConsensusEntryType { New(ConsensusEntry), } -#[derive(Serialize, Deserialize, Clone, Default)] +#[derive(Serialize, Deserialize, Clone)] pub struct MultiConsensusMetadata { current_consensus_key: Option, staging_consensus_key: Option, @@ -54,6 +54,20 @@ pub struct MultiConsensusMetadata { version: u32, } +const LATEST_DB_VERSION: u32 = 1; +impl Default for MultiConsensusMetadata { + fn default() -> Self { + Self { + current_consensus_key: Default::default(), + staging_consensus_key: Default::default(), + max_key_used: Default::default(), + is_archival_node: Default::default(), + props: Default::default(), + version: LATEST_DB_VERSION, + } + } +} + #[derive(Clone)] pub struct MultiConsensusManagementStore { db: Arc, @@ -190,6 +204,14 @@ impl MultiConsensusManagementStore { self.metadata.write(BatchDbWriter::new(&mut batch), &metadata).unwrap(); } } + + pub fn should_upgrade(&self) -> StoreResult { + match self.metadata.read() { + Ok(data) => Ok(data.version != LATEST_DB_VERSION), + Err(StoreError::KeyNotFound(_)) => Ok(false), + Err(err) => Err(err), + } + } } pub struct Factory { diff --git a/kaspad/src/daemon.rs b/kaspad/src/daemon.rs index 26d8442b43..ae55cc14a9 100644 --- a/kaspad/src/daemon.rs +++ b/kaspad/src/daemon.rs @@ -244,7 +244,9 @@ do you confirm? (answer y/n or pass --yes to the Kaspad command line to confirm .unwrap(); // TEMP: upgrade from Alpha version or any version before this one - if meta_db.get_pinned(b"multi-consensus-metadata-key").is_ok_and(|r| r.is_some()) { + if meta_db.get_pinned(b"multi-consensus-metadata-key").is_ok_and(|r| r.is_some()) + || MultiConsensusManagementStore::new(meta_db.clone()).should_upgrade().unwrap() + { let msg = "Node database is from an older Kaspad version and needs to be fully deleted, do you confirm the delete? (y/n)"; get_user_approval_or_exit(msg, args.yes);