use bellpepper_core::{Circuit, SynthesisError};
use pairing::MultiMillerLoop;
use rand_core::RngCore;
use crate::{
gpu,
groth16::{
Proof, SuprasealParameters,
params::ParameterSource,
prover::{create_proof_batch_priority, create_random_proof_batch_priority},
},
};
pub fn create_proof<E, C, P: ParameterSource<E>>(
circuit: C,
params: &SuprasealParameters<E>,
r: E::Fr,
s: E::Fr,
) -> Result<Proof<E>, SynthesisError>
where
E: MultiMillerLoop,
C: Circuit<E::Fr> + Send,
E::Fr: gpu::GpuName,
E::G1Affine: gpu::GpuName,
E::G2Affine: gpu::GpuName,
{
let proofs = create_proof_batch_priority(vec![circuit], params, vec![r], vec![s], false)?;
Ok(proofs.into_iter().next().unwrap())
}
pub fn create_random_proof<E, C, R>(
circuit: C,
params: &SuprasealParameters<E>,
rng: &mut R,
) -> Result<Proof<E>, SynthesisError>
where
E: MultiMillerLoop,
C: Circuit<E::Fr> + Send,
R: RngCore,
E::Fr: gpu::GpuName,
E::G1Affine: gpu::GpuName,
E::G2Affine: gpu::GpuName,
{
let proofs = create_random_proof_batch_priority(vec![circuit], params, rng, false)?;
Ok(proofs.into_iter().next().unwrap())
}
pub fn create_proof_batch<E, C>(
circuits: Vec<C>,
params: &SuprasealParameters<E>,
r: Vec<E::Fr>,
s: Vec<E::Fr>,
) -> Result<Vec<Proof<E>>, SynthesisError>
where
E: MultiMillerLoop,
C: Circuit<E::Fr> + Send,
E::Fr: gpu::GpuName,
E::G1Affine: gpu::GpuName,
E::G2Affine: gpu::GpuName,
{
create_proof_batch_priority(circuits, params, r, s, false)
}
pub fn create_random_proof_batch<E, C, R>(
circuits: Vec<C>,
params: &SuprasealParameters<E>,
rng: &mut R,
) -> Result<Vec<Proof<E>>, SynthesisError>
where
E: MultiMillerLoop,
C: Circuit<E::Fr> + Send,
R: RngCore,
E::Fr: gpu::GpuName,
E::G1Affine: gpu::GpuName,
E::G2Affine: gpu::GpuName,
{
create_random_proof_batch_priority(circuits, params, rng, false)
}
pub fn create_proof_in_priority<E, C>(
circuit: C,
params: &SuprasealParameters<E>,
r: E::Fr,
s: E::Fr,
) -> Result<Proof<E>, SynthesisError>
where
E: MultiMillerLoop,
C: Circuit<E::Fr> + Send,
E::Fr: gpu::GpuName,
E::G1Affine: gpu::GpuName,
E::G2Affine: gpu::GpuName,
{
let proofs = create_proof_batch_priority(vec![circuit], params, vec![r], vec![s], true)?;
Ok(proofs.into_iter().next().unwrap())
}
pub fn create_random_proof_in_priority<E, C, R>(
circuit: C,
params: &SuprasealParameters<E>,
rng: &mut R,
) -> Result<Proof<E>, SynthesisError>
where
E: MultiMillerLoop,
C: Circuit<E::Fr> + Send,
R: RngCore,
E::Fr: gpu::GpuName,
E::G1Affine: gpu::GpuName,
E::G2Affine: gpu::GpuName,
{
let proofs = create_random_proof_batch_priority(vec![circuit], params, rng, true)?;
Ok(proofs.into_iter().next().unwrap())
}
pub fn create_proof_batch_in_priority<E, C>(
circuits: Vec<C>,
params: &SuprasealParameters<E>,
r: Vec<E::Fr>,
s: Vec<E::Fr>,
) -> Result<Vec<Proof<E>>, SynthesisError>
where
E: MultiMillerLoop,
C: Circuit<E::Fr> + Send,
E::Fr: gpu::GpuName,
E::G1Affine: gpu::GpuName,
E::G2Affine: gpu::GpuName,
{
create_proof_batch_priority(circuits, params, r, s, true)
}
pub fn create_random_proof_batch_in_priority<E, C, R>(
circuits: Vec<C>,
params: &SuprasealParameters<E>,
rng: &mut R,
) -> Result<Vec<Proof<E>>, SynthesisError>
where
E: MultiMillerLoop,
C: Circuit<E::Fr> + Send,
R: RngCore,
E::Fr: gpu::GpuName,
E::G1Affine: gpu::GpuName,
E::G2Affine: gpu::GpuName,
{
create_random_proof_batch_priority(circuits, params, rng, true)
}