1use 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 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 async fn save(&self, _records: Vec<SerializableRecord>) -> anyhow::Result<()> {
366 Ok(())
367 }
368
369 async fn load(&self) -> anyhow::Result<Vec<SerializableRecord>> {
371 Ok(vec![])
372 }
373}