ark_groth16/
data_structures.rsuse ark_crypto_primitives::sponge::Absorb;
use ark_ec::pairing::Pairing;
use ark_ff::PrimeField;
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,
}
impl<E: Pairing> Default for Proof<E> {
fn default() -> Self {
Self {
a: E::G1Affine::default(),
b: E::G2Affine::default(),
c: 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>,
}
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(),
}
}
}
impl<E> Absorb for VerifyingKey<E>
where
E: Pairing,
E::G1Affine: Absorb,
E::G2Affine: Absorb,
{
fn to_sponge_bytes(&self, dest: &mut Vec<u8>) {
self.alpha_g1.to_sponge_bytes(dest);
self.beta_g2.to_sponge_bytes(dest);
self.gamma_g2.to_sponge_bytes(dest);
self.delta_g2.to_sponge_bytes(dest);
self.gamma_abc_g1
.iter()
.for_each(|g| g.to_sponge_bytes(dest));
}
fn to_sponge_field_elements<F: PrimeField>(&self, dest: &mut Vec<F>) {
self.alpha_g1.to_sponge_field_elements(dest);
self.beta_g2.to_sponge_field_elements(dest);
self.gamma_g2.to_sponge_field_elements(dest);
self.delta_g2.to_sponge_field_elements(dest);
self.gamma_abc_g1
.iter()
.for_each(|g| g.to_sponge_field_elements(dest));
}
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct PreparedVerifyingKey<E: Pairing> {
pub vk: VerifyingKey<E>,
pub alpha_g1_beta_g2: E::TargetField,
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: E::TargetField::default(),
gamma_g2_neg_pc: E::G2Prepared::default(),
delta_g2_neg_pc: E::G2Prepared::default(),
}
}
}
#[derive(Clone, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
pub struct ProvingKey<E: Pairing> {
pub vk: VerifyingKey<E>,
pub beta_g1: E::G1Affine,
pub delta_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>,
}