snark_verifier/system/halo2/
transcript.rs

1//! Transcripts implemented with both `halo2_proofs::transcript` and
2//! `crate::util::transcript`.
3use crate::halo2_proofs;
4use crate::{
5    loader::native::{self, NativeLoader},
6    util::{
7        arithmetic::CurveAffine,
8        transcript::{Transcript, TranscriptRead, TranscriptWrite},
9    },
10    Error,
11};
12use halo2_proofs::transcript::{Blake2bRead, Blake2bWrite, Challenge255};
13use pairing::group::ff::FromUniformBytes;
14use std::io::{Read, Write};
15
16#[cfg(feature = "loader_evm")]
17pub mod evm;
18
19#[cfg(feature = "loader_halo2")]
20pub mod halo2;
21
22impl<C: CurveAffine, R: Read> Transcript<C, NativeLoader> for Blake2bRead<R, C, Challenge255<C>>
23where
24    C::Scalar: FromUniformBytes<64>,
25{
26    fn loader(&self) -> &NativeLoader {
27        &native::LOADER
28    }
29
30    fn squeeze_challenge(&mut self) -> C::Scalar {
31        *halo2_proofs::transcript::Transcript::squeeze_challenge_scalar::<C::Scalar>(self)
32    }
33
34    fn common_ec_point(&mut self, ec_point: &C) -> Result<(), Error> {
35        halo2_proofs::transcript::Transcript::common_point(self, *ec_point)
36            .map_err(|err| Error::Transcript(err.kind(), err.to_string()))
37    }
38
39    fn common_scalar(&mut self, scalar: &C::Scalar) -> Result<(), Error> {
40        halo2_proofs::transcript::Transcript::common_scalar(self, *scalar)
41            .map_err(|err| Error::Transcript(err.kind(), err.to_string()))
42    }
43}
44
45impl<C: CurveAffine, R: Read> TranscriptRead<C, NativeLoader> for Blake2bRead<R, C, Challenge255<C>>
46where
47    C::Scalar: FromUniformBytes<64>,
48{
49    fn read_scalar(&mut self) -> Result<C::Scalar, Error> {
50        halo2_proofs::transcript::TranscriptRead::read_scalar(self)
51            .map_err(|err| Error::Transcript(err.kind(), err.to_string()))
52    }
53
54    fn read_ec_point(&mut self) -> Result<C, Error> {
55        halo2_proofs::transcript::TranscriptRead::read_point(self)
56            .map_err(|err| Error::Transcript(err.kind(), err.to_string()))
57    }
58}
59
60impl<C: CurveAffine, W: Write> Transcript<C, NativeLoader> for Blake2bWrite<W, C, Challenge255<C>>
61where
62    C::Scalar: FromUniformBytes<64>,
63{
64    fn loader(&self) -> &NativeLoader {
65        &native::LOADER
66    }
67
68    fn squeeze_challenge(&mut self) -> C::Scalar {
69        *halo2_proofs::transcript::Transcript::squeeze_challenge_scalar::<C::Scalar>(self)
70    }
71
72    fn common_ec_point(&mut self, ec_point: &C) -> Result<(), Error> {
73        halo2_proofs::transcript::Transcript::common_point(self, *ec_point)
74            .map_err(|err| Error::Transcript(err.kind(), err.to_string()))
75    }
76
77    fn common_scalar(&mut self, scalar: &C::Scalar) -> Result<(), Error> {
78        halo2_proofs::transcript::Transcript::common_scalar(self, *scalar)
79            .map_err(|err| Error::Transcript(err.kind(), err.to_string()))
80    }
81}
82
83impl<C: CurveAffine> TranscriptWrite<C> for Blake2bWrite<Vec<u8>, C, Challenge255<C>>
84where
85    C::Scalar: FromUniformBytes<64>,
86{
87    fn write_scalar(&mut self, scalar: C::Scalar) -> Result<(), Error> {
88        halo2_proofs::transcript::TranscriptWrite::write_scalar(self, scalar)
89            .map_err(|err| Error::Transcript(err.kind(), err.to_string()))
90    }
91
92    fn write_ec_point(&mut self, ec_point: C) -> Result<(), Error> {
93        halo2_proofs::transcript::TranscriptWrite::write_point(self, ec_point)
94            .map_err(|err| Error::Transcript(err.kind(), err.to_string()))
95    }
96}