use snarkvm_algorithms::traits::SNARK;
use snarkvm_fields::PrimeField;
use snarkvm_r1cs::{errors::SynthesisError, ConstraintSystem};
use crate::{
traits::alloc::AllocGadget,
AllocBytesGadget,
FromFieldElementsGadget,
MergeGadget,
ToBitsLEGadget,
ToBytesGadget,
ToConstraintFieldGadget,
ToMinimalBitsGadget,
UInt8,
};
pub trait PrepareGadget<T, F: PrimeField> {
fn prepare<CS: ConstraintSystem<F>>(&self, cs: CS) -> Result<T, SynthesisError>;
}
pub trait SNARKVerifierGadget<S: SNARK> {
type PreparedVerificationKeyGadget: Clone;
type VerificationKeyGadget: AllocGadget<S::VerifyingKey, S::BaseField>
+ ToConstraintFieldGadget<S::BaseField>
+ ToBytesGadget<S::BaseField>
+ PrepareGadget<Self::PreparedVerificationKeyGadget, S::BaseField>
+ AllocBytesGadget<Vec<u8>, S::BaseField>
+ ToMinimalBitsGadget<S::BaseField>;
type ProofGadget: AllocGadget<S::Proof, S::BaseField> + AllocBytesGadget<Vec<u8>, S::BaseField>;
type InputGadget: Clone
+ AllocGadget<Vec<S::ScalarField>, S::BaseField>
+ ToBitsLEGadget<S::BaseField>
+ FromFieldElementsGadget<S::ScalarField, S::BaseField>
+ MergeGadget<S::BaseField>
+ ?Sized;
fn input_gadget_from_bytes<CS: ConstraintSystem<S::BaseField>>(
cs: CS,
bytes: &[UInt8],
) -> Result<Self::InputGadget, SynthesisError>;
fn check_verify<CS: ConstraintSystem<S::BaseField>>(
mut cs: CS,
verification_key: &Self::VerificationKeyGadget,
input: &Self::InputGadget,
proof: &Self::ProofGadget,
) -> Result<(), SynthesisError> {
let prepared_verification_key = verification_key.prepare(cs.ns(|| "prepare"))?;
Self::prepared_check_verify(
cs.ns(|| "prepared verification"),
&prepared_verification_key,
input,
proof,
)
}
fn prepared_check_verify<CS: ConstraintSystem<S::BaseField>>(
cs: CS,
prepared_verification_key: &Self::PreparedVerificationKeyGadget,
input: &Self::InputGadget,
proof: &Self::ProofGadget,
) -> Result<(), SynthesisError>;
}