Skip to content
This repository has been archived by the owner on Dec 18, 2023. It is now read-only.

Reduce generics #71

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,6 @@ lto = "thin"
incremental = true
debug-assertions = true
debug = true

[patch.crates-io]
ark-r1cs-std = { git = "https://github.com/arkworks-rs/r1cs-std", branch = "reduce-generics", optional = true, default-features = false }
2 changes: 1 addition & 1 deletion bls12_377/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ std = [ "ark-std/std", "ark-ff/std", "ark-ec/std" ]
curve = [ "scalar_field", "base_field" ]
scalar_field = []
base_field = []
r1cs = [ "base_field", "ark-r1cs-std" ]
r1cs = [ "base_field", "ark-r1cs-std" ]
14 changes: 4 additions & 10 deletions bls12_377/src/constraints/curves.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,8 @@ pub type G2PreparedVar = bls12::G2PreparedVar<Parameters>;
#[test]
fn test() {
use ark_ec::models::bls12::Bls12Parameters;
ark_curve_constraint_tests::curves::sw_test::<
<Parameters as Bls12Parameters>::G1Parameters,
G1Var,
>()
.unwrap();
ark_curve_constraint_tests::curves::sw_test::<
<Parameters as Bls12Parameters>::G2Parameters,
G2Var,
>()
.unwrap();
ark_curve_constraint_tests::curves::sw_test::<<Parameters as Bls12Parameters>::G1Parameters>()
.unwrap();
ark_curve_constraint_tests::curves::sw_test::<<Parameters as Bls12Parameters>::G2Parameters>()
.unwrap();
}
12 changes: 6 additions & 6 deletions bls12_377/src/constraints/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,17 +130,17 @@
//! let pairing_result_native = Bls12_377::pairing(a_native, b_native);
//!
//! // Prepare `a` and `b` for pairing.
//! let a_prep = constraints::PairingVar::prepare_g1(&a)?;
//! let b_prep = constraints::PairingVar::prepare_g2(&b)?;
//! let pairing_result = constraints::PairingVar::pairing(a_prep, b_prep)?;
//! let a_prep = Bls12_377::prepare_g1(&a)?;
//! let b_prep = Bls12_377::prepare_g2(&b)?;
//! let pairing_result = Bls12_377::pairing_gadget(a_prep, b_prep)?;
//!
//! // Check that the value of &a + &b is correct.
//! assert_eq!(pairing_result.value()?, pairing_result_native);
//!
//! // Check that operations on variables and constants are equivalent.
//! let a_prep_const = constraints::PairingVar::prepare_g1(&a_const)?;
//! let b_prep_const = constraints::PairingVar::prepare_g2(&b_const)?;
//! let pairing_result_const = constraints::PairingVar::pairing(a_prep_const, b_prep_const)?;
//! let a_prep_const = Bls12_377::prepare_g1(&a_const)?;
//! let b_prep_const = Bls12_377::prepare_g2(&b_const)?;
//! let pairing_result_const = Bls12_377::pairing_gadget(a_prep_const, b_prep_const)?;
//! println!("Done here 3");
//!
//! pairing_result.enforce_equal(&pairing_result_const)?;
Expand Down
6 changes: 2 additions & 4 deletions bls12_377/src/constraints/pairing.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
use crate::Parameters;

/// Specifies the constraints for computing a pairing in the BLS12-377 bilinear group.
pub type PairingVar = ark_r1cs_std::pairing::bls12::PairingVar<Parameters>;
pub use crate::Bls12_377;

#[test]
fn test() {
use crate::Bls12_377;
ark_curve_constraint_tests::pairing::bilinearity_test::<Bls12_377, PairingVar>().unwrap()
ark_curve_constraint_tests::pairing::bilinearity_test::<Bls12_377>().unwrap()
}
109 changes: 59 additions & 50 deletions curve-constraint-tests/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,20 +233,22 @@ pub mod fields {
pub mod curves {
use ark_ec::{
short_weierstrass_jacobian::GroupProjective as SWProjective,
twisted_edwards_extended::GroupProjective as TEProjective, ProjectiveCurve,
twisted_edwards_extended::GroupProjective as TEProjective, ModelParameters,
ProjectiveCurve,
};
use ark_ff::{BitIteratorLE, Field, FpParameters, One, PrimeField};
use ark_relations::r1cs::{ConstraintSystem, SynthesisError};
use ark_std::{test_rng, vec::Vec, UniformRand};

use ark_r1cs_std::prelude::*;

pub fn group_test<C, ConstraintF, GG>() -> Result<(), SynthesisError>
type ConstraintF<P> = <<P as ModelParameters>::BaseField as Field>::BasePrimeField;

pub fn group_test<C, ConstraintF>() -> Result<(), SynthesisError>
where
C: ProjectiveCurve,
C: CurveWithVar<ConstraintF>,
ConstraintF: Field,
GG: CurveVar<C, ConstraintF>,
for<'a> &'a GG: GroupOpsBounds<'a, C, GG>,
for<'a> &'a C::Var: GroupOpsBounds<'a, C, C::Var>,
{
let modes = [
AllocationMode::Input,
Expand All @@ -259,12 +261,14 @@ pub mod curves {
let mut rng = test_rng();
let a_native = C::rand(&mut rng);
let b_native = C::rand(&mut rng);
let a = GG::new_variable(ark_relations::ns!(cs, "generate_a"), || Ok(a_native), mode)
.unwrap();
let b = GG::new_variable(ark_relations::ns!(cs, "generate_b"), || Ok(b_native), mode)
.unwrap();

let zero = GG::zero();
let a =
C::Var::new_variable(ark_relations::ns!(cs, "generate_a"), || Ok(a_native), mode)
.unwrap();
let b =
C::Var::new_variable(ark_relations::ns!(cs, "generate_b"), || Ok(b_native), mode)
.unwrap();

let zero = C::Var::zero();
assert_eq!(zero.value()?, zero.value()?);

// a == a
Expand All @@ -273,14 +277,14 @@ pub mod curves {
assert_eq!((&a + &zero).value()?, a.value()?);
// a - 0 = a
assert_eq!((&a - &zero).value()?, a.value()?);
// a - a = 0
assert_eq!((&a - &a).value()?, zero.value()?);
// a + b = b + a
let a_b = &a + &b;
let b_a = &b + &a;
assert_eq!(a_b.value()?, b_a.value()?);
a_b.enforce_equal(&b_a)?;
assert!(cs.is_satisfied().unwrap());
// a - a = 0
assert_eq!((&a - &a).value()?, zero.value()?);

// (a + b) + a = a + (b + a)
let ab_a = &a_b + &a;
Expand Down Expand Up @@ -380,13 +384,15 @@ pub mod curves {
Ok(())
}

pub fn sw_test<P, GG>() -> Result<(), SynthesisError>
type SWVar<P> = <SWProjective<P> as CurveWithVar<ConstraintF<P>>>::Var;

pub fn sw_test<P>() -> Result<(), SynthesisError>
where
P: ark_ec::SWModelParameters,
GG: CurveVar<SWProjective<P>, <P::BaseField as Field>::BasePrimeField>,
for<'a> &'a GG: GroupOpsBounds<'a, SWProjective<P>, GG>,
SWProjective<P>: CurveWithVar<ConstraintF<P>> + ProjectiveCurve,
for<'a> &'a SWVar<P>: GroupOpsBounds<'a, SWProjective<P>, SWVar<P>>,
{
group_test::<SWProjective<P>, _, GG>()?;
group_test::<SWProjective<P>, _>()?;
let modes = [
AllocationMode::Input,
AllocationMode::Witness,
Expand All @@ -405,14 +411,12 @@ pub mod curves {
let b_affine = b.into_affine();

let ns = ark_relations::ns!(cs, "allocating variables");
let mut gadget_a = GG::new_variable(cs.clone(), || Ok(a), mode)?;
let gadget_b = GG::new_variable(cs.clone(), || Ok(b), mode)?;
let zero = GG::zero();
let mut gadget_a = SWVar::<P>::new_variable(cs.clone(), || Ok(a), mode)?;
let gadget_b = SWVar::<P>::new_variable(cs.clone(), || Ok(b), mode)?;
let zero = SWVar::<P>::zero();
drop(ns);
assert_eq!(gadget_a.value()?.into_affine().x, a_affine.x);
assert_eq!(gadget_a.value()?.into_affine().y, a_affine.y);
assert_eq!(gadget_b.value()?.into_affine().x, b_affine.x);
assert_eq!(gadget_b.value()?.into_affine().y, b_affine.y);
assert_eq!(gadget_a.value()?.into_affine(), a_affine);
assert_eq!(gadget_b.value()?.into_affine(), b_affine);
assert_eq!(cs.which_is_unsatisfied().unwrap(), None);

// Check addition
Expand Down Expand Up @@ -453,13 +457,15 @@ pub mod curves {
Ok(())
}

pub fn te_test<P, GG>() -> Result<(), SynthesisError>
type TEVar<P> = <TEProjective<P> as CurveWithVar<ConstraintF<P>>>::Var;

pub fn te_test<P>() -> Result<(), SynthesisError>
where
P: ark_ec::TEModelParameters,
GG: CurveVar<TEProjective<P>, <P::BaseField as Field>::BasePrimeField>,
for<'a> &'a GG: GroupOpsBounds<'a, TEProjective<P>, GG>,
TEProjective<P>: CurveWithVar<ConstraintF<P>> + ProjectiveCurve,
for<'a> &'a TEVar<P>: GroupOpsBounds<'a, TEProjective<P>, TEVar<P>>,
{
group_test::<TEProjective<P>, _, GG>()?;
group_test::<TEProjective<P>, _>()?;
let modes = [
AllocationMode::Input,
AllocationMode::Witness,
Expand All @@ -478,14 +484,12 @@ pub mod curves {
let b_affine = b.into_affine();

let ns = ark_relations::ns!(cs, "allocating variables");
let mut gadget_a = GG::new_variable(cs.clone(), || Ok(a), mode)?;
let gadget_b = GG::new_variable(cs.clone(), || Ok(b), mode)?;
let mut gadget_a = TEVar::<P>::new_variable(cs.clone(), || Ok(a), mode)?;
let gadget_b = TEVar::<P>::new_variable(cs.clone(), || Ok(b), mode)?;
drop(ns);

assert_eq!(gadget_a.value()?.into_affine().x, a_affine.x);
assert_eq!(gadget_a.value()?.into_affine().y, a_affine.y);
assert_eq!(gadget_b.value()?.into_affine().x, b_affine.x);
assert_eq!(gadget_b.value()?.into_affine().y, b_affine.y);
assert_eq!(gadget_a.value()?.into_affine(), a_affine);
assert_eq!(gadget_b.value()?.into_affine(), b_affine);
assert_eq!(cs.which_is_unsatisfied()?, None);

// Check addition
Expand Down Expand Up @@ -527,29 +531,34 @@ pub mod curves {
pub mod pairing {
use ark_ec::{PairingEngine, ProjectiveCurve};
use ark_ff::{BitIteratorLE, Field, PrimeField};
use ark_r1cs_std::prelude::*;
use ark_r1cs_std::{fields::fp::FpVar, prelude::*};
use ark_relations::r1cs::{ConstraintSystem, SynthesisError};
use ark_std::{test_rng, vec::Vec, UniformRand};

#[allow(dead_code)]
pub fn bilinearity_test<E: PairingEngine, P: PairingVar<E>>() -> Result<(), SynthesisError>
pub fn bilinearity_test<P: PairingGadget>() -> Result<(), SynthesisError>
where
for<'a> &'a P::G1Var: GroupOpsBounds<'a, E::G1Projective, P::G1Var>,
for<'a> &'a P::G2Var: GroupOpsBounds<'a, E::G2Projective, P::G2Var>,
for<'a> &'a P::GTVar: FieldOpsBounds<'a, E::Fqk, P::GTVar>,
for<'a> &'a P::G1Var: GroupOpsBounds<'a, P::G1Projective, P::G1Var>,
for<'a> &'a P::G2Var: GroupOpsBounds<'a, P::G2Projective, P::G2Var>,
for<'a> &'a P::GTVar: FieldOpsBounds<'a, P::Fqk, P::GTVar>,
P::Fq: FieldWithVar<Var = FpVar<P::Fq>>,
P::Fqe: FieldWithVar,
P::Fqk: FieldWithVar<Var = P::GTVar>,
P::G1Projective: CurveWithVar<P::Fq, Var = P::G1Var>,
P::G2Projective: CurveWithVar<P::Fq, Var = P::G2Var>,
{
let modes = [
AllocationMode::Input,
AllocationMode::Witness,
AllocationMode::Constant,
];
for &mode in &modes {
let cs = ConstraintSystem::<E::Fq>::new_ref();
let cs = ConstraintSystem::<P::Fq>::new_ref();

let mut rng = test_rng();
let a = E::G1Projective::rand(&mut rng);
let b = E::G2Projective::rand(&mut rng);
let s = E::Fr::rand(&mut rng);
let a = P::G1Projective::rand(&mut rng);
let b = P::G2Projective::rand(&mut rng);
let s = P::Fr::rand(&mut rng);

let mut sa = a;
sa *= s;
Expand All @@ -571,16 +580,16 @@ pub mod pairing {

let (ans1_g, ans1_n) = {
let _ml_constraints = cs.num_constraints();
let ml_g = P::miller_loop(&[sa_prep_g], &[b_prep_g.clone()])?;
let ml_g = P::miller_loop_gadget(&[sa_prep_g], &[b_prep_g.clone()])?;
let _fe_constraints = cs.num_constraints();
let ans_g = P::final_exponentiation(&ml_g)?;
let ans_n = E::pairing(sa, b);
let ans_g = P::final_exponentiation_gadget(&ml_g)?;
let ans_n = <P as PairingEngine>::pairing(sa, b);
(ans_g, ans_n)
};

let (ans2_g, ans2_n) = {
let ans_g = P::pairing(a_prep_g.clone(), sb_prep_g)?;
let ans_n = E::pairing(a, sb);
let ans_g = P::pairing_gadget(a_prep_g.clone(), sb_prep_g)?;
let ans_n = <P as PairingEngine>::pairing(a, sb);
(ans_g, ans_n)
};

Expand All @@ -589,8 +598,8 @@ pub mod pairing {
.map(Boolean::constant)
.collect::<Vec<_>>();

let mut ans_g = P::pairing(a_prep_g, b_prep_g)?;
let mut ans_n = E::pairing(a, b);
let mut ans_g = P::pairing_gadget(a_prep_g, b_prep_g)?;
let mut ans_n = <P as PairingEngine>::pairing(a, b);
ans_n = ans_n.pow(s.into_repr());
ans_g = ans_g.pow_le(&s_iter)?;

Expand Down
6 changes: 2 additions & 4 deletions ed_on_bls12_377/src/constraints/curves.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
use crate::*;
use ark_r1cs_std::groups::curves::twisted_edwards::AffineVar;

use crate::constraints::FqVar;

/// A variable that is the R1CS equivalent of `crate::EdwardsAffine`.
pub type EdwardsVar = AffineVar<EdwardsParameters, FqVar>;
pub type EdwardsVar = AffineVar<EdwardsParameters>;

#[test]
fn test() {
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters, EdwardsVar>().unwrap();
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters>().unwrap();
}
6 changes: 2 additions & 4 deletions ed_on_bls12_381/src/constraints/curves.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
use crate::*;
use ark_r1cs_std::groups::curves::twisted_edwards::AffineVar;

use crate::constraints::FqVar;

/// A variable that is the R1CS equivalent of `crate::EdwardsAffine`.
pub type EdwardsVar = AffineVar<EdwardsParameters, FqVar>;
pub type EdwardsVar = AffineVar<EdwardsParameters>;

#[test]
fn test() {
ark_curve_constraint_tests::curves::te_test::<_, EdwardsVar>().unwrap();
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters>().unwrap();
}
6 changes: 2 additions & 4 deletions ed_on_bls12_381_bandersnatch/src/constraints/curves.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
use crate::*;
use ark_r1cs_std::groups::curves::twisted_edwards::AffineVar;

use crate::constraints::FqVar;

/// A variable that is the R1CS equivalent of `crate::EdwardsAffine`.
pub type EdwardsVar = AffineVar<EdwardsParameters, FqVar>;
pub type EdwardsVar = AffineVar<EdwardsParameters>;

#[test]
fn test() {
ark_curve_constraint_tests::curves::te_test::<_, EdwardsVar>().unwrap();
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters>().unwrap();
}
6 changes: 2 additions & 4 deletions ed_on_bn254/src/constraints/curves.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
use crate::*;
use ark_r1cs_std::groups::curves::twisted_edwards::AffineVar;

use crate::constraints::FqVar;

/// A variable that is the R1CS equivalent of `crate::EdwardsAffine`.
pub type EdwardsVar = AffineVar<EdwardsParameters, FqVar>;
pub type EdwardsVar = AffineVar<EdwardsParameters>;

#[test]
fn test() {
ark_curve_constraint_tests::curves::te_test::<_, EdwardsVar>().unwrap();
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters>().unwrap();
}
6 changes: 2 additions & 4 deletions ed_on_cp6_782/src/constraints/curves.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
use crate::*;
use ark_r1cs_std::groups::curves::twisted_edwards::AffineVar;

use crate::constraints::FqVar;

/// A variable that is the R1CS equivalent of `crate::EdwardsAffine`.
pub type EdwardsVar = AffineVar<EdwardsParameters, FqVar>;
pub type EdwardsVar = AffineVar<EdwardsParameters>;

#[test]
fn test() {
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters, EdwardsVar>().unwrap();
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters>().unwrap();
}
6 changes: 2 additions & 4 deletions ed_on_mnt4_298/src/constraints/curves.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
use crate::*;
use ark_r1cs_std::groups::curves::twisted_edwards::AffineVar;

use crate::constraints::fields::FqVar;

/// A variable that is the R1CS equivalent of `crate::EdwardsAffine`.
pub type EdwardsVar = AffineVar<EdwardsParameters, FqVar>;
pub type EdwardsVar = AffineVar<EdwardsParameters>;

#[test]
fn test() {
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters, EdwardsVar>().unwrap();
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters>().unwrap();
}
6 changes: 2 additions & 4 deletions ed_on_mnt4_753/src/constraints/curves.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
use crate::*;
use ark_r1cs_std::groups::curves::twisted_edwards::AffineVar;

use crate::constraints::fields::FqVar;

/// A variable that is the R1CS equivalent of `crate::EdwardsAffine`.
pub type EdwardsVar = AffineVar<EdwardsParameters, FqVar>;
pub type EdwardsVar = AffineVar<EdwardsParameters>;

#[test]
fn test() {
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters, EdwardsVar>().unwrap();
ark_curve_constraint_tests::curves::te_test::<EdwardsParameters>().unwrap();
}
Loading