From eef0cd95ae37c5b0f4ec4d41a3bdff84950905c3 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 7 Dec 2021 12:03:01 +0100 Subject: [PATCH] simplify field trait, remove redundant modulus, add tests, implement ark for all curves --- zokrates_field/src/bls12_377.rs | 8 ++------ zokrates_field/src/bls12_381.rs | 8 +++----- zokrates_field/src/bn128.rs | 33 ++++++--------------------------- zokrates_field/src/bw6_761.rs | 6 +----- zokrates_field/src/lib.rs | 16 +++++++--------- 5 files changed, 19 insertions(+), 52 deletions(-) diff --git a/zokrates_field/src/bls12_377.rs b/zokrates_field/src/bls12_377.rs index ac5291ed..66e297dc 100644 --- a/zokrates_field/src/bls12_377.rs +++ b/zokrates_field/src/bls12_377.rs @@ -1,9 +1,5 @@ use ark_bls12_377::Bls12_377; -prime_field!( - b"8444461749428370424248824938781546531375899335154063827935233455917409239041", - "bls12_377", - Bls12_377 -); +prime_field!("bls12_377", Bls12_377); -ark_extensions!(ark_bls12_377::Bls12_377); +ark_extensions!(Bls12_377); diff --git a/zokrates_field/src/bls12_381.rs b/zokrates_field/src/bls12_381.rs index e76dbc0b..81275843 100644 --- a/zokrates_field/src/bls12_381.rs +++ b/zokrates_field/src/bls12_381.rs @@ -1,10 +1,8 @@ use ark_bls12_381::Bls12_381; -prime_field!( - b"52435875175126190479447740508185965837690552500527637822603658699938581184513", - "bls12_381", - Bls12_381 -); +prime_field!("bls12_381", Bls12_381); + +ark_extensions!(Bls12_381); #[cfg(feature = "bellman")] use bellman_ce::pairing::bls12_381::{Bls12, Fq2}; diff --git a/zokrates_field/src/bn128.rs b/zokrates_field/src/bn128.rs index ca025e6b..1af60009 100644 --- a/zokrates_field/src/bn128.rs +++ b/zokrates_field/src/bn128.rs @@ -1,10 +1,6 @@ use ark_bn254::Bn254; -prime_field!( - b"21888242871839275222246405745257275088548364400416034343698204186575808495617", - "bn128", - Bn254 -); +prime_field!("bn128", Bn254); ark_extensions!(Bn254); @@ -201,6 +197,11 @@ mod tests { ); } + #[test] + fn required_bits() { + assert_eq!(FieldPrime::get_required_bits(), 254); + } + #[test] fn bits() { assert_eq!(FieldPrime::from(0).bits(), 1); @@ -256,7 +257,6 @@ mod tests { #[test] fn serde_json_ser_deser() { let serialized = serde_json::to_string(&FieldPrime::from("11")).unwrap(); - println!("{}", serialized); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(FieldPrime::from("11"), deserialized); } @@ -264,9 +264,7 @@ mod tests { #[test] fn bytes_ser_deser() { let fp = FieldPrime::from("101"); - println!("{}", fp); let bv = fp.to_byte_vector(); - println!("{:#?}", bv); assert_eq!(fp, FieldPrime::from_byte_vector(bv)); } @@ -301,25 +299,6 @@ mod tests { } } - #[test] - fn bigint_assertions() { - use num_integer::Integer; - let x = BigInt::parse_bytes(b"65", 10).unwrap(); - assert_eq!(&x + &x, BigInt::parse_bytes(b"130", 10).unwrap()); - assert_eq!( - "1".parse::().unwrap(), - "3".parse::() - .unwrap() - .div_floor(&"2".parse::().unwrap()) - ); - assert_eq!( - "-2".parse::().unwrap(), - "-3".parse::() - .unwrap() - .div_floor(&"2".parse::().unwrap()) - ); - } - #[cfg(feature = "bellman")] mod bellman { use super::*; diff --git a/zokrates_field/src/bw6_761.rs b/zokrates_field/src/bw6_761.rs index c754e8cc..82a90600 100644 --- a/zokrates_field/src/bw6_761.rs +++ b/zokrates_field/src/bw6_761.rs @@ -1,9 +1,5 @@ use ark_bw6_761::BW6_761; -prime_field!( - b"258664426012969094010652733694893533536393512754914660539884262666720468348340822774968888139573360124440321458177", - "bw6_761", - BW6_761 -); +prime_field!("bw6_761", BW6_761); ark_extensions!(BW6_761); diff --git a/zokrates_field/src/lib.rs b/zokrates_field/src/lib.rs index fe0fd7c6..dd421a5c 100644 --- a/zokrates_field/src/lib.rs +++ b/zokrates_field/src/lib.rs @@ -149,11 +149,10 @@ pub trait Field: #[macro_use] mod prime_field { macro_rules! prime_field { - ($modulus:expr, $name:expr, $v:ty) => { + ($name:expr, $v:ty) => { use crate::{Field, FieldParseError, Pow}; use ark_ff::{Field as ArkField, PrimeField}; - use lazy_static::lazy_static; - use num_bigint::{BigInt, BigUint}; + use num_bigint::BigUint; use num_traits::{CheckedDiv, One, Zero}; use serde::de::{self, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -163,10 +162,6 @@ mod prime_field { use std::fmt::{Debug, Display}; use std::ops::{Add, Div, Mul, Sub}; - lazy_static! { - static ref P: BigInt = BigInt::parse_bytes($modulus, 10).unwrap(); - } - type Fr = <$v as ark_ec::PairingEngine>::Fr; #[derive(PartialEq, PartialOrd, Clone, Eq, Ord, Hash)] @@ -233,7 +228,8 @@ mod prime_field { } } fn get_required_bits() -> usize { - (*P).bits() + use ark_ff::FpParameters; + ::Params::MODULUS_BITS as usize } fn try_from_dec_str(s: &str) -> Result { use std::str::FromStr; @@ -259,8 +255,10 @@ mod prime_field { } fn id() -> [u8; 4] { let mut res = [0u8; 4]; + use ark_ff::BigInteger; + use ark_ff::FpParameters; use sha2::{Digest, Sha256}; - let hash = Sha256::digest(&P.to_bytes_le().1); + let hash = Sha256::digest(&::Params::MODULUS.to_bytes_le()); for i in 0..4 { res[i] = hash[i]; }