From e359c1abe2fec4799fbfa9db55438b1cfc5c8c90 Mon Sep 17 00:00:00 2001 From: Daniil Polyakov Date: Thu, 14 May 2026 23:47:48 +0300 Subject: [PATCH] refactor: better check for db existence --- Cargo.lock | 1 - sequencer/core/Cargo.toml | 1 - sequencer/core/src/lib.rs | 98 ++++++++++++++++++--------------------- 3 files changed, 46 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2f5e766b..59bd5269 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8431,7 +8431,6 @@ dependencies = [ "nssa", "nssa_core", "rand 0.8.5", - "rocksdb", "serde", "serde_json", "storage", diff --git a/sequencer/core/Cargo.toml b/sequencer/core/Cargo.toml index da88d481..7f93e684 100644 --- a/sequencer/core/Cargo.toml +++ b/sequencer/core/Cargo.toml @@ -31,7 +31,6 @@ rand.workspace = true borsh.workspace = true bytesize.workspace = true url.workspace = true -rocksdb.workspace = true [features] default = [] diff --git a/sequencer/core/src/lib.rs b/sequencer/core/src/lib.rs index bfc49aa9..8d78b91e 100644 --- a/sequencer/core/src/lib.rs +++ b/sequencer/core/src/lib.rs @@ -47,66 +47,60 @@ impl SequencerCore { config: SequencerConfig, ) -> (Self, MemPoolHandle) { let signing_key = nssa::PrivateKey::try_new(config.signing_key).unwrap(); - let db_path = config.home.join("rocksdb"); let bedrock_signing_key = load_or_create_signing_key(&config.home.join("bedrock_signing_key")) .expect("Failed to load or create bedrock signing key"); - let (store, state, genesis_block) = - match SequencerStore::open_db(&db_path, signing_key.clone()) { - Ok(store) => { - let state = store - .get_nssa_state() - .expect("Failed to read state from store"); - let genesis_block = store - .get_block_at_id(store.genesis_id()) - .expect("Failed to read genesis block from store") - .expect("Genesis block not found in store"); - (store, state, genesis_block) - } - Err(DbError::RocksDbError { error, .. }) - if error.kind() == rocksdb::ErrorKind::InvalidArgument - && error.to_string().contains("does not exist") => - { - warn!( - "Database not found at {}, starting from genesis", - db_path.display() - ); - - // TODO: Remove msg_id from BlockMeta — it is no longer needed now that - // zone-sdk manages L1 settlement state via its own checkpoint. - let genesis_msg_id = [0; 32]; - let genesis_parent_msg_id = [0; 32]; - let (genesis_state, genesis_txs) = build_genesis_state(&config); - - let hashable_data = HashableBlockData { - block_id: GENESIS_BLOCK_ID, - transactions: genesis_txs, - prev_block_hash: HashType([0; 32]), - timestamp: 0, - }; - let genesis_block = - hashable_data.into_pending_block(&signing_key, genesis_parent_msg_id); - - let store = SequencerStore::create_db_with_genesis( - &db_path, - &genesis_block, - genesis_msg_id, - &genesis_state, - signing_key, - ) - .expect("Failed to create database with genesis block"); - - (store, genesis_state, genesis_block) - } - Err(err) => { + let db_path = config.home.join("rocksdb"); + let (store, state, genesis_block) = if db_path.exists() { + let store = + SequencerStore::open_db(&db_path, signing_key.clone()).unwrap_or_else(|err| { panic!( - "Failed to open database at {} with error: {err:#?}", + "Failed to open database at {} with error: {err}", db_path.display() - ); - } + ) + }); + let state = store + .get_nssa_state() + .expect("Failed to read state from store"); + let genesis_block = store + .get_block_at_id(store.genesis_id()) + .expect("Failed to read genesis block from store") + .expect("Genesis block not found in store"); + (store, state, genesis_block) + } else { + warn!( + "Database not found at {}, starting from genesis", + db_path.display() + ); + + // TODO: Remove msg_id from BlockMeta — it is no longer needed now that + // zone-sdk manages L1 settlement state via its own checkpoint. + let genesis_msg_id = [0; 32]; + let genesis_parent_msg_id = [0; 32]; + let (genesis_state, genesis_txs) = build_genesis_state(&config); + + let hashable_data = HashableBlockData { + block_id: GENESIS_BLOCK_ID, + transactions: genesis_txs, + prev_block_hash: HashType([0; 32]), + timestamp: 0, }; + let genesis_block = + hashable_data.into_pending_block(&signing_key, genesis_parent_msg_id); + + let store = SequencerStore::create_db_with_genesis( + &db_path, + &genesis_block, + genesis_msg_id, + &genesis_state, + signing_key, + ) + .expect("Failed to create database with genesis block"); + + (store, genesis_state, genesis_block) + }; let latest_block_meta = store .latest_block_meta()