snark/block_verify/
snark_block_verify_state.rs

1use std::sync::Arc;
2
3use serde::{Deserialize, Serialize};
4
5use openmina_core::{block::BlockHash, requests::PendingRequests};
6
7use crate::{BlockVerifier, VerifierSRS};
8
9use super::{
10    SnarkBlockVerifyError, SnarkBlockVerifyId, SnarkBlockVerifyIdType, VerifiableBlockWithHash,
11};
12
13#[derive(Serialize, Deserialize, Clone)]
14pub struct SnarkBlockVerifyState {
15    pub verifier_index: BlockVerifier,
16    pub verifier_srs: Arc<VerifierSRS>,
17    pub jobs: PendingRequests<SnarkBlockVerifyIdType, SnarkBlockVerifyStatus>,
18}
19
20impl SnarkBlockVerifyState {
21    pub fn new(verifier_index: BlockVerifier, verifier_srs: Arc<VerifierSRS>) -> Self {
22        Self {
23            verifier_index,
24            verifier_srs,
25            jobs: Default::default(),
26        }
27    }
28
29    pub fn next_req_id(&self) -> SnarkBlockVerifyId {
30        self.jobs.next_req_id()
31    }
32}
33
34impl std::fmt::Debug for SnarkBlockVerifyState {
35    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
36        f.debug_struct("SnarkBlockVerifyState")
37            // TODO(binier): display hashes instead.
38            .field("verifier_index", &"<content too big>")
39            .field("verifier_srs", &"<content too big>")
40            .field("jobs", &self.jobs)
41            .finish()
42    }
43}
44
45#[derive(Serialize, Deserialize, Debug, Clone)]
46pub enum SnarkBlockVerifyStatus {
47    Init {
48        time: redux::Timestamp,
49        block: VerifiableBlockWithHash,
50        on_success: redux::Callback<BlockHash>,
51        on_error: redux::Callback<(BlockHash, SnarkBlockVerifyError)>,
52    },
53    Pending {
54        time: redux::Timestamp,
55        block: VerifiableBlockWithHash,
56        on_success: redux::Callback<BlockHash>,
57        on_error: redux::Callback<(BlockHash, SnarkBlockVerifyError)>,
58    },
59    Error {
60        time: redux::Timestamp,
61        block: VerifiableBlockWithHash,
62        error: SnarkBlockVerifyError,
63    },
64    Success {
65        time: redux::Timestamp,
66        block: VerifiableBlockWithHash,
67    },
68}
69
70impl SnarkBlockVerifyStatus {
71    pub fn is_init(&self) -> bool {
72        matches!(self, Self::Init { .. })
73    }
74
75    pub fn is_pending(&self) -> bool {
76        matches!(self, Self::Pending { .. })
77    }
78
79    pub fn is_finished(&self) -> bool {
80        matches!(self, Self::Error { .. } | Self::Success { .. })
81    }
82
83    pub fn block(&self) -> &VerifiableBlockWithHash {
84        match self {
85            Self::Init { block, .. } => block,
86            Self::Pending { block, .. } => block,
87            Self::Error { block, .. } => block,
88            Self::Success { block, .. } => block,
89        }
90    }
91}