use ark_ec::pairing::Pairing;
use ark_ec::AffineRepr;
use ark_poly::{EvaluationDomain, GeneralEvaluationDomain};
use ark_serialize::*;
use ark_std::{vec, vec::Vec};
use crate::pcs::kzg::lagrange::LagrangianCK;
use crate::pcs::kzg::urs::URS;
use crate::pcs::{CommitterKey, PcsParams, RawVerifierKey, VerifierKey};
impl<E: Pairing> PcsParams for URS<E> {
type CK = KzgCommitterKey<E::G1Affine>;
type VK = KzgVerifierKey<E>;
type RVK = RawKzgVerifierKey<E>;
fn ck(&self) -> Self::CK {
let monomial = MonomialCK {
powers_in_g1: self.powers_in_g1.clone(),
};
KzgCommitterKey {
monomial,
lagrangian: None,
}
}
fn ck_with_lagrangian(&self, domain_size: usize) -> Self::CK {
let domain = GeneralEvaluationDomain::new(domain_size).unwrap();
assert_eq!(
domain.size(),
domain_size,
"domains of size {} are not supported",
domain_size
);
assert!(domain_size <= self.powers_in_g1.len());
let monomial = MonomialCK {
powers_in_g1: self.powers_in_g1[0..domain_size].to_vec(),
};
let lagrangian = Some(monomial.to_lagrangian(domain));
KzgCommitterKey {
monomial,
lagrangian,
}
}
fn vk(&self) -> Self::VK {
self.raw_vk().prepare()
}
fn raw_vk(&self) -> Self::RVK {
assert!(self.powers_in_g1.len() > 0, "no G1 generator");
assert!(
self.powers_in_g2.len() > 1,
"{} powers in G2",
self.powers_in_g2.len()
);
RawKzgVerifierKey {
g1: self.powers_in_g1[0],
g2: self.powers_in_g2[0],
tau_in_g2: self.powers_in_g2[1],
}
}
}
#[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
pub struct KzgCommitterKey<G: AffineRepr> {
pub monomial: MonomialCK<G>,
pub lagrangian: Option<LagrangianCK<G>>,
}
#[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
pub struct MonomialCK<G: AffineRepr> {
pub(crate) powers_in_g1: Vec<G>,
}
impl<G: AffineRepr> CommitterKey for MonomialCK<G> {
fn max_degree(&self) -> usize {
self.powers_in_g1.len() - 1
}
}
impl<G: AffineRepr> CommitterKey for KzgCommitterKey<G> {
fn max_degree(&self) -> usize {
self.monomial.max_degree()
}
}
#[derive(Clone, Debug, Eq, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct RawKzgVerifierKey<E: Pairing> {
pub g1: E::G1Affine,
pub g2: E::G2Affine,
pub tau_in_g2: E::G2Affine, }
impl<E: Pairing> RawVerifierKey for RawKzgVerifierKey<E> {
type VK = KzgVerifierKey<E>;
fn prepare(&self) -> KzgVerifierKey<E> {
KzgVerifierKey {
g1: self.g1,
g2: self.g2.into(),
tau_in_g2: self.tau_in_g2.into(),
}
}
}
#[derive(Clone, Debug)]
pub struct KzgVerifierKey<E: Pairing> {
pub g1: E::G1Affine,
pub g2: E::G2Prepared,
pub tau_in_g2: E::G2Prepared, }
impl<E: Pairing> VerifierKey for KzgVerifierKey<E> {}
impl<E: Pairing> From<KzgVerifierKey<E>> for KzgCommitterKey<E::G1Affine> {
fn from(vk: KzgVerifierKey<E>) -> Self {
let monomial = MonomialCK {
powers_in_g1: vec![vk.g1],
};
Self {
monomial,
lagrangian: None,
}
}
}