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, Header, 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::{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 load_config(&self) -> anyhow::Result<Option<NetworkConfig>> {
60        Ok(None)
61    }
62
63    async fn save_config(&self, _: &NetworkConfig) -> anyhow::Result<()> {
64        Ok(())
65    }
66
67    async fn persist_decided_leaves(
68        &self,
69        view_number: ViewNumber,
70        leaves: impl IntoIterator<Item = (&LeafInfo<SeqTypes>, CertificatePair<SeqTypes>)> + Send,
71        deciding_qc: Option<Arc<CertificatePair<SeqTypes>>>,
72        consumer: &(impl EventConsumer + 'static),
73    ) -> anyhow::Result<()> {
74        let leaves = leaves
75            .into_iter()
76            .map(|(info_ref, qc)| (info_ref.clone(), qc))
77            .collect::<Vec<_>>();
78        for (leaf_info, qc) in leaves {
79            // Insert the deciding QC at the appropriate position, with the last decide event in the
80            // chain.
81            let deciding_qc = if let Some(deciding_qc) = &deciding_qc {
82                (deciding_qc.view_number() == qc.view_number() + 1).then_some(deciding_qc.clone())
83            } else {
84                None
85            };
86
87            consumer
88                .handle_event(&CoordinatorEvent::LegacyEvent(Event {
89                    view_number,
90                    event: EventType::Decide {
91                        leaf_chain: Arc::new(vec![leaf_info.clone()]),
92                        committing_qc: Arc::new(qc),
93                        deciding_qc,
94                        block_size: None,
95                    },
96                }))
97                .await?;
98        }
99        Ok(())
100    }
101
102    async fn load_latest_acted_view(&self) -> anyhow::Result<Option<ViewNumber>> {
103        Ok(None)
104    }
105
106    async fn load_restart_view(&self) -> anyhow::Result<Option<ViewNumber>> {
107        Ok(None)
108    }
109
110    async fn load_anchor_leaf(&self) -> anyhow::Result<Option<(Leaf2, CertificatePair<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 load_next_epoch_quorum_certificate(
181        &self,
182    ) -> anyhow::Result<Option<NextEpochQuorumCertificate2<SeqTypes>>> {
183        Ok(None)
184    }
185
186    async fn store_eqc(
187        &self,
188        _high_qc: QuorumCertificate2<SeqTypes>,
189        _next_epoch_high_qc: NextEpochQuorumCertificate2<SeqTypes>,
190    ) -> anyhow::Result<()> {
191        Ok(())
192    }
193
194    async fn load_eqc(
195        &self,
196    ) -> Option<(
197        QuorumCertificate2<SeqTypes>,
198        NextEpochQuorumCertificate2<SeqTypes>,
199    )> {
200        None
201    }
202
203    async fn append_da2(
204        &self,
205        _proposal: &Proposal<SeqTypes, DaProposal2<SeqTypes>>,
206        _vid_commit: VidCommitment,
207    ) -> anyhow::Result<()> {
208        Ok(())
209    }
210
211    async fn append_proposal2(
212        &self,
213        _proposal: &Proposal<SeqTypes, QuorumProposalWrapper<SeqTypes>>,
214    ) -> anyhow::Result<()> {
215        Ok(())
216    }
217
218    async fn store_drb_result(
219        &self,
220        _epoch: EpochNumber,
221        _drb_result: DrbResult,
222    ) -> anyhow::Result<()> {
223        Ok(())
224    }
225
226    async fn store_drb_input(&self, _drb_input: DrbInput) -> anyhow::Result<()> {
227        Ok(())
228    }
229    async fn load_drb_input(&self, _epoch: u64) -> anyhow::Result<DrbInput> {
230        bail!("Cannot load from NoStorage")
231    }
232
233    async fn load_start_epoch_info(&self) -> anyhow::Result<Vec<InitializerEpochInfo<SeqTypes>>> {
234        Ok(Vec::new())
235    }
236
237    async fn add_state_cert(
238        &self,
239        _state_cert: LightClientStateUpdateCertificateV2<SeqTypes>,
240    ) -> anyhow::Result<()> {
241        Ok(())
242    }
243
244    async fn load_state_cert(
245        &self,
246    ) -> anyhow::Result<Option<LightClientStateUpdateCertificateV2<SeqTypes>>> {
247        Ok(None)
248    }
249
250    async fn get_state_cert_by_epoch(
251        &self,
252        _epoch: u64,
253    ) -> anyhow::Result<Option<LightClientStateUpdateCertificateV2<SeqTypes>>> {
254        Ok(None)
255    }
256
257    async fn insert_state_cert(
258        &self,
259        _epoch: u64,
260        _cert: LightClientStateUpdateCertificateV2<SeqTypes>,
261    ) -> anyhow::Result<()> {
262        Ok(())
263    }
264
265    fn enable_metrics(&mut self, _metrics: &dyn Metrics) {}
266}
267
268#[async_trait]
269impl MembershipPersistence for NoStorage {
270    async fn load_stake(&self, _epoch: EpochNumber) -> anyhow::Result<Option<StakeTuple>> {
271        Ok(None)
272    }
273
274    async fn load_latest_stake(&self, _limit: u64) -> anyhow::Result<Option<Vec<IndexedStake>>> {
275        Ok(None)
276    }
277
278    async fn load_drb_result(&self, _epoch: EpochNumber) -> anyhow::Result<Option<DrbResult>> {
279        Ok(None)
280    }
281
282    async fn load_epoch_root(&self, _epoch: EpochNumber) -> anyhow::Result<Option<Header>> {
283        Ok(None)
284    }
285
286    async fn store_epoch_root(
287        &self,
288        _epoch: EpochNumber,
289        _block_header: Header,
290    ) -> anyhow::Result<()> {
291        Ok(())
292    }
293
294    async fn store_stake(
295        &self,
296        _epoch: EpochNumber,
297        _stake: AuthenticatedValidatorMap,
298        _block_reward: Option<RewardAmount>,
299        _stake_table_hash: Option<StakeTableHash>,
300    ) -> anyhow::Result<()> {
301        Ok(())
302    }
303
304    async fn store_events(
305        &self,
306        _l1: u64,
307        _events: Vec<(EventKey, StakeTableEvent)>,
308    ) -> anyhow::Result<()> {
309        Ok(())
310    }
311    async fn load_events(
312        &self,
313        _from_l1_block: u64,
314        _l1_block: u64,
315    ) -> anyhow::Result<(
316        Option<EventsPersistenceRead>,
317        Vec<(EventKey, StakeTableEvent)>,
318    )> {
319        Ok((None, Vec::new()))
320    }
321
322    async fn delete_stake_tables(&self) -> anyhow::Result<()> {
323        Ok(())
324    }
325
326    async fn store_all_validators(
327        &self,
328        _epoch: EpochNumber,
329        _all_validators: RegisteredValidatorMap,
330    ) -> anyhow::Result<()> {
331        Ok(())
332    }
333
334    async fn load_all_validators(
335        &self,
336        _epoch: EpochNumber,
337        _offset: u64,
338        _limit: u64,
339    ) -> anyhow::Result<Vec<RegisteredValidator<PubKey>>> {
340        Ok(Default::default())
341    }
342}
343
344#[async_trait]
345impl DhtPersistentStorage for NoStorage {
346    /// Don't do anything
347    async fn save(&self, _records: Vec<SerializableRecord>) -> anyhow::Result<()> {
348        Ok(())
349    }
350
351    /// Don't do anything
352    async fn load(&self) -> anyhow::Result<Vec<SerializableRecord>> {
353        Ok(vec![])
354    }
355}