sequencer/persistence/
no_storage.rs

1//! Mock implementation of persistence, for testing.
2use std::{collections::BTreeMap, sync::Arc};
3
4use anyhow::bail;
5use async_trait::async_trait;
6use espresso_types::{
7    traits::{EventsPersistenceRead, MembershipPersistence},
8    v0::traits::{EventConsumer, PersistenceOptions, SequencerPersistence},
9    v0_3::{EventKey, IndexedStake, RewardAmount, StakeTableEvent, Validator},
10    Leaf2, NetworkConfig, PubKey, StakeTableHash, ValidatorMap,
11};
12use hotshot::InitializerEpochInfo;
13use hotshot_libp2p_networking::network::behaviours::dht::store::persistent::{
14    DhtPersistentStorage, SerializableRecord,
15};
16use hotshot_types::{
17    data::{
18        DaProposal, DaProposal2, EpochNumber, QuorumProposalWrapper, VidCommitment,
19        VidDisperseShare,
20    },
21    drb::{DrbInput, DrbResult},
22    event::{Event, EventType, HotShotAction, LeafInfo},
23    message::Proposal,
24    simple_certificate::{
25        CertificatePair, LightClientStateUpdateCertificateV2, NextEpochQuorumCertificate2,
26        QuorumCertificate2, UpgradeCertificate,
27    },
28    traits::metrics::Metrics,
29    vote::HasViewNumber,
30};
31
32use crate::{NodeType, SeqTypes, ViewNumber};
33
34#[derive(Clone, Copy, Debug)]
35pub struct Options;
36
37#[async_trait]
38impl PersistenceOptions for Options {
39    type Persistence = NoStorage;
40
41    fn set_view_retention(&mut self, _: u64) {}
42
43    async fn create(&mut self) -> anyhow::Result<Self::Persistence> {
44        Ok(NoStorage)
45    }
46
47    async fn reset(self) -> anyhow::Result<()> {
48        Ok(())
49    }
50}
51
52#[derive(Clone, Copy, Debug)]
53pub struct NoStorage;
54
55#[async_trait]
56impl SequencerPersistence for NoStorage {
57    async fn load_config(&self) -> anyhow::Result<Option<NetworkConfig>> {
58        Ok(None)
59    }
60
61    async fn save_config(&self, _: &NetworkConfig) -> anyhow::Result<()> {
62        Ok(())
63    }
64
65    async fn append_decided_leaves(
66        &self,
67        view_number: ViewNumber,
68        leaves: impl IntoIterator<Item = (&LeafInfo<SeqTypes>, CertificatePair<SeqTypes>)> + Send,
69        deciding_qc: Option<Arc<CertificatePair<SeqTypes>>>,
70        consumer: &impl EventConsumer,
71    ) -> anyhow::Result<()> {
72        let leaves = leaves
73            .into_iter()
74            .map(|(info_ref, qc)| (info_ref.clone(), qc))
75            .collect::<Vec<_>>();
76        for (leaf_info, qc) in leaves {
77            // Insert the deciding QC at the appropriate position, with the last decide event in the
78            // chain.
79            let deciding_qc = if let Some(deciding_qc) = &deciding_qc {
80                (deciding_qc.view_number() == qc.view_number() + 1).then_some(deciding_qc.clone())
81            } else {
82                None
83            };
84
85            consumer
86                .handle_event(&Event {
87                    view_number,
88                    event: EventType::Decide {
89                        leaf_chain: Arc::new(vec![leaf_info.clone()]),
90                        committing_qc: Arc::new(qc),
91                        deciding_qc,
92                        block_size: None,
93                    },
94                })
95                .await?;
96        }
97        Ok(())
98    }
99
100    async fn load_latest_acted_view(&self) -> anyhow::Result<Option<ViewNumber>> {
101        Ok(None)
102    }
103
104    async fn load_restart_view(&self) -> anyhow::Result<Option<ViewNumber>> {
105        Ok(None)
106    }
107
108    async fn load_anchor_leaf(
109        &self,
110    ) -> anyhow::Result<Option<(Leaf2, QuorumCertificate2<SeqTypes>)>> {
111        Ok(None)
112    }
113
114    async fn load_da_proposal(
115        &self,
116        _view: ViewNumber,
117    ) -> anyhow::Result<Option<Proposal<SeqTypes, DaProposal2<SeqTypes>>>> {
118        Ok(None)
119    }
120
121    async fn load_vid_share(
122        &self,
123        _view: ViewNumber,
124    ) -> anyhow::Result<Option<Proposal<SeqTypes, VidDisperseShare<SeqTypes>>>> {
125        Ok(None)
126    }
127
128    async fn load_quorum_proposals(
129        &self,
130    ) -> anyhow::Result<BTreeMap<ViewNumber, Proposal<SeqTypes, QuorumProposalWrapper<SeqTypes>>>>
131    {
132        Ok(Default::default())
133    }
134    async fn load_quorum_proposal(
135        &self,
136        view: ViewNumber,
137    ) -> anyhow::Result<Proposal<SeqTypes, QuorumProposalWrapper<SeqTypes>>> {
138        bail!("proposal {view:?} not available");
139    }
140    async fn load_upgrade_certificate(
141        &self,
142    ) -> anyhow::Result<Option<UpgradeCertificate<SeqTypes>>> {
143        Ok(None)
144    }
145
146    async fn append_vid(
147        &self,
148        _proposal: &Proposal<SeqTypes, VidDisperseShare<SeqTypes>>,
149    ) -> anyhow::Result<()> {
150        Ok(())
151    }
152    async fn append_da(
153        &self,
154        _proposal: &Proposal<SeqTypes, DaProposal<SeqTypes>>,
155        _vid_commit: VidCommitment,
156    ) -> anyhow::Result<()> {
157        Ok(())
158    }
159    async fn record_action(
160        &self,
161        _view: ViewNumber,
162        _epoch: Option<EpochNumber>,
163        _action: HotShotAction,
164    ) -> anyhow::Result<()> {
165        Ok(())
166    }
167    async fn append_quorum_proposal2(
168        &self,
169        _proposal: &Proposal<SeqTypes, QuorumProposalWrapper<SeqTypes>>,
170    ) -> anyhow::Result<()> {
171        Ok(())
172    }
173    async fn store_upgrade_certificate(
174        &self,
175        _decided_upgrade_certificate: Option<UpgradeCertificate<SeqTypes>>,
176    ) -> anyhow::Result<()> {
177        Ok(())
178    }
179
180    async fn store_next_epoch_quorum_certificate(
181        &self,
182        _high_qc: NextEpochQuorumCertificate2<SeqTypes>,
183    ) -> anyhow::Result<()> {
184        Ok(())
185    }
186
187    async fn load_next_epoch_quorum_certificate(
188        &self,
189    ) -> anyhow::Result<Option<NextEpochQuorumCertificate2<SeqTypes>>> {
190        Ok(None)
191    }
192
193    async fn store_eqc(
194        &self,
195        _high_qc: QuorumCertificate2<SeqTypes>,
196        _next_epoch_high_qc: NextEpochQuorumCertificate2<SeqTypes>,
197    ) -> anyhow::Result<()> {
198        Ok(())
199    }
200
201    async fn load_eqc(
202        &self,
203    ) -> Option<(
204        QuorumCertificate2<SeqTypes>,
205        NextEpochQuorumCertificate2<SeqTypes>,
206    )> {
207        None
208    }
209
210    async fn append_da2(
211        &self,
212        _proposal: &Proposal<SeqTypes, DaProposal2<SeqTypes>>,
213        _vid_commit: VidCommitment,
214    ) -> anyhow::Result<()> {
215        Ok(())
216    }
217
218    async fn append_proposal2(
219        &self,
220        _proposal: &Proposal<SeqTypes, QuorumProposalWrapper<SeqTypes>>,
221    ) -> anyhow::Result<()> {
222        Ok(())
223    }
224
225    async fn migrate_anchor_leaf(&self) -> anyhow::Result<()> {
226        Ok(())
227    }
228
229    async fn migrate_da_proposals(&self) -> anyhow::Result<()> {
230        Ok(())
231    }
232
233    async fn migrate_vid_shares(&self) -> anyhow::Result<()> {
234        Ok(())
235    }
236
237    async fn migrate_quorum_proposals(&self) -> anyhow::Result<()> {
238        Ok(())
239    }
240
241    async fn migrate_quorum_certificates(&self) -> anyhow::Result<()> {
242        Ok(())
243    }
244
245    async fn store_drb_result(
246        &self,
247        _epoch: EpochNumber,
248        _drb_result: DrbResult,
249    ) -> anyhow::Result<()> {
250        Ok(())
251    }
252
253    async fn store_drb_input(&self, _drb_input: DrbInput) -> anyhow::Result<()> {
254        Ok(())
255    }
256    async fn load_drb_input(&self, _epoch: u64) -> anyhow::Result<DrbInput> {
257        bail!("Cannot load from NoStorage")
258    }
259
260    async fn store_epoch_root(
261        &self,
262        _epoch: EpochNumber,
263        _block_header: <SeqTypes as NodeType>::BlockHeader,
264    ) -> anyhow::Result<()> {
265        Ok(())
266    }
267
268    async fn load_start_epoch_info(&self) -> anyhow::Result<Vec<InitializerEpochInfo<SeqTypes>>> {
269        Ok(Vec::new())
270    }
271
272    async fn add_state_cert(
273        &self,
274        _state_cert: LightClientStateUpdateCertificateV2<SeqTypes>,
275    ) -> anyhow::Result<()> {
276        Ok(())
277    }
278
279    async fn load_state_cert(
280        &self,
281    ) -> anyhow::Result<Option<LightClientStateUpdateCertificateV2<SeqTypes>>> {
282        Ok(None)
283    }
284
285    async fn get_state_cert_by_epoch(
286        &self,
287        _epoch: u64,
288    ) -> anyhow::Result<Option<LightClientStateUpdateCertificateV2<SeqTypes>>> {
289        Ok(None)
290    }
291
292    async fn insert_state_cert(
293        &self,
294        _epoch: u64,
295        _cert: LightClientStateUpdateCertificateV2<SeqTypes>,
296    ) -> anyhow::Result<()> {
297        Ok(())
298    }
299
300    fn enable_metrics(&mut self, _metrics: &dyn Metrics) {}
301}
302
303#[async_trait]
304impl MembershipPersistence for NoStorage {
305    async fn load_stake(
306        &self,
307        _epoch: EpochNumber,
308    ) -> anyhow::Result<Option<(ValidatorMap, Option<RewardAmount>, Option<StakeTableHash>)>> {
309        Ok(None)
310    }
311
312    async fn load_latest_stake(&self, _limit: u64) -> anyhow::Result<Option<Vec<IndexedStake>>> {
313        Ok(None)
314    }
315
316    async fn store_stake(
317        &self,
318        _epoch: EpochNumber,
319        _stake: ValidatorMap,
320        _block_reward: Option<RewardAmount>,
321        _stake_table_hash: Option<StakeTableHash>,
322    ) -> anyhow::Result<()> {
323        Ok(())
324    }
325
326    async fn store_events(
327        &self,
328        _l1: u64,
329        _events: Vec<(EventKey, StakeTableEvent)>,
330    ) -> anyhow::Result<()> {
331        Ok(())
332    }
333    async fn load_events(
334        &self,
335        _from_l1_block: u64,
336        _l1_block: u64,
337    ) -> anyhow::Result<(
338        Option<EventsPersistenceRead>,
339        Vec<(EventKey, StakeTableEvent)>,
340    )> {
341        Ok((None, Vec::new()))
342    }
343
344    async fn store_all_validators(
345        &self,
346        _epoch: EpochNumber,
347        _all_validators: ValidatorMap,
348    ) -> anyhow::Result<()> {
349        Ok(())
350    }
351
352    async fn load_all_validators(
353        &self,
354        _epoch: EpochNumber,
355        _offset: u64,
356        _limit: u64,
357    ) -> anyhow::Result<Vec<Validator<PubKey>>> {
358        Ok(Default::default())
359    }
360}
361
362#[async_trait]
363impl DhtPersistentStorage for NoStorage {
364    /// Don't do anything
365    async fn save(&self, _records: Vec<SerializableRecord>) -> anyhow::Result<()> {
366        Ok(())
367    }
368
369    /// Don't do anything
370    async fn load(&self) -> anyhow::Result<Vec<SerializableRecord>> {
371        Ok(vec![])
372    }
373}