From d90de5ec62251053dbc7796d5ba831dedf4026e8 Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 28 Sep 2022 19:08:33 +0200 Subject: [PATCH] add support for the pallas curve field --- zokrates_cli/src/cli_constants.rs | 2 +- zokrates_cli/src/ops/check.rs | 5 ++++- zokrates_cli/src/ops/compile.rs | 5 ++++- zokrates_common/src/constants.rs | 1 + zokrates_common/src/helpers.rs | 2 ++ zokrates_field/Cargo.toml | 1 + zokrates_field/src/bls12_377.rs | 3 ++- zokrates_field/src/bls12_381.rs | 3 ++- zokrates_field/src/bn128.rs | 3 ++- zokrates_field/src/bw6_761.rs | 3 ++- zokrates_field/src/lib.rs | 5 +++-- zokrates_field/src/pallas.rs | 5 +++++ zokrates_js/src/lib.rs | 14 +++++++++++++- 13 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 zokrates_field/src/pallas.rs diff --git a/zokrates_cli/src/cli_constants.rs b/zokrates_cli/src/cli_constants.rs index 2f002f8d..be037bcb 100644 --- a/zokrates_cli/src/cli_constants.rs +++ b/zokrates_cli/src/cli_constants.rs @@ -36,7 +36,7 @@ pub const BACKENDS: &[&str] = if cfg!(feature = "ark") { &[] }; -pub const CURVES: &[&str] = &[BN128, BLS12_381, BLS12_377, BW6_761]; +pub const CURVES: &[&str] = &[BN128, BLS12_381, BLS12_377, BW6_761, PALLAS]; pub const SCHEMES: &[&str] = &[G16, GM17, MARLIN]; diff --git a/zokrates_cli/src/ops/check.rs b/zokrates_cli/src/ops/check.rs index a32be7f6..08161335 100644 --- a/zokrates_cli/src/ops/check.rs +++ b/zokrates_cli/src/ops/check.rs @@ -7,7 +7,9 @@ use std::path::{Path, PathBuf}; use zokrates_common::constants::BN128; use zokrates_common::helpers::CurveParameter; use zokrates_core::compile::{check, CompileConfig, CompileError}; -use zokrates_field::{Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field}; +use zokrates_field::{ + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, +}; use zokrates_fs_resolver::FileSystemResolver; pub fn subcommand() -> App<'static, 'static> { @@ -56,6 +58,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { CurveParameter::Bls12_377 => cli_check::(sub_matches), CurveParameter::Bls12_381 => cli_check::(sub_matches), CurveParameter::Bw6_761 => cli_check::(sub_matches), + CurveParameter::Pallas => cli_check::(sub_matches), } } diff --git a/zokrates_cli/src/ops/compile.rs b/zokrates_cli/src/ops/compile.rs index b00debe3..b28ba636 100644 --- a/zokrates_cli/src/ops/compile.rs +++ b/zokrates_cli/src/ops/compile.rs @@ -10,7 +10,9 @@ use zokrates_circom::write_r1cs; use zokrates_common::constants::BN128; use zokrates_common::helpers::CurveParameter; use zokrates_core::compile::{compile, CompileConfig, CompileError}; -use zokrates_field::{Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field}; +use zokrates_field::{ + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, +}; use zokrates_fs_resolver::FileSystemResolver; pub fn subcommand() -> App<'static, 'static> { @@ -81,6 +83,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { CurveParameter::Bls12_377 => cli_compile::(sub_matches), CurveParameter::Bls12_381 => cli_compile::(sub_matches), CurveParameter::Bw6_761 => cli_compile::(sub_matches), + CurveParameter::Pallas => cli_compile::(sub_matches), } } diff --git a/zokrates_common/src/constants.rs b/zokrates_common/src/constants.rs index 18c4cf29..77234c11 100644 --- a/zokrates_common/src/constants.rs +++ b/zokrates_common/src/constants.rs @@ -5,6 +5,7 @@ pub const BN128: &str = "bn128"; pub const BLS12_381: &str = "bls12_381"; pub const BLS12_377: &str = "bls12_377"; pub const BW6_761: &str = "bw6_761"; +pub const PALLAS: &str = "pallas"; pub const G16: &str = "g16"; pub const GM17: &str = "gm17"; diff --git a/zokrates_common/src/helpers.rs b/zokrates_common/src/helpers.rs index b36f91c2..1c21d597 100644 --- a/zokrates_common/src/helpers.rs +++ b/zokrates_common/src/helpers.rs @@ -7,6 +7,7 @@ pub enum CurveParameter { Bls12_381, Bls12_377, Bw6_761, + Pallas, } impl std::fmt::Display for CurveParameter { @@ -18,6 +19,7 @@ impl std::fmt::Display for CurveParameter { Bls12_381 => write!(f, "bls12_381"), Bls12_377 => write!(f, "bls12_377"), Bw6_761 => write!(f, "bw6_761"), + Pallas => write!(f, "pallas"), } } } diff --git a/zokrates_field/Cargo.toml b/zokrates_field/Cargo.toml index 87c98f36..29f666ce 100644 --- a/zokrates_field/Cargo.toml +++ b/zokrates_field/Cargo.toml @@ -28,6 +28,7 @@ ark-bn254 = { version = "^0.3.0", features = ["curve"], default-features = false ark-bls12-377 = { version = "^0.3.0", features = ["curve"], default-features = false } ark-bls12-381 = { version = "^0.3.0", features = ["curve"] } ark-bw6-761 = { version = "^0.3.0", default-features = false } +ark-pallas = { version = "^0.3.0", features = ["curve"] } ark-serialize = { version = "^0.3.0", default-features = false } [dev-dependencies] diff --git a/zokrates_field/src/bls12_377.rs b/zokrates_field/src/bls12_377.rs index 251e0159..8e74bf9c 100644 --- a/zokrates_field/src/bls12_377.rs +++ b/zokrates_field/src/bls12_377.rs @@ -1,7 +1,8 @@ use ark_bls12_377::Bls12_377; +use ark_ec::PairingEngine; use crate::G2Type; -prime_field!("bls12_377", Bls12_377, G2Type::Fq2); +prime_field!("bls12_377", ::Fr, G2Type::Fq2); ark_extensions!(Bls12_377); diff --git a/zokrates_field/src/bls12_381.rs b/zokrates_field/src/bls12_381.rs index 403d0b94..3de1e7c9 100644 --- a/zokrates_field/src/bls12_381.rs +++ b/zokrates_field/src/bls12_381.rs @@ -1,6 +1,7 @@ use ark_bls12_381::Bls12_381; +use ark_ec::PairingEngine; -prime_field!("bls12_381", Bls12_381, G2Type::Fq2); +prime_field!("bls12_381", ::Fr, G2Type::Fq2); ark_extensions!(Bls12_381); diff --git a/zokrates_field/src/bn128.rs b/zokrates_field/src/bn128.rs index 4b6c9cbb..6b35010c 100644 --- a/zokrates_field/src/bn128.rs +++ b/zokrates_field/src/bn128.rs @@ -1,6 +1,7 @@ use ark_bn254::Bn254; +use ark_ec::PairingEngine; -prime_field!("bn128", Bn254, G2Type::Fq2); +prime_field!("bn128", ::Fr, G2Type::Fq2); ark_extensions!(Bn254); diff --git a/zokrates_field/src/bw6_761.rs b/zokrates_field/src/bw6_761.rs index 22433134..8dd1082d 100644 --- a/zokrates_field/src/bw6_761.rs +++ b/zokrates_field/src/bw6_761.rs @@ -1,7 +1,8 @@ use ark_bw6_761::BW6_761; +use ark_ec::PairingEngine; use crate::G2Type; -prime_field!("bw6_761", BW6_761, G2Type::Fq); +prime_field!("bw6_761", ::Fr, G2Type::Fq); ark_extensions!(BW6_761); diff --git a/zokrates_field/src/lib.rs b/zokrates_field/src/lib.rs index dc1e6b90..1bbc7303 100644 --- a/zokrates_field/src/lib.rs +++ b/zokrates_field/src/lib.rs @@ -32,7 +32,6 @@ pub trait BellmanFieldExtensions { fn into_bellman(self) -> ::Fr; fn new_fq2(c0: &str, c1: &str) -> ::Fqe; } - pub trait ArkFieldExtensions { /// An associated type to be able to operate with ark ff traits type ArkEngine: ark_ec::PairingEngine; @@ -146,7 +145,7 @@ mod prime_field { use std::fmt::{Debug, Display}; use std::ops::{Add, Div, Mul, Sub}; - type Fr = <$v as ark_ec::PairingEngine>::Fr; + type Fr = $v; #[derive(PartialEq, PartialOrd, Clone, Eq, Ord, Hash)] pub struct FieldPrime { @@ -632,8 +631,10 @@ pub mod bls12_377; pub mod bls12_381; pub mod bn128; pub mod bw6_761; +pub mod pallas; pub use bls12_377::FieldPrime as Bls12_377Field; pub use bls12_381::FieldPrime as Bls12_381Field; pub use bn128::FieldPrime as Bn128Field; pub use bw6_761::FieldPrime as Bw6_761Field; +pub use pallas::FieldPrime as PallasField; diff --git a/zokrates_field/src/pallas.rs b/zokrates_field/src/pallas.rs new file mode 100644 index 00000000..865eb595 --- /dev/null +++ b/zokrates_field/src/pallas.rs @@ -0,0 +1,5 @@ +use ark_pallas::Fr as PallasBaseField; + +use crate::G2Type; + +prime_field!("pallas", PallasBaseField, G2Type::Fq2); diff --git a/zokrates_js/src/lib.rs b/zokrates_js/src/lib.rs index cf24252e..1d6fd02d 100644 --- a/zokrates_js/src/lib.rs +++ b/zokrates_js/src/lib.rs @@ -25,7 +25,9 @@ use zokrates_core::compile::{ compile as core_compile, CompilationArtifacts, CompileConfig, CompileError, }; use zokrates_core::imports::Error; -use zokrates_field::{Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field}; +use zokrates_field::{ + Bls12_377Field, Bls12_381Field, Bn128Field, Bw6_761Field, Field, PallasField, +}; use zokrates_proof_systems::groth16::G16; use zokrates_proof_systems::{ Backend, Marlin, NonUniversalBackend, NonUniversalScheme, Proof, Scheme, @@ -454,6 +456,9 @@ pub fn compile( CurveParameter::Bw6_761 => { internal::compile::(source, location, resolve_callback, config) } + CurveParameter::Pallas => { + internal::compile::(source, location, resolve_callback, config) + } } } @@ -603,6 +608,10 @@ pub fn universal_setup(curve: JsValue, size: u32) -> Result, JsValue> { CurveParameter::Bw6_761 => { Ok(internal::universal_setup_of_size::(size)) } + c => Err(JsValue::from(format!( + "Curve `{}` is not supported for universal setups", + c + ))), } } @@ -746,18 +755,21 @@ pub fn verify(vk: JsValue, proof: JsValue, options: JsValue) -> Result internal::verify::(vk, proof), CurveParameter::Bls12_377 => internal::verify::(vk, proof), CurveParameter::Bw6_761 => internal::verify::(vk, proof), + _ => Err(JsValue::from_str("Not supported")), }, (BackendParameter::Ark, SchemeParameter::GM17) => match curve { CurveParameter::Bn128 => internal::verify::(vk, proof), CurveParameter::Bls12_381 => internal::verify::(vk, proof), CurveParameter::Bls12_377 => internal::verify::(vk, proof), CurveParameter::Bw6_761 => internal::verify::(vk, proof), + _ => Err(JsValue::from_str("Not supported")), }, (BackendParameter::Ark, SchemeParameter::MARLIN) => match curve { CurveParameter::Bn128 => internal::verify::(vk, proof), CurveParameter::Bls12_381 => internal::verify::(vk, proof), CurveParameter::Bls12_377 => internal::verify::(vk, proof), CurveParameter::Bw6_761 => internal::verify::(vk, proof), + _ => Err(JsValue::from_str("Not supported")), }, _ => Err(JsValue::from_str("Unsupported options")), }