use super::{IntoSendFutureResult, Prover};
use crate::{ProvingKey, SP1ProofMode, SP1ProofWithPublicValues, StatusCode};
use sp1_build::Elf;
use sp1_core_executor::SP1ContextBuilder;
use sp1_core_machine::io::SP1Stdin;
use sp1_prover::SP1VerifyingKey;
#[derive(Clone)]
pub struct SP1ProvingKey {
pub(crate) vk: SP1VerifyingKey,
pub(crate) elf: Elf,
}
impl ProvingKey for SP1ProvingKey {
fn verifying_key(&self) -> &SP1VerifyingKey {
&self.vk
}
fn elf(&self) -> &Elf {
&self.elf
}
}
pub trait ProveRequest<'a, P>
where
Self: IntoSendFutureResult<SP1ProofWithPublicValues, P::Error> + Sized + Send,
P: Prover + 'a,
{
fn base(&mut self) -> &mut BaseProveRequest<'a, P>;
#[must_use]
fn mode(mut self, mode: SP1ProofMode) -> Self {
self.base().mode(mode);
self
}
#[must_use]
fn compressed(mut self) -> Self {
self.base().compressed();
self
}
#[must_use]
fn plonk(mut self) -> Self {
self.base().plonk();
self
}
#[must_use]
fn groth16(mut self) -> Self {
self.base().groth16();
self
}
#[must_use]
fn core(mut self) -> Self {
self.base().core();
self
}
#[must_use]
fn cycle_limit(mut self, cycle_limit: u64) -> Self {
self.base().cycle_limit(cycle_limit);
self
}
#[must_use]
fn deferred_proof_verification(mut self, value: bool) -> Self {
self.base().deferred_proof_verification(value);
self
}
#[must_use]
fn expected_exit_code(mut self, code: StatusCode) -> Self {
self.base().expected_exit_code(code);
self
}
#[must_use]
fn with_proof_nonce(mut self, nonce: [u32; 4]) -> Self {
self.base().context_builder.proof_nonce(nonce);
self
}
}
pub struct BaseProveRequest<'a, P: Prover> {
pub(crate) prover: &'a P,
pub(crate) pk: &'a P::ProvingKey,
pub(crate) stdin: SP1Stdin,
pub(crate) mode: SP1ProofMode,
pub(crate) context_builder: SP1ContextBuilder<'static>,
}
impl<'a, P: Prover> BaseProveRequest<'a, P> {
pub const fn new(prover: &'a P, pk: &'a P::ProvingKey, stdin: SP1Stdin) -> Self {
Self {
prover,
pk,
stdin,
mode: SP1ProofMode::Core,
context_builder: SP1ContextBuilder::new(),
}
}
pub fn compressed(&mut self) {
self.mode = SP1ProofMode::Compressed;
}
pub fn plonk(&mut self) {
self.mode = SP1ProofMode::Plonk;
}
pub fn groth16(&mut self) {
self.mode = SP1ProofMode::Groth16;
}
pub fn core(&mut self) {
self.mode = SP1ProofMode::Core;
}
pub fn mode(&mut self, mode: SP1ProofMode) {
self.mode = mode;
}
pub fn cycle_limit(&mut self, cycle_limit: u64) {
self.context_builder.max_cycles(cycle_limit);
}
pub fn deferred_proof_verification(&mut self, value: bool) {
self.context_builder.set_deferred_proof_verification(value);
}
pub fn expected_exit_code(&mut self, code: StatusCode) {
self.context_builder.expected_exit_code(code);
}
pub fn with_nonce(&mut self, nonce: [u32; 4]) {
self.context_builder.proof_nonce(nonce);
}
}