sov_stf_runner/
verifier.rs1use 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
9pub 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 pub fn new(app: ST, da_verifier: Da) -> Self {
28 Self {
29 app,
30 da_verifier,
31 phantom: Default::default(),
32 }
33 }
34
35 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}