espresso_node/persistence/
no_storage.rs1use 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 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 async fn save(&self, _records: Vec<SerializableRecord>) -> anyhow::Result<()> {
377 Ok(())
378 }
379
380 async fn load(&self) -> anyhow::Result<Vec<SerializableRecord>> {
382 Ok(vec![])
383 }
384}