use crate::helpers::{SerdeCurveAffine, SerdeFormat, SerdePrimeField};
use crate::{
arithmetic::CurveAffine,
helpers::{polynomial_slice_byte_length, read_polynomial_vec, write_polynomial_slice},
poly::{Coeff, ExtendedLagrangeCoeff, LagrangeCoeff, Polynomial},
};
pub use halo2_middleware::permutation::ArgumentMid;
use std::io;
pub(crate) mod keygen;
pub(crate) mod prover;
pub(crate) mod verifier;
#[derive(Clone, Debug)]
pub(crate) struct VerifyingKey<C: CurveAffine> {
commitments: Vec<C>,
}
impl<C: CurveAffine> VerifyingKey<C> {
pub(crate) fn write<W: io::Write>(&self, writer: &mut W, format: SerdeFormat) -> io::Result<()>
where
C: SerdeCurveAffine,
{
for commitment in &self.commitments {
commitment.write(writer, format)?;
}
Ok(())
}
pub(crate) fn read<R: io::Read>(
reader: &mut R,
argument: &ArgumentMid,
format: SerdeFormat,
) -> io::Result<Self>
where
C: SerdeCurveAffine,
{
let commitments = (0..argument.columns.len())
.map(|_| C::read(reader, format))
.collect::<Result<Vec<_>, _>>()?;
Ok(VerifyingKey { commitments })
}
pub(crate) fn bytes_length(&self, format: SerdeFormat) -> usize
where
C: SerdeCurveAffine,
{
self.commitments.len() * C::byte_length(format)
}
}
#[derive(Clone, Debug)]
pub(crate) struct ProvingKey<C: CurveAffine> {
permutations: Vec<Polynomial<C::Scalar, LagrangeCoeff>>,
polys: Vec<Polynomial<C::Scalar, Coeff>>,
pub(super) cosets: Vec<Polynomial<C::Scalar, ExtendedLagrangeCoeff>>,
}
impl<C: SerdeCurveAffine> ProvingKey<C>
where
C::Scalar: SerdePrimeField,
{
pub(super) fn read<R: io::Read>(reader: &mut R, format: SerdeFormat) -> io::Result<Self> {
let permutations = read_polynomial_vec(reader, format)?;
let polys = read_polynomial_vec(reader, format)?;
let cosets = read_polynomial_vec(reader, format)?;
Ok(ProvingKey {
permutations,
polys,
cosets,
})
}
pub(super) fn write<W: io::Write>(
&self,
writer: &mut W,
format: SerdeFormat,
) -> io::Result<()> {
write_polynomial_slice(&self.permutations, writer, format)?;
write_polynomial_slice(&self.polys, writer, format)?;
write_polynomial_slice(&self.cosets, writer, format)?;
Ok(())
}
}
impl<C: CurveAffine> ProvingKey<C> {
pub(super) fn bytes_length(&self) -> usize {
polynomial_slice_byte_length(&self.permutations)
+ polynomial_slice_byte_length(&self.polys)
+ polynomial_slice_byte_length(&self.cosets)
}
}