use crate::arithmetic::CurveAffine;
use crate::poly::commitment::{Guard, Params, MSM};
use crate::transcript::{EncodedChallenge, TranscriptRead};
use super::{verify_proof, Error, VerificationStrategy, VerifyingKey};
mod transcript;
pub use transcript::{ChallengeRecorder, TranscriptEvent};
mod vesta_lean;
#[derive(Debug)]
struct FingerprintStrategy<'params, C: CurveAffine> {
msm: MSM<'params, C>,
}
impl<'params, C: CurveAffine> FingerprintStrategy<'params, C> {
fn new(params: &'params Params<C>) -> Self {
FingerprintStrategy {
msm: MSM::new(params),
}
}
}
impl<'params, C: CurveAffine> VerificationStrategy<'params, C> for FingerprintStrategy<'params, C> {
type Output = MSM<'params, C>;
fn process<E: EncodedChallenge<C>>(
self,
f: impl FnOnce(MSM<'params, C>) -> Result<Guard<'params, C, E>, Error>,
) -> Result<Self::Output, Error> {
let guard = f(self.msm)?;
Ok(guard.use_challenges())
}
}
pub fn capture_proof_fingerprint<
'params,
C: CurveAffine,
E: EncodedChallenge<C>,
T: TranscriptRead<C, E>,
>(
params: &'params Params<C>,
vk: &VerifyingKey<C>,
instances: &[&[&[C::Scalar]]],
transcript: &mut T,
) -> Result<MSM<'params, C>, Error> {
verify_proof(
params,
vk,
FingerprintStrategy::new(params),
instances,
transcript,
)
}