consensus_core/storage/
mod.rs1pub mod mem_store;
5pub mod rocksdb_store;
6
7#[cfg(test)]
8mod store_tests;
9
10use std::collections::BTreeMap;
11
12use consensus_config::AuthorityIndex;
13use consensus_types::block::{BlockRef, Round, TransactionIndex};
14
15use crate::{
16 CommitIndex,
17 block::VerifiedBlock,
18 commit::{CommitInfo, CommitRange, CommitRef, TrustedCommit},
19 error::ConsensusResult,
20};
21
22pub trait Store: Send + Sync {
24 fn write(&self, write_batch: WriteBatch) -> ConsensusResult<()>;
26
27 fn read_blocks(&self, refs: &[BlockRef]) -> ConsensusResult<Vec<Option<VerifiedBlock>>>;
29
30 fn contains_blocks(&self, refs: &[BlockRef]) -> ConsensusResult<Vec<bool>>;
32
33 fn scan_blocks_by_author(
35 &self,
36 authority: AuthorityIndex,
37 start_round: Round,
38 ) -> ConsensusResult<Vec<VerifiedBlock>>;
39
40 fn scan_blocks_by_author_in_range(
42 &self,
43 author: AuthorityIndex,
44 start_round: Round,
45 end_round: Round,
46 limit: usize,
47 ) -> ConsensusResult<Vec<VerifiedBlock>>;
48
49 fn scan_last_blocks_by_author(
53 &self,
54 author: AuthorityIndex,
55 num_of_rounds: u64,
56 before_round: Option<Round>,
57 ) -> ConsensusResult<Vec<VerifiedBlock>>;
58
59 fn read_last_commit(&self) -> ConsensusResult<Option<TrustedCommit>>;
61
62 fn scan_commits(&self, range: CommitRange) -> ConsensusResult<Vec<TrustedCommit>>;
64
65 fn read_commit_votes(&self, commit_index: CommitIndex) -> ConsensusResult<Vec<BlockRef>>;
67
68 fn read_last_commit_info(&self) -> ConsensusResult<Option<(CommitRef, CommitInfo)>>;
70
71 fn read_last_finalized_commit(&self) -> ConsensusResult<Option<CommitRef>>;
73
74 fn read_rejected_transactions(
76 &self,
77 commit_ref: CommitRef,
78 ) -> ConsensusResult<Option<BTreeMap<BlockRef, Vec<TransactionIndex>>>>;
79}
80
81#[derive(Debug, Default)]
83pub struct WriteBatch {
84 pub blocks: Vec<VerifiedBlock>,
85 pub commits: Vec<TrustedCommit>,
86 pub commit_info: Vec<(CommitRef, CommitInfo)>,
87 pub finalized_commits: Vec<(CommitRef, BTreeMap<BlockRef, Vec<TransactionIndex>>)>,
88}
89
90impl WriteBatch {
91 pub fn new(
92 blocks: Vec<VerifiedBlock>,
93 commits: Vec<TrustedCommit>,
94 commit_info: Vec<(CommitRef, CommitInfo)>,
95 finalized_commits: Vec<(CommitRef, BTreeMap<BlockRef, Vec<TransactionIndex>>)>,
96 ) -> Self {
97 WriteBatch {
98 blocks,
99 commits,
100 commit_info,
101 finalized_commits,
102 }
103 }
104
105 #[cfg(test)]
108 pub fn blocks(mut self, blocks: Vec<VerifiedBlock>) -> Self {
109 self.blocks = blocks;
110 self
111 }
112
113 #[cfg(test)]
114 pub fn commits(mut self, commits: Vec<TrustedCommit>) -> Self {
115 self.commits = commits;
116 self
117 }
118
119 #[cfg(test)]
120 pub fn commit_info(mut self, commit_info: Vec<(CommitRef, CommitInfo)>) -> Self {
121 self.commit_info = commit_info;
122 self
123 }
124}