Skip to main content

sp1_recursion_circuit/machine/
root.rs

1use std::marker::PhantomData;
2
3use super::PublicValuesOutputDigest;
4use crate::{
5    machine::{SP1CompressWithVKeyVerifier, SP1CompressWithVKeyWitnessVariable},
6    shard::RecursiveShardVerifier,
7    zerocheck::RecursiveVerifierConstraintFolder,
8    CircuitConfig,
9};
10use slop_air::Air;
11use slop_algebra::AbstractField;
12use sp1_hypercube::air::MachineAir;
13use sp1_primitives::{SP1Field, SP1GlobalContext};
14use sp1_recursion_compiler::ir::{Builder, Felt};
15
16/// A program to verify a single recursive proof representing a complete proof of program execution.
17///
18/// The root verifier is simply a `SP1CompressVerifier` with an assertion that the `is_complete`
19/// flag is set to true.
20#[derive(Debug, Clone, Copy)]
21pub struct SP1CompressRootVerifierWithVKey<C, A> {
22    _phantom: PhantomData<(C, A)>,
23}
24
25impl<C, A> SP1CompressRootVerifierWithVKey<C, A>
26where
27    C: CircuitConfig<Bit = Felt<SP1Field>>,
28    A: MachineAir<SP1Field> + for<'a> Air<RecursiveVerifierConstraintFolder<'a>>,
29{
30    pub fn verify(
31        builder: &mut Builder<C>,
32        machine: &RecursiveShardVerifier<SP1GlobalContext, A, C>,
33        input: SP1CompressWithVKeyWitnessVariable<C, SP1GlobalContext>,
34        value_assertions: bool,
35        kind: PublicValuesOutputDigest,
36    ) {
37        // Assert that the program is complete.
38        builder.assert_felt_eq(input.compress_var.is_complete, SP1Field::one());
39        // Verify the proof, as a compress proof.
40        SP1CompressWithVKeyVerifier::<C, SP1GlobalContext, _>::verify(
41            builder,
42            machine,
43            input,
44            value_assertions,
45            kind,
46        );
47    }
48}