diff --git a/Cargo.toml b/Cargo.toml index 4528fc41..75f8be20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,8 @@ digest = "0.9" rayon = { version = "1", optional = true } derivative = { version = "2", features = [ "use_core" ] } +tracing = { version = "0.1", default-features = false, features = [ "attributes" ] } + [dev-dependencies] rand = { version = "0.7", default-features = false } ark-ed-on-bls12-381 = { git = "https://github.com/arkworks-rs/curves", default-features = false } @@ -60,7 +62,7 @@ debug = true [features] default = [ "std", "parallel" ] -std = [ "ark-ff/std", "ark-ec/std", "ark-poly/std", "ark-std/std", "ark-serialize/std" ] +std = [ "ark-ff/std", "ark-ec/std", "ark-nonnative-field/std", "ark-poly/std", "ark-std/std", "ark-relations/std", "ark-serialize/std" ] r1cs = [ "ark-relations", "ark-r1cs-std", "ark-nonnative-field", "hashbrown" ] print-trace = [ "bench-utils/print-trace" ] parallel = [ "std", "ark-ff/parallel", "ark-ec/parallel", "ark-poly/parallel", "ark-std/parallel", "rayon" ] diff --git a/src/constraints.rs b/src/constraints.rs index 57f74d19..41fe3582 100644 --- a/src/constraints.rs +++ b/src/constraints.rs @@ -73,7 +73,7 @@ impl } } -#[derive(Clone)] +#[derive(Clone, Debug)] /// A collection of random data used in the polynomial commitment checking. pub struct PCCheckRandomDataVar { /// Opening challenges. diff --git a/src/data_structures.rs b/src/data_structures.rs index 1485d598..f5098198 100644 --- a/src/data_structures.rs +++ b/src/data_structures.rs @@ -1,5 +1,5 @@ use crate::{Polynomial, PolynomialCommitment, Rc, String, Vec}; -use ark_ff::Field; +use ark_ff::{Field, ToConstraintField}; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, SerializationError}; use ark_std::{ borrow::Borrow, @@ -192,6 +192,14 @@ pub struct LabeledCommitment { degree_bound: Option, } +impl> ToConstraintField + for LabeledCommitment +{ + fn to_field_elements(&self) -> Option> { + self.commitment.to_field_elements() + } +} + impl LabeledCommitment { /// Instantiate a new polynomial_context. pub fn new(label: PolynomialLabel, commitment: C, degree_bound: Option) -> Self { diff --git a/src/kzg10/data_structures.rs b/src/kzg10/data_structures.rs index ebc3e34a..4bb95430 100644 --- a/src/kzg10/data_structures.rs +++ b/src/kzg10/data_structures.rs @@ -1,6 +1,6 @@ use crate::*; use ark_ec::{AffineCurve, PairingEngine, ProjectiveCurve}; -use ark_ff::{PrimeField, ToBytes, Zero}; +use ark_ff::{PrimeField, ToBytes, ToConstraintField, Zero}; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, SerializationError}; use ark_std::{ borrow::Cow, @@ -297,6 +297,23 @@ impl ToBytes for VerifierKey { } } +impl ToConstraintField<::BasePrimeField> for VerifierKey +where + E::G1Affine: ToConstraintField<::BasePrimeField>, + E::G2Affine: ToConstraintField<::BasePrimeField>, +{ + fn to_field_elements(&self) -> Option::BasePrimeField>> { + let mut res = Vec::new(); + + res.extend_from_slice(&self.g.to_field_elements().unwrap()); + res.extend_from_slice(&self.gamma_g.to_field_elements().unwrap()); + res.extend_from_slice(&self.h.to_field_elements().unwrap()); + res.extend_from_slice(&self.beta_h.to_field_elements().unwrap()); + + Some(res) + } +} + /// `PreparedVerifierKey` is the fully prepared version for checking evaluation proofs for a given commitment. /// We omit gamma here for simplicity. #[derive(Derivative)] @@ -368,6 +385,15 @@ impl PCCommitment for Commitment { } } +impl ToConstraintField<::BasePrimeField> for Commitment +where + E::G1Affine: ToConstraintField<::BasePrimeField>, +{ + fn to_field_elements(&self) -> Option::BasePrimeField>> { + self.0.to_field_elements() + } +} + impl<'a, E: PairingEngine> AddAssign<(E::Fr, &'a Commitment)> for Commitment { #[inline] fn add_assign(&mut self, (f, other): (E::Fr, &'a Commitment)) { diff --git a/src/marlin/marlin_pc/data_structures.rs b/src/marlin/marlin_pc/data_structures.rs index bf6a5784..b47a2d9f 100644 --- a/src/marlin/marlin_pc/data_structures.rs +++ b/src/marlin/marlin_pc/data_structures.rs @@ -3,7 +3,7 @@ use crate::{ PCVerifierKey, UVPolynomial, Vec, }; use ark_ec::{PairingEngine, ProjectiveCurve}; -use ark_ff::{PrimeField, ToBytes}; +use ark_ff::{Field, PrimeField, ToBytes, ToConstraintField}; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, SerializationError}; use ark_std::io::{Read, Write}; use ark_std::ops::{Add, AddAssign}; @@ -148,6 +148,28 @@ impl ToBytes for VerifierKey { } } +impl ToConstraintField<::BasePrimeField> for VerifierKey +where + E::G1Affine: ToConstraintField<::BasePrimeField>, + E::G2Affine: ToConstraintField<::BasePrimeField>, +{ + fn to_field_elements(&self) -> Option::BasePrimeField>> { + let mut res = Vec::new(); + res.extend_from_slice(&self.vk.to_field_elements().unwrap()); + + if let Some(degree_bounds_and_shift_powers) = &self.degree_bounds_and_shift_powers { + for (d, shift_power) in degree_bounds_and_shift_powers.iter() { + let d_elem: ::BasePrimeField = (*d as u64).into(); + + res.push(d_elem); + res.extend_from_slice(&shift_power.to_field_elements().unwrap()); + } + } + + Some(res) + } +} + /// `PreparedVerifierKey` is used to check evaluation proofs for a given commitment. #[derive(Derivative)] #[derivative(Clone(bound = ""), Debug(bound = ""))] @@ -240,6 +262,22 @@ impl ToBytes for Commitment { } } +impl ToConstraintField<::BasePrimeField> for Commitment +where + E::G1Affine: ToConstraintField<::BasePrimeField>, +{ + fn to_field_elements(&self) -> Option::BasePrimeField>> { + let mut res = Vec::new(); + res.extend_from_slice(&self.comm.to_field_elements().unwrap()); + + if let Some(shifted_comm) = &self.shifted_comm { + res.extend_from_slice(&shifted_comm.to_field_elements().unwrap()); + } + + Some(res) + } +} + impl PCCommitment for Commitment { #[inline] fn empty() -> Self {