use std::fmt;
use crate::{prover::verify_proof, ProvingKey, SP1VerificationError, StatusCode};
use anyhow::Result;
use sp1_core_machine::io::SP1Stdin;
use sp1_primitives::types::Elf;
use sp1_prover::{worker::SP1NodeCore, SP1VerifyingKey, SP1_CIRCUIT_VERSION};
mod execute;
mod prove;
pub use execute::ExecuteRequest;
pub(crate) use prove::BaseProveRequest;
pub use prove::ProveRequest;
use crate::SP1ProofWithPublicValues;
pub trait Prover: Clone + Send + Sync {
type ProvingKey: ProvingKey;
type Error: fmt::Debug + fmt::Display;
type ProveRequest<'a>: ProveRequest<'a, Self>
where
Self: 'a;
fn inner(&self) -> &SP1NodeCore;
fn version(&self) -> &str {
SP1_CIRCUIT_VERSION
}
fn setup(&self, elf: Elf) -> Result<Self::ProvingKey, Self::Error>;
fn prove<'a>(&'a self, pk: &'a Self::ProvingKey, stdin: SP1Stdin) -> Self::ProveRequest<'a>;
fn execute(&self, elf: Elf, stdin: SP1Stdin) -> ExecuteRequest<'_, Self> {
ExecuteRequest::new(self, elf, stdin)
}
fn verify(
&self,
proof: &SP1ProofWithPublicValues,
vkey: &SP1VerifyingKey,
status_code: Option<StatusCode>,
) -> Result<(), SP1VerificationError> {
verify_proof(self.inner(), self.version(), proof, vkey, status_code)
}
}