sov_stf_runner/
verifier.rs

1use std::marker::PhantomData;
2
3use sov_rollup_interface::da::DaVerifier;
4use sov_rollup_interface::stf::StateTransitionFunction;
5use sov_rollup_interface::zk::{Zkvm, ZkvmGuest};
6
7use crate::StateTransitionData;
8
9/// Verifies a state transition
10pub struct StateTransitionVerifier<ST, Da, Zk>
11where
12    Da: DaVerifier,
13    Zk: Zkvm,
14    ST: StateTransitionFunction<Zk, Da::Spec>,
15{
16    app: ST,
17    da_verifier: Da,
18    phantom: PhantomData<Zk>,
19}
20impl<ST, Da, Zk> StateTransitionVerifier<ST, Da, Zk>
21where
22    Da: DaVerifier,
23    Zk: ZkvmGuest,
24    ST: StateTransitionFunction<Zk, Da::Spec>,
25{
26    /// Create a [`StateTransitionVerifier`]
27    pub fn new(app: ST, da_verifier: Da) -> Self {
28        Self {
29            app,
30            da_verifier,
31            phantom: Default::default(),
32        }
33    }
34
35    /// Verify the next block
36    pub fn run_block(&mut self, zkvm: Zk) -> Result<ST::StateRoot, Da::Error> {
37        let mut data: StateTransitionData<_, _, Da::Spec> = zkvm.read_from_host();
38        let validity_condition = self.da_verifier.verify_relevant_tx_list(
39            &data.da_block_header,
40            &data.blobs,
41            data.inclusion_proof,
42            data.completeness_proof,
43        )?;
44
45        let result = self.app.apply_slot(
46            &data.pre_state_root,
47            data.state_transition_witness,
48            &data.da_block_header,
49            &validity_condition,
50            &mut data.blobs,
51        );
52
53        zkvm.commit(&result.state_root);
54        Ok(result.state_root)
55    }
56}