add bedrock status flag to blocks and last_finalized_block metadata info to sequencer db

This commit is contained in:
Sergio Chouhy 2026-01-20 11:50:20 -03:00
parent 654e92f0d7
commit e397d6c576
5 changed files with 52 additions and 20 deletions

View File

@ -23,7 +23,7 @@ pub type BlockHash = [u8; 32];
pub type BlockId = u64; pub type BlockId = u64;
pub type TimeStamp = u64; pub type TimeStamp = u64;
#[derive(Debug, Clone)] #[derive(Debug, Clone, BorshSerialize, BorshDeserialize)]
pub struct BlockHeader { pub struct BlockHeader {
pub block_id: BlockId, pub block_id: BlockId,
pub prev_block_hash: BlockHash, pub prev_block_hash: BlockHash,
@ -32,15 +32,23 @@ pub struct BlockHeader {
pub signature: nssa::Signature, pub signature: nssa::Signature,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone, BorshSerialize, BorshDeserialize)]
pub struct BlockBody { pub struct BlockBody {
pub transactions: Vec<EncodedTransaction>, pub transactions: Vec<EncodedTransaction>,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone, BorshSerialize, BorshDeserialize)]
pub enum BedrockStatus {
Pending,
Safe,
Finalized,
}
#[derive(Debug, BorshSerialize, BorshDeserialize)]
pub struct Block { pub struct Block {
pub header: BlockHeader, pub header: BlockHeader,
pub body: BlockBody, pub body: BlockBody,
pub bedrock_status: BedrockStatus,
} }
#[derive(Debug, Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize)] #[derive(Debug, Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize)]
@ -52,7 +60,7 @@ pub struct HashableBlockData {
} }
impl HashableBlockData { impl HashableBlockData {
pub fn into_block(self, signing_key: &nssa::PrivateKey) -> Block { pub fn into_pending_block(self, signing_key: &nssa::PrivateKey) -> Block {
let data_bytes = borsh::to_vec(&self).unwrap(); let data_bytes = borsh::to_vec(&self).unwrap();
let signature = nssa::Signature::new(signing_key, &data_bytes); let signature = nssa::Signature::new(signing_key, &data_bytes);
let hash = OwnHasher::hash(&data_bytes); let hash = OwnHasher::hash(&data_bytes);
@ -67,6 +75,7 @@ impl HashableBlockData {
body: BlockBody { body: BlockBody {
transactions: self.transactions, transactions: self.transactions,
}, },
bedrock_status: BedrockStatus::Pending,
} }
} }
} }

View File

@ -30,7 +30,7 @@ pub fn produce_dummy_block(
transactions, transactions,
}; };
block_data.into_block(&sequencer_sign_key_for_testing()) block_data.into_pending_block(&sequencer_sign_key_for_testing())
} }
pub fn produce_dummy_empty_transaction() -> EncodedTransaction { pub fn produce_dummy_empty_transaction() -> EncodedTransaction {

View File

@ -46,7 +46,7 @@ impl SequencerBlockStore {
} }
pub fn get_block_at_id(&self, id: u64) -> Result<Block> { pub fn get_block_at_id(&self, id: u64) -> Result<Block> {
Ok(self.dbio.get_block(id)?.into_block(&self.signing_key)) Ok(self.dbio.get_block(id)?)
} }
pub fn put_block_at_id(&mut self, block: Block) -> Result<()> { pub fn put_block_at_id(&mut self, block: Block) -> Result<()> {
@ -113,7 +113,7 @@ mod tests {
transactions: vec![], transactions: vec![],
}; };
let genesis_block = genesis_block_hashable_data.into_block(&signing_key); let genesis_block = genesis_block_hashable_data.into_pending_block(&signing_key);
// Start an empty node store // Start an empty node store
let mut node_store = let mut node_store =
SequencerBlockStore::open_db_with_genesis(path, Some(genesis_block), signing_key) SequencerBlockStore::open_db_with_genesis(path, Some(genesis_block), signing_key)

View File

@ -53,7 +53,7 @@ impl SequencerCore {
}; };
let signing_key = nssa::PrivateKey::try_new(config.signing_key).unwrap(); let signing_key = nssa::PrivateKey::try_new(config.signing_key).unwrap();
let genesis_block = hashable_data.into_block(&signing_key); let genesis_block = hashable_data.into_pending_block(&signing_key);
// Sequencer should panic if unable to open db, // Sequencer should panic if unable to open db,
// as fixing this issue may require actions non-native to program scope // as fixing this issue may require actions non-native to program scope
@ -196,7 +196,7 @@ impl SequencerCore {
let block = hashable_data let block = hashable_data
.clone() .clone()
.into_block(self.block_store.signing_key()); .into_pending_block(self.block_store.signing_key());
self.block_store.put_block_at_id(block)?; self.block_store.put_block_at_id(block)?;

View File

@ -1,6 +1,6 @@
use std::{path::Path, sync::Arc}; use std::{path::Path, sync::Arc};
use common::block::{Block, HashableBlockData}; use common::block::Block;
use error::DbError; use error::DbError;
use rocksdb::{ use rocksdb::{
BoundColumnFamily, ColumnFamilyDescriptor, DBWithThreadMode, MultiThreaded, Options, BoundColumnFamily, ColumnFamilyDescriptor, DBWithThreadMode, MultiThreaded, Options,
@ -26,6 +26,8 @@ pub const DB_META_FIRST_BLOCK_IN_DB_KEY: &str = "first_block_in_db";
pub const DB_META_LAST_BLOCK_IN_DB_KEY: &str = "last_block_in_db"; pub const DB_META_LAST_BLOCK_IN_DB_KEY: &str = "last_block_in_db";
/// Key base for storing metainformation which describe if first block has been set /// Key base for storing metainformation which describe if first block has been set
pub const DB_META_FIRST_BLOCK_SET_KEY: &str = "first_block_set"; pub const DB_META_FIRST_BLOCK_SET_KEY: &str = "first_block_set";
/// Key base for storing metainformation about the last finalized block on Bedrock
pub const DB_META_LAST_FINALIZED_BLOCK_ID: &str = "last_finalized_block_id";
/// Key base for storing snapshot which describe block id /// Key base for storing snapshot which describe block id
pub const DB_SNAPSHOT_BLOCK_ID_KEY: &str = "block_id"; pub const DB_SNAPSHOT_BLOCK_ID_KEY: &str = "block_id";
@ -75,6 +77,7 @@ impl RocksDBIO {
dbio.put_meta_first_block_in_db(block)?; dbio.put_meta_first_block_in_db(block)?;
dbio.put_meta_is_first_block_set()?; dbio.put_meta_is_first_block_set()?;
dbio.put_meta_last_block_in_db(block_id)?; dbio.put_meta_last_block_in_db(block_id)?;
dbio.put_meta_last_finalized_block_id(None)?;
Ok(dbio) Ok(dbio)
} else { } else {
@ -232,6 +235,28 @@ impl RocksDBIO {
Ok(()) Ok(())
} }
pub fn put_meta_last_finalized_block_id(&self, block_id: Option<u64>) -> DbResult<()> {
let cf_meta = self.meta_column();
self.db
.put_cf(
&cf_meta,
borsh::to_vec(&DB_META_LAST_FINALIZED_BLOCK_ID).map_err(|err| {
DbError::borsh_cast_message(
err,
Some("Failed to serialize DB_META_LAST_FINALIZED_BLOCK_ID".to_string()),
)
})?,
borsh::to_vec(&block_id).map_err(|err| {
DbError::borsh_cast_message(
err,
Some("Failed to serialize last block id".to_string()),
)
})?,
)
.map_err(|rerr| DbError::rocksdb_cast_message(rerr, None))?;
Ok(())
}
pub fn put_meta_is_first_block_set(&self) -> DbResult<()> { pub fn put_meta_is_first_block_set(&self) -> DbResult<()> {
let cf_meta = self.meta_column(); let cf_meta = self.meta_column();
self.db self.db
@ -269,7 +294,7 @@ impl RocksDBIO {
Some("Failed to serialize block id".to_string()), Some("Failed to serialize block id".to_string()),
) )
})?, })?,
borsh::to_vec(&HashableBlockData::from(block)).map_err(|err| { borsh::to_vec(&block).map_err(|err| {
DbError::borsh_cast_message( DbError::borsh_cast_message(
err, err,
Some("Failed to serialize block data".to_string()), Some("Failed to serialize block data".to_string()),
@ -280,7 +305,7 @@ impl RocksDBIO {
Ok(()) Ok(())
} }
pub fn get_block(&self, block_id: u64) -> DbResult<HashableBlockData> { pub fn get_block(&self, block_id: u64) -> DbResult<Block> {
let cf_block = self.block_column(); let cf_block = self.block_column();
let res = self let res = self
.db .db
@ -296,14 +321,12 @@ impl RocksDBIO {
.map_err(|rerr| DbError::rocksdb_cast_message(rerr, None))?; .map_err(|rerr| DbError::rocksdb_cast_message(rerr, None))?;
if let Some(data) = res { if let Some(data) = res {
Ok( Ok(borsh::from_slice::<Block>(&data).map_err(|serr| {
borsh::from_slice::<HashableBlockData>(&data).map_err(|serr| { DbError::borsh_cast_message(
DbError::borsh_cast_message( serr,
serr, Some("Failed to deserialize block data".to_string()),
Some("Failed to deserialize block data".to_string()), )
) })?)
})?,
)
} else { } else {
Err(DbError::db_interaction_error( Err(DbError::db_interaction_error(
"Block on this id not found".to_string(), "Block on this id not found".to_string(),