use midnight_proofs::{circuit::Layouter, plonk::Error, poly::CommitmentLabel};
use crate::{
field::AssignedNative,
verifier::{
kzg::VerifierQuery, transcript_gadget::TranscriptGadget, utils::AssignedBoundedScalar,
SelfEmulation,
},
};
#[derive(Clone, Debug)]
pub(crate) struct TrashEvaluated<S: SelfEmulation> {
pub(crate) trash_eval: AssignedNative<S::F>,
}
#[derive(Clone, Debug)]
pub(crate) struct Committed<S: SelfEmulation> {
trash_commitment: S::AssignedPoint,
}
#[derive(Clone, Debug)]
pub(crate) struct Evaluated<S: SelfEmulation> {
committed: Committed<S>,
pub(crate) evaluated: TrashEvaluated<S>,
}
pub(crate) fn read_committed<S: SelfEmulation>(
layouter: &mut impl Layouter<S::F>,
transcript_gadget: &mut TranscriptGadget<S>,
) -> Result<Committed<S>, Error> {
let trash_commitment = transcript_gadget.read_point(layouter)?;
Ok(Committed { trash_commitment })
}
impl<S: SelfEmulation> Committed<S> {
pub(crate) fn evaluate(
self,
layouter: &mut impl Layouter<S::F>,
transcript_gadget: &mut TranscriptGadget<S>,
) -> Result<Evaluated<S>, Error> {
let trash_eval = transcript_gadget.read_scalar(layouter)?;
Ok(Evaluated {
committed: self,
evaluated: TrashEvaluated { trash_eval },
})
}
}
impl<S: SelfEmulation> Evaluated<S> {
pub(crate) fn queries(
&self,
one: &AssignedBoundedScalar<S::F>, x: &AssignedNative<S::F>, ) -> Vec<VerifierQuery<S>> {
vec![VerifierQuery::new(
one,
x,
CommitmentLabel::NoLabel,
&self.committed.trash_commitment,
&self.evaluated.trash_eval,
)]
}
}