Skip to main content

sp1_core_executor/
subproof.rs

1//! Types and methods for subproof verification inside the [`crate::Executor`].
2
3use std::sync::Arc;
4
5use sp1_hypercube::{
6    MachineVerifierConfigError, MachineVerifyingKey, SP1InnerPcs, SP1PcsProofInner,
7};
8
9use crate::SP1RecursionProof;
10use sp1_primitives::SP1GlobalContext;
11
12/// Verifier used in runtime when `sp1_zkvm::precompiles::verify::verify_sp1_proof` is called. This
13/// is then used to sanity check that the user passed in the correct proof; the actual constraints
14/// happen in the recursion layer.
15///
16/// This needs to be passed in rather than written directly since the actual implementation relies
17/// on crates in recursion that depend on sp1-core.
18pub trait SubproofVerifier: Sync + Send {
19    /// Verify a deferred proof.
20    fn verify_deferred_proof(
21        &self,
22        proof: &SP1RecursionProof<SP1GlobalContext, SP1PcsProofInner>,
23        vk: &MachineVerifyingKey<SP1GlobalContext>,
24        vk_hash: [u64; 4],
25        committed_value_digest: [u64; 4],
26    ) -> Result<(), MachineVerifierConfigError<SP1GlobalContext, SP1InnerPcs>>;
27}
28
29/// A dummy verifier which does nothing.
30pub struct NoOpSubproofVerifier;
31
32impl SubproofVerifier for NoOpSubproofVerifier {
33    fn verify_deferred_proof(
34        &self,
35        _proof: &SP1RecursionProof<SP1GlobalContext, SP1PcsProofInner>,
36        _vk: &MachineVerifyingKey<SP1GlobalContext>,
37        _vk_hash: [u64; 4],
38        _committed_value_digest: [u64; 4],
39    ) -> Result<(), MachineVerifierConfigError<SP1GlobalContext, SP1InnerPcs>> {
40        Ok(())
41    }
42}
43
44// Implement subproof verifier for pointer types
45
46impl<V> SubproofVerifier for &'_ V
47where
48    V: SubproofVerifier + ?Sized,
49{
50    fn verify_deferred_proof(
51        &self,
52        proof: &SP1RecursionProof<SP1GlobalContext, SP1PcsProofInner>,
53        vk: &MachineVerifyingKey<SP1GlobalContext>,
54        vk_hash: [u64; 4],
55        committed_value_digest: [u64; 4],
56    ) -> Result<(), MachineVerifierConfigError<SP1GlobalContext, SP1InnerPcs>> {
57        (*self).verify_deferred_proof(proof, vk, vk_hash, committed_value_digest)
58    }
59}
60
61impl<V> SubproofVerifier for Arc<V>
62where
63    V: SubproofVerifier + ?Sized,
64{
65    fn verify_deferred_proof(
66        &self,
67        proof: &SP1RecursionProof<SP1GlobalContext, SP1PcsProofInner>,
68        vk: &MachineVerifyingKey<SP1GlobalContext>,
69        vk_hash: [u64; 4],
70        committed_value_digest: [u64; 4],
71    ) -> Result<(), MachineVerifierConfigError<SP1GlobalContext, SP1InnerPcs>> {
72        self.as_ref().verify_deferred_proof(proof, vk, vk_hash, committed_value_digest)
73    }
74}
75
76impl<V> SubproofVerifier for Box<V>
77where
78    V: SubproofVerifier + ?Sized,
79{
80    fn verify_deferred_proof(
81        &self,
82        proof: &SP1RecursionProof<SP1GlobalContext, SP1PcsProofInner>,
83        vk: &MachineVerifyingKey<SP1GlobalContext>,
84        vk_hash: [u64; 4],
85        committed_value_digest: [u64; 4],
86    ) -> Result<(), MachineVerifierConfigError<SP1GlobalContext, SP1InnerPcs>> {
87        self.as_ref().verify_deferred_proof(proof, vk, vk_hash, committed_value_digest)
88    }
89}