Skip to main content

sp1_hypercube/prover/
cpu.rs

1use slop_algebra::extension::BinomialExtensionField;
2use slop_challenger::IopCtx;
3use slop_jagged::{DefaultJaggedProver, JaggedProver};
4use slop_multilinear::MultilinearPcsVerifier;
5use slop_stacked::StackedPcsProver;
6use sp1_primitives::{SP1Field, SP1GlobalContext};
7
8use super::{DefaultTraceGenerator, ShardProver, SimpleProver, ZerocheckAir};
9use crate::{
10    prover::SP1MerkleTreeProver, GkrProverImpl, InnerSC, LogupGkrCpuTraceGenerator, SP1Pcs,
11    ShardContextImpl, ShardVerifier,
12};
13
14type SC<GC, Verifier, A> = ShardContextImpl<GC, Verifier, A>;
15
16/// A CPU shard prover.
17pub type CpuShardProver<GC, Verifier, PcsComponents, A> =
18    ShardProver<GC, SC<GC, Verifier, A>, PcsComponents>;
19
20/// A CPU simple prover.
21pub type CpuSimpleProver<GC, Verifier, PcsComponents, A> =
22    SimpleProver<GC, SC<GC, Verifier, A>, CpuShardProver<GC, Verifier, PcsComponents, A>>;
23
24impl<GC, Verifier, A, PcsComponents> CpuShardProver<GC, Verifier, PcsComponents, A>
25where
26    GC: IopCtx,
27    Verifier: MultilinearPcsVerifier<GC>,
28    PcsComponents: DefaultJaggedProver<GC, Verifier>,
29    A: ZerocheckAir<GC::F, GC::EF>,
30{
31    /// Create a new CPU prover.
32    #[must_use]
33    pub fn new(verifier: ShardVerifier<GC, ShardContextImpl<GC, Verifier, A>>) -> Self {
34        // Construct the shard prover.
35        let ShardVerifier { jagged_pcs_verifier: pcs_verifier, machine } = verifier;
36        let pcs_prover = JaggedProver::from_verifier(&pcs_verifier);
37        let trace_generator = DefaultTraceGenerator::new(machine);
38        let logup_gkr_trace_generator = LogupGkrCpuTraceGenerator::default();
39        let logup_gkr_prover = GkrProverImpl::new(logup_gkr_trace_generator);
40
41        Self::from_components(trace_generator, logup_gkr_prover, pcs_prover)
42    }
43}
44
45/// Create a [`SimpleProver`] from a verifier with a single permit.
46///
47/// This is the recommended way to create a prover for tests and development.
48#[must_use]
49pub fn simple_prover<A>(
50    verifier: ShardVerifier<SP1GlobalContext, InnerSC<A>>,
51) -> CpuSimpleProver<
52    SP1GlobalContext,
53    SP1Pcs<SP1GlobalContext>,
54    StackedPcsProver<SP1MerkleTreeProver, SP1GlobalContext>,
55    A,
56>
57where
58    A: ZerocheckAir<SP1Field, BinomialExtensionField<SP1Field, 4>>,
59{
60    let shard_prover = CpuShardProver::new(verifier.clone());
61    SimpleProver::new(verifier, shard_prover)
62}