Skip to main content

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