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, 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 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 async fn save(&self, _records: Vec<SerializableRecord>) -> anyhow::Result<()> {
348 Ok(())
349 }
350
351 async fn load(&self) -> anyhow::Result<Vec<SerializableRecord>> {
353 Ok(vec![])
354 }
355}