poly_commit/kzg/
key.rs

1use zkstd::common::{CurveAffine, Decode, Encode, Pairing, Vec};
2
3use crate::{msm_curve_addition, Coefficients, Commitment};
4
5#[derive(Clone, Debug, PartialEq, Decode, Encode, Default)]
6pub struct CommitmentKey<C: CurveAffine> {
7    pub bases: Vec<C>,
8}
9
10impl<C: CurveAffine> CommitmentKey<C> {
11    pub fn trim(&self, truncated_degree: usize) -> Self {
12        Self {
13            bases: self.bases[..=truncated_degree].to_vec(),
14        }
15    }
16
17    pub fn commit(&self, coeffs: &Coefficients<C::Scalar>) -> Commitment<C> {
18        Commitment::new(msm_curve_addition(&self.bases, coeffs))
19    }
20}
21
22/// Evaluation Key is used to verify opening proofs made about a committed
23/// polynomial.
24#[derive(Clone, Debug, Eq, Decode, Encode, PartialEq, Default)]
25pub struct EvaluationKey<P: Pairing> {
26    /// Kzg G1 generator
27    pub g: P::G1Affine,
28    /// Kzg G2 generator
29    pub h: P::G2Affine,
30    /// \beta times the above generator of G2.
31    pub beta_h: P::G2Affine,
32    /// The generator of G2, prepared for use in pairings
33    pub prepared_h: P::G2PairngRepr,
34    /// \beta times the above generator of G2, prepared for use in pairings
35    pub prepared_beta_h: P::G2PairngRepr,
36}
37
38impl<P: Pairing> EvaluationKey<P> {
39    pub fn new(g: P::G1Affine, h: P::G2Affine, beta_h: P::G2Affine) -> Self {
40        let prepared_h = P::G2PairngRepr::from(h);
41        let prepared_beta_h = P::G2PairngRepr::from(beta_h);
42        Self {
43            g,
44            h,
45            beta_h,
46            prepared_h,
47            prepared_beta_h,
48        }
49    }
50}