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
31pub const RECURSION_LOG_TRACE_AREA: usize = 27;
34pub 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 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 type CoreProver: CoreProver;
151 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}