sp1_verifier/
recursion_vks.rs1use serde::{Deserialize, Serialize};
2use slop_challenger::IopCtx;
3use sp1_hypercube::{verify_merkle_proof, HashableKey, MachineVerifyingKey, MerkleProof};
4use sp1_primitives::SP1GlobalContext;
5
6const 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}