snark_verifier/util/
transcript.rs

1//! Transcript traits.
2
3use crate::{
4    loader::{native::NativeLoader, Loader},
5    {util::arithmetic::CurveAffine, Error},
6};
7
8/// Common methods for prover and verifier.
9pub trait Transcript<C, L>
10where
11    C: CurveAffine,
12    L: Loader<C>,
13{
14    /// Returns [`Loader`].
15    fn loader(&self) -> &L;
16
17    /// Squeeze a challenge.
18    fn squeeze_challenge(&mut self) -> L::LoadedScalar;
19
20    /// Squeeze `n` challenges.
21    fn squeeze_n_challenges(&mut self, n: usize) -> Vec<L::LoadedScalar> {
22        (0..n).map(|_| self.squeeze_challenge()).collect()
23    }
24
25    /// Update with an elliptic curve point.
26    fn common_ec_point(&mut self, ec_point: &L::LoadedEcPoint) -> Result<(), Error>;
27
28    /// Update with a scalar.
29    fn common_scalar(&mut self, scalar: &L::LoadedScalar) -> Result<(), Error>;
30}
31
32/// Transcript for verifier.
33pub trait TranscriptRead<C, L>: Transcript<C, L>
34where
35    C: CurveAffine,
36    L: Loader<C>,
37{
38    /// Read a scalar.
39    fn read_scalar(&mut self) -> Result<L::LoadedScalar, Error>;
40
41    /// Read `n` scalar.
42    fn read_n_scalars(&mut self, n: usize) -> Result<Vec<L::LoadedScalar>, Error> {
43        (0..n).map(|_| self.read_scalar()).collect()
44    }
45
46    /// Read a elliptic curve point.
47    fn read_ec_point(&mut self) -> Result<L::LoadedEcPoint, Error>;
48
49    /// Read `n` elliptic curve point.
50    fn read_n_ec_points(&mut self, n: usize) -> Result<Vec<L::LoadedEcPoint>, Error> {
51        (0..n).map(|_| self.read_ec_point()).collect()
52    }
53}
54
55/// Transcript for prover.
56pub trait TranscriptWrite<C: CurveAffine>: Transcript<C, NativeLoader> {
57    /// Write a scalar.
58    fn write_scalar(&mut self, scalar: C::Scalar) -> Result<(), Error>;
59
60    /// Write a elliptic curve point.
61    fn write_ec_point(&mut self, ec_point: C) -> Result<(), Error>;
62}