use crate::link::{EK, PP, VK};
use ark_ec::pairing::{Pairing, PairingOutput};
use ark_serialize::*;
use ark_std::vec::Vec;
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct Proof<E: Pairing> {
pub a: E::G1Affine,
pub b: E::G2Affine,
pub c: E::G1Affine,
pub d: E::G1Affine,
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct ProofWithLink<E: Pairing> {
pub groth16_proof: Proof<E>,
pub link_d: E::G1Affine,
pub link_pi: E::G1Affine,
}
impl<E: Pairing> Default for Proof<E> {
fn default() -> Self {
Self {
a: E::G1Affine::default(),
b: E::G2Affine::default(),
c: E::G1Affine::default(),
d: E::G1Affine::default(),
}
}
}
impl<E: Pairing> Default for ProofWithLink<E> {
fn default() -> Self {
Self {
groth16_proof: Proof::default(),
link_pi: E::G1Affine::default(),
link_d: E::G1Affine::default(),
}
}
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct VerifyingKey<E: Pairing> {
pub alpha_g1: E::G1Affine,
pub beta_g2: E::G2Affine,
pub gamma_g2: E::G2Affine,
pub delta_g2: E::G2Affine,
pub gamma_abc_g1: Vec<E::G1Affine>,
pub eta_gamma_inv_g1: E::G1Affine,
pub commit_witness_count: u32,
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct VerifyingKeyWithLink<E: Pairing> {
pub groth16_vk: VerifyingKey<E>,
pub link_pp: PP<E::G1Affine, E::G2Affine>,
pub link_bases: Vec<E::G1Affine>,
pub link_vk: VK<E::G2Affine>,
}
impl<E: Pairing> Default for VerifyingKey<E> {
fn default() -> Self {
Self {
alpha_g1: E::G1Affine::default(),
beta_g2: E::G2Affine::default(),
gamma_g2: E::G2Affine::default(),
delta_g2: E::G2Affine::default(),
gamma_abc_g1: Vec::new(),
eta_gamma_inv_g1: E::G1Affine::default(),
commit_witness_count: 0,
}
}
}
impl<E: Pairing> Default for VerifyingKeyWithLink<E> {
fn default() -> Self {
Self {
groth16_vk: VerifyingKey::default(),
link_pp: PP::<E::G1Affine, E::G2Affine>::default(),
link_bases: Vec::new(),
link_vk: VK::<E::G2Affine>::default(),
}
}
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct PreparedVerifyingKey<E: Pairing> {
pub vk: VerifyingKey<E>,
pub alpha_g1_beta_g2: PairingOutput<E>,
pub gamma_g2_neg_pc: E::G2Prepared,
pub delta_g2_neg_pc: E::G2Prepared,
}
impl<E: Pairing> From<PreparedVerifyingKey<E>> for VerifyingKey<E> {
fn from(other: PreparedVerifyingKey<E>) -> Self {
other.vk
}
}
impl<E: Pairing> From<&VerifyingKey<E>> for PreparedVerifyingKey<E> {
fn from(other: &VerifyingKey<E>) -> Self {
crate::prepare_verifying_key(other)
}
}
impl<E: Pairing> Default for PreparedVerifyingKey<E> {
fn default() -> Self {
Self {
vk: VerifyingKey::default(),
alpha_g1_beta_g2: PairingOutput::<E>::default(),
gamma_g2_neg_pc: E::G2Prepared::default(),
delta_g2_neg_pc: E::G2Prepared::default(),
}
}
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct ProvingKeyCommon<E: Pairing> {
pub beta_g1: E::G1Affine,
pub delta_g1: E::G1Affine,
pub eta_delta_inv_g1: E::G1Affine,
pub a_query: Vec<E::G1Affine>,
pub b_g1_query: Vec<E::G1Affine>,
pub b_g2_query: Vec<E::G2Affine>,
pub h_query: Vec<E::G1Affine>,
pub l_query: Vec<E::G1Affine>,
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct ProvingKey<E: Pairing> {
pub vk: VerifyingKey<E>,
pub common: ProvingKeyCommon<E>,
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct ProvingKeyWithLink<E: Pairing> {
pub vk: VerifyingKeyWithLink<E>,
pub common: ProvingKeyCommon<E>,
pub link_ek: EK<E::G1Affine>,
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct LinkPublicGenerators<E: Pairing> {
pub pedersen_gens: Vec<E::G1Affine>,
pub g1: E::G1Affine,
pub g2: E::G2Affine,
}
impl<E: Pairing> VerifyingKey<E> {
pub fn num_public_inputs(&self) -> u32 {
self.gamma_abc_g1.len() as u32 - self.commit_witness_count
}
pub fn num_committed_witnesses(&self) -> u32 {
self.commit_witness_count
}
pub fn get_commitment_key_for_witnesses(&self) -> Vec<E::G1Affine> {
let start = self.num_public_inputs();
let end = start + self.commit_witness_count;
let mut key = Vec::with_capacity(self.commit_witness_count as usize + 1);
key.extend_from_slice(&self.gamma_abc_g1[start as usize..end as usize]);
key.push(self.eta_gamma_inv_g1);
key
}
}