consensus_core/storage/
mod.rspub mod mem_store;
pub mod rocksdb_store;
#[cfg(test)]
mod store_tests;
use std::collections::BTreeMap;
use consensus_config::AuthorityIndex;
use consensus_types::block::{BlockRef, Round, TransactionIndex};
use crate::{
block::VerifiedBlock,
commit::{CommitInfo, CommitRange, CommitRef, TrustedCommit},
error::ConsensusResult,
CommitIndex,
};
pub trait Store: Send + Sync {
fn write(&self, write_batch: WriteBatch) -> ConsensusResult<()>;
fn read_blocks(&self, refs: &[BlockRef]) -> ConsensusResult<Vec<Option<VerifiedBlock>>>;
fn contains_blocks(&self, refs: &[BlockRef]) -> ConsensusResult<Vec<bool>>;
fn scan_blocks_by_author(
&self,
authority: AuthorityIndex,
start_round: Round,
) -> ConsensusResult<Vec<VerifiedBlock>>;
fn scan_last_blocks_by_author(
&self,
author: AuthorityIndex,
num_of_rounds: u64,
before_round: Option<Round>,
) -> ConsensusResult<Vec<VerifiedBlock>>;
fn read_last_commit(&self) -> ConsensusResult<Option<TrustedCommit>>;
fn scan_commits(&self, range: CommitRange) -> ConsensusResult<Vec<TrustedCommit>>;
fn read_commit_votes(&self, commit_index: CommitIndex) -> ConsensusResult<Vec<BlockRef>>;
fn read_last_commit_info(&self) -> ConsensusResult<Option<(CommitRef, CommitInfo)>>;
fn read_last_finalized_commit(&self) -> ConsensusResult<Option<CommitRef>>;
fn scan_finalized_commits(
&self,
range: CommitRange,
) -> ConsensusResult<Vec<(CommitRef, BTreeMap<BlockRef, Vec<TransactionIndex>>)>>;
}
#[derive(Debug, Default)]
pub struct WriteBatch {
pub blocks: Vec<VerifiedBlock>,
pub commits: Vec<TrustedCommit>,
pub commit_info: Vec<(CommitRef, CommitInfo)>,
pub finalized_commits: Vec<(CommitRef, BTreeMap<BlockRef, Vec<TransactionIndex>>)>,
}
impl WriteBatch {
pub fn new(
blocks: Vec<VerifiedBlock>,
commits: Vec<TrustedCommit>,
commit_info: Vec<(CommitRef, CommitInfo)>,
finalized_commits: Vec<(CommitRef, BTreeMap<BlockRef, Vec<TransactionIndex>>)>,
) -> Self {
WriteBatch {
blocks,
commits,
commit_info,
finalized_commits,
}
}
#[cfg(test)]
pub fn blocks(mut self, blocks: Vec<VerifiedBlock>) -> Self {
self.blocks = blocks;
self
}
#[cfg(test)]
pub fn commits(mut self, commits: Vec<TrustedCommit>) -> Self {
self.commits = commits;
self
}
#[cfg(test)]
pub fn commit_info(mut self, commit_info: Vec<(CommitRef, CommitInfo)>) -> Self {
self.commit_info = commit_info;
self
}
}