Skip to main content

sp1_prover/
components.rs

1use std::sync::Arc;
2
3use sp1_core_executor::HEIGHT_THRESHOLD;
4use sp1_core_machine::riscv::RiscvAir;
5use sp1_hypercube::{
6    prover::{AirProver, CpuShardProver, SP1InnerPcsProver, SP1OuterPcsProver},
7    Machine, MachineVerifier, SP1InnerPcs, SP1OuterPcs, SP1Pcs, ShardContextImpl, ShardVerifier,
8};
9use sp1_primitives::{
10    fri_params::{core_fri_config, recursion_fri_config, shrink_fri_config, wrap_fri_config},
11    SP1Field, SP1GlobalContext, SP1OuterGlobalContext,
12};
13use sp1_verifier::compressed::{RECURSION_LOG_STACKING_HEIGHT, RECURSION_MAX_LOG_ROW_COUNT};
14use static_assertions::const_assert;
15
16pub const CORE_LOG_STACKING_HEIGHT: u32 = 21;
17pub const CORE_MAX_LOG_ROW_COUNT: usize = 22;
18
19const_assert!(HEIGHT_THRESHOLD <= (1 << CORE_MAX_LOG_ROW_COUNT));
20
21use sp1_recursion_machine::RecursionAir;
22
23const COMPRESS_DEGREE: usize = 3;
24const SHRINK_DEGREE: usize = 3;
25const WRAP_DEGREE: usize = 3;
26
27pub type CompressAir<F> = RecursionAir<F, COMPRESS_DEGREE, 2>;
28pub type ShrinkAir<F> = RecursionAir<F, SHRINK_DEGREE, 2>;
29pub type WrapAir<F> = RecursionAir<F, WRAP_DEGREE, 1>;
30
31// NOTE: This constant is not bound deterministically to the trace area of the compress shape used in
32// the prover. If dramatic changes to the compress shape are made, this constant may need to be updated.
33pub const RECURSION_LOG_TRACE_AREA: usize = 27;
34// NOTE: This constant is not bound deterministically to the trace area of the shrink shape used in
35// the prover. If dramatic changes to the shrink shape are made, this constant may need to be updated.
36pub const SHRINK_LOG_TRACE_AREA: usize = 25;
37pub const SHRINK_LOG_STACKING_HEIGHT: u32 = 18;
38pub const SHRINK_MAX_LOG_ROW_COUNT: usize = 19;
39
40pub(crate) const WRAP_LOG_STACKING_HEIGHT: u32 = 21;
41
42pub type CoreSC = ShardContextImpl<SP1GlobalContext, SP1Pcs<SP1GlobalContext>, RiscvAir<SP1Field>>;
43
44pub type RecursionSC =
45    ShardContextImpl<SP1GlobalContext, SP1Pcs<SP1GlobalContext>, CompressAir<SP1Field>>;
46pub type ShrinkSC =
47    ShardContextImpl<SP1GlobalContext, SP1Pcs<SP1GlobalContext>, ShrinkAir<SP1Field>>;
48
49pub type WrapSC =
50    ShardContextImpl<SP1OuterGlobalContext, SP1Pcs<SP1OuterGlobalContext>, WrapAir<SP1Field>>;
51
52pub trait CoreProver: AirProver<SP1GlobalContext, CoreSC> {
53    /// The default verifier for the core prover.
54    ///
55    /// The verifier fixes the parameters of the underlying proof system.
56    fn verifier(
57        machine: Machine<SP1Field, RiscvAir<SP1Field>>,
58    ) -> MachineVerifier<SP1GlobalContext, CoreSC> {
59        let core_log_stacking_height = CORE_LOG_STACKING_HEIGHT;
60        let core_max_log_row_count = CORE_MAX_LOG_ROW_COUNT;
61
62        let core_verifier = ShardVerifier::from_basefold_parameters(
63            core_fri_config(),
64            core_log_stacking_height,
65            core_max_log_row_count,
66            machine.clone(),
67        );
68
69        MachineVerifier::new(core_verifier)
70    }
71}
72
73impl<C> CoreProver for C where C: AirProver<SP1GlobalContext, CoreSC> {}
74
75pub trait RecursionProver: AirProver<SP1GlobalContext, RecursionSC> {
76    fn verifier() -> MachineVerifier<SP1GlobalContext, RecursionSC> {
77        let compress_log_stacking_height = RECURSION_LOG_STACKING_HEIGHT;
78        let compress_max_log_row_count = RECURSION_MAX_LOG_ROW_COUNT;
79
80        let machine = CompressAir::<SP1Field>::compress_machine();
81        let recursion_shard_verifier = ShardVerifier::from_basefold_parameters(
82            recursion_fri_config(),
83            compress_log_stacking_height,
84            compress_max_log_row_count,
85            machine.clone(),
86        );
87
88        MachineVerifier::new(recursion_shard_verifier)
89    }
90
91    fn shrink_verifier() -> MachineVerifier<SP1GlobalContext, ShrinkSC> {
92        let shrink_log_stacking_height = SHRINK_LOG_STACKING_HEIGHT;
93        let shrink_max_log_row_count = SHRINK_MAX_LOG_ROW_COUNT;
94
95        let machine = CompressAir::<SP1Field>::shrink_machine();
96        let recursion_shard_verifier = ShardVerifier::from_basefold_parameters(
97            shrink_fri_config(),
98            shrink_log_stacking_height,
99            shrink_max_log_row_count,
100            machine.clone(),
101        );
102
103        MachineVerifier::new(recursion_shard_verifier)
104    }
105}
106
107pub trait WrapProver: AirProver<SP1OuterGlobalContext, WrapSC> {
108    fn wrap_verifier() -> MachineVerifier<SP1OuterGlobalContext, WrapSC> {
109        let wrap_log_stacking_height = WRAP_LOG_STACKING_HEIGHT;
110        let wrap_max_log_row_count = RECURSION_MAX_LOG_ROW_COUNT;
111
112        let machine = WrapAir::<SP1Field>::wrap_machine();
113        let wrap_shard_verifier = ShardVerifier::from_basefold_parameters(
114            wrap_fri_config(),
115            wrap_log_stacking_height,
116            wrap_max_log_row_count,
117            machine.clone(),
118        );
119
120        MachineVerifier::new(wrap_shard_verifier)
121    }
122}
123
124impl<C> RecursionProver for C where C: AirProver<SP1GlobalContext, RecursionSC> {}
125
126impl<C> WrapProver for C where C: AirProver<SP1OuterGlobalContext, WrapSC> {}
127
128pub trait WrapProverBuilder<C: SP1ProverComponents>: Send + Sync + 'static {
129    fn build(&self) -> Arc<C::WrapProver>;
130}
131
132pub struct ReadyWrapProverBuilder<C: SP1ProverComponents> {
133    prover: Arc<C::WrapProver>,
134}
135
136impl<C: SP1ProverComponents> ReadyWrapProverBuilder<C> {
137    pub fn new(prover: Arc<C::WrapProver>) -> Self {
138        Self { prover }
139    }
140}
141
142impl<C: SP1ProverComponents> WrapProverBuilder<C> for ReadyWrapProverBuilder<C> {
143    fn build(&self) -> Arc<C::WrapProver> {
144        self.prover.clone()
145    }
146}
147
148pub trait SP1ProverComponents: Send + Sync + 'static + Sized {
149    /// The prover for making SP1 core proofs.
150    type CoreProver: CoreProver;
151    /// The prover for making SP1 recursive proofs.
152    type RecursionProver: RecursionProver;
153    type WrapProver: WrapProver;
154    type WrapProverBuilder: WrapProverBuilder<Self>;
155
156    fn core_verifier(
157        machine: Machine<SP1Field, RiscvAir<SP1Field>>,
158    ) -> MachineVerifier<SP1GlobalContext, CoreSC> {
159        <Self::CoreProver as CoreProver>::verifier(machine)
160    }
161
162    fn compress_verifier() -> MachineVerifier<SP1GlobalContext, RecursionSC> {
163        <Self::RecursionProver as RecursionProver>::verifier()
164    }
165
166    fn shrink_verifier() -> MachineVerifier<SP1GlobalContext, ShrinkSC> {
167        <Self::RecursionProver as RecursionProver>::shrink_verifier()
168    }
169
170    fn wrap_verifier() -> MachineVerifier<SP1OuterGlobalContext, WrapSC> {
171        <Self::WrapProver as WrapProver>::wrap_verifier()
172    }
173}
174
175pub struct CpuSP1ProverComponents;
176
177pub struct CpuWrapProverBuilder;
178
179impl WrapProverBuilder<CpuSP1ProverComponents> for CpuWrapProverBuilder {
180    fn build(&self) -> Arc<<CpuSP1ProverComponents as SP1ProverComponents>::WrapProver> {
181        let wrap_verifier = CpuSP1ProverComponents::wrap_verifier();
182        Arc::new(CpuShardProver::new(wrap_verifier.shard_verifier().clone()))
183    }
184}
185
186impl SP1ProverComponents for CpuSP1ProverComponents {
187    type CoreProver = CpuShardProver<
188        SP1GlobalContext,
189        SP1Pcs<SP1GlobalContext>,
190        SP1InnerPcsProver,
191        RiscvAir<SP1Field>,
192    >;
193    type RecursionProver =
194        CpuShardProver<SP1GlobalContext, SP1InnerPcs, SP1InnerPcsProver, CompressAir<SP1Field>>;
195    type WrapProver =
196        CpuShardProver<SP1OuterGlobalContext, SP1OuterPcs, SP1OuterPcsProver, WrapAir<SP1Field>>;
197    type WrapProverBuilder = CpuWrapProverBuilder;
198}