Skip to main content

sp1_verifier/
recursion_vks.rs

1use serde::{Deserialize, Serialize};
2use slop_challenger::IopCtx;
3use sp1_hypercube::{verify_merkle_proof, HashableKey, MachineVerifyingKey, MerkleProof};
4use sp1_primitives::SP1GlobalContext;
5
6/// The serialized recursion verifying key data for this SP1 version.
7const VERIFIER_VK_DATA_BYTES: &[u8] = include_bytes!("../vk-artifacts/verifier_vks.bin");
8
9#[derive(Clone, Serialize, Debug, PartialEq, Eq, Deserialize)]
10pub struct VerifierRecursionVks {
11    pub root: <SP1GlobalContext as IopCtx>::Digest,
12    pub vk_verification: bool,
13    pub num_keys: usize,
14}
15
16impl Default for VerifierRecursionVks {
17    fn default() -> Self {
18        bincode::deserialize(VERIFIER_VK_DATA_BYTES).unwrap()
19    }
20}
21
22impl VerifierRecursionVks {
23    pub fn vk_verification(&self) -> bool {
24        self.vk_verification
25    }
26
27    pub fn root(&self) -> <SP1GlobalContext as IopCtx>::Digest {
28        self.root
29    }
30
31    pub fn num_keys(&self) -> usize {
32        self.num_keys
33    }
34
35    pub fn verify(
36        &self,
37        proof: &MerkleProof<SP1GlobalContext>,
38        vk: &MachineVerifyingKey<SP1GlobalContext>,
39    ) -> bool {
40        if !self.vk_verification {
41            return true;
42        }
43        verify_merkle_proof(proof, vk.hash_koalabear(), self.root).is_ok()
44    }
45}