From b3e3b3e0aba6e19b5421f0d47b8d52c829162efd Mon Sep 17 00:00:00 2001 From: arnaucube Date: Fri, 9 Aug 2024 02:10:56 +0200 Subject: [PATCH] add frontend features to reduce the amount of dependencies and compilation time The reasoning behind this is that compilation time now is too long, in part because dependencies on specific frontends, so if the compilation don't use some frontend it can be turned off by default. --- .github/workflows/ci.yml | 4 ++-- README.md | 1 + examples/circom_full_flow.rs | 3 +++ examples/external_inputs.rs | 3 +++ examples/full_flow.rs | 3 +++ examples/multi_inputs.rs | 3 +++ examples/noir_full_flow.rs | 3 +++ examples/noname_full_flow.rs | 3 +++ examples/sha256.rs | 3 +++ folding-schemes/Cargo.toml | 23 ++++++++++++++++------- folding-schemes/src/frontend/mod.rs | 5 +++++ solidity-verifiers/Cargo.toml | 4 ++-- 12 files changed, 47 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7ef464e..47b3ac29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: feature_set: [basic] include: - feature_set: basic - features: --features default,light-test + features: --features default,light-test,circom,noname,noir steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -159,7 +159,7 @@ jobs: feature_set: [basic, wasm] include: - feature_set: basic - features: --features default,light-test + features: --features default,light-test,circom,noname,noir # We only want to test `folding-schemes` package with `wasm` feature. - feature_set: wasm features: -p folding-schemes --features wasm,parallel --target wasm32-unknown-unknown diff --git a/README.md b/README.md index 5b742968..9ab1f173 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Available frontends to define the folded circuit: - [arkworks](https://github.com/arkworks-rs), arkworks contributors - [Circom](https://github.com/iden3/circom), iden3, 0Kims Association - [Noname](https://github.com/zksecurity/noname), zkSecurity +- [Noir](https://github.com/noir-lang/noir), Aztec ## Usage diff --git a/examples/circom_full_flow.rs b/examples/circom_full_flow.rs index 10a79ba2..d40d9180 100644 --- a/examples/circom_full_flow.rs +++ b/examples/circom_full_flow.rs @@ -2,6 +2,9 @@ #![allow(non_camel_case_types)] #![allow(clippy::upper_case_acronyms)] /// +/// To run: +/// > cargo run --release --example noir_full_flow -- --nocapture +/// /// This example performs the full flow: /// - define the circuit to be folded /// - fold the circuit with Nova+CycleFold's IVC diff --git a/examples/external_inputs.rs b/examples/external_inputs.rs index 2f708091..5adda49d 100644 --- a/examples/external_inputs.rs +++ b/examples/external_inputs.rs @@ -3,6 +3,9 @@ #![allow(non_camel_case_types)] #![allow(clippy::upper_case_acronyms)] +/// +/// To run: +/// > cargo run --release --example external_inputs -- --nocapture use ark_bn254::{constraints::GVar, Bn254, Fr, G1Projective as Projective}; use ark_crypto_primitives::{ crh::{ diff --git a/examples/full_flow.rs b/examples/full_flow.rs index bf1f28f3..5a29d07a 100644 --- a/examples/full_flow.rs +++ b/examples/full_flow.rs @@ -2,6 +2,9 @@ #![allow(non_camel_case_types)] #![allow(clippy::upper_case_acronyms)] /// +/// To run: +/// > cargo run --release --example full_flow -- --nocapture +/// /// This example performs the full flow: /// - define the circuit to be folded /// - fold the circuit with Nova+CycleFold's IVC diff --git a/examples/multi_inputs.rs b/examples/multi_inputs.rs index f7819525..b4da88da 100644 --- a/examples/multi_inputs.rs +++ b/examples/multi_inputs.rs @@ -3,6 +3,9 @@ #![allow(non_camel_case_types)] #![allow(clippy::upper_case_acronyms)] +/// +/// To run: +/// > cargo run --release --example multi_inputs -- --nocapture use ark_ff::PrimeField; use ark_r1cs_std::alloc::AllocVar; use ark_r1cs_std::fields::fp::FpVar; diff --git a/examples/noir_full_flow.rs b/examples/noir_full_flow.rs index ec5107a9..aa722633 100644 --- a/examples/noir_full_flow.rs +++ b/examples/noir_full_flow.rs @@ -2,6 +2,9 @@ #![allow(non_camel_case_types)] #![allow(clippy::upper_case_acronyms)] /// +/// To run: +/// > cargo run --release --example noir_full_flow -- --nocapture +/// /// This example performs the full flow: /// - define the circuit to be folded /// - fold the circuit with Nova+CycleFold's IVC diff --git a/examples/noname_full_flow.rs b/examples/noname_full_flow.rs index 73a1a673..e9a81df0 100644 --- a/examples/noname_full_flow.rs +++ b/examples/noname_full_flow.rs @@ -2,6 +2,9 @@ #![allow(non_camel_case_types)] #![allow(clippy::upper_case_acronyms)] /// +/// To run: +/// > cargo run --release --example noname_full_flow -- --nocapture +/// /// This example performs the full flow: /// - define the circuit to be folded /// - fold the circuit with Nova+CycleFold's IVC diff --git a/examples/sha256.rs b/examples/sha256.rs index 705dcb8d..88a2f31a 100644 --- a/examples/sha256.rs +++ b/examples/sha256.rs @@ -3,6 +3,9 @@ #![allow(non_camel_case_types)] #![allow(clippy::upper_case_acronyms)] +/// +/// To run: +/// > cargo run --release --example sha256 -- --nocapture use ark_crypto_primitives::crh::{ sha256::{ constraints::{Sha256Gadget, UnitVar}, diff --git a/folding-schemes/Cargo.toml b/folding-schemes/Cargo.toml index 2fbbc3b3..084a41b4 100644 --- a/folding-schemes/Cargo.toml +++ b/folding-schemes/Cargo.toml @@ -12,11 +12,10 @@ ark-crypto-primitives = { version = "^0.4.0", default-features = false, features ark-grumpkin = { version = "0.4.0", default-features = false } ark-poly-commit = { version = "^0.4.0", default-features = false, features = ["parallel"] } ark-relations = { version = "^0.4.0", default-features = false } -# this is patched at the workspace level +# ark-r1cs-std is patched at the workspace level ark-r1cs-std = { version = "0.4.0", default-features = false, features = ["parallel"] } ark-snark = { version = "^0.4.0", default-features = false } ark-serialize = { version = "^0.4.0", default-features = false } -ark-circom = { git = "https://github.com/arnaucube/circom-compat", default-features = false } ark-groth16 = { version = "^0.4.0", default-features = false, features = ["parallel"]} ark-bn254 = { version = "^0.4.0", default-features = false } thiserror = "1.0" @@ -25,17 +24,20 @@ num-bigint = "0.4" num-integer = "0.1" color-eyre = "=0.6.2" sha3 = "0.10" -ark-noname = { git = "https://github.com/dmpierre/ark-noname", branch = "feat/sonobe-integration" } -noname = { git = "https://github.com/dmpierre/noname" } -serde_json = "1.0.85" # to (de)serialize JSON +serde_json = "1.0.85" # to (de)serialize JSON serde = "1.0.203" -acvm = { git = "https://github.com/noir-lang/noir", rev="2b4853e", default-features = false } -noir_arkworks_backend = { package="arkworks_backend", git = "https://github.com/dmpierre/arkworks_backend", branch = "feat/sonobe-integration" } log = "0.4" # tmp import for espresso's sumcheck espresso_subroutines = {git="https://github.com/EspressoSystems/hyperplonk", package="subroutines"} +# frontend dependencies: +ark-circom = { git = "https://github.com/arnaucube/circom-compat", default-features = false, optional=true } +noir_arkworks_backend = { package="arkworks_backend", git = "https://github.com/dmpierre/arkworks_backend", branch = "feat/sonobe-integration", optional=true } +acvm = { git = "https://github.com/noir-lang/noir", rev="2b4853e", default-features = false, optional=true } +noname = { git = "https://github.com/dmpierre/noname", optional=true } +ark-noname = { git = "https://github.com/dmpierre/ark-noname", branch="feat/sonobe-integration", optional=true } + [dev-dependencies] ark-pallas = {version="0.4.0", features=["r1cs"]} ark-vesta = {version="0.4.0", features=["r1cs"]} @@ -54,7 +56,14 @@ getrandom = { version = "0.2", features = ["js"] } default = ["ark-circom/default", "parallel"] parallel = [] wasm = ["ark-circom/wasm"] +# 'light-test' is a feature disabled by default, that when enabled will affect +# the DeciderEthCircuit implementations, skipping the heavy-weight parts of the +# circuit, allowing to run light tests of it taking less time. light-test = [] +# frontend features: +circom = ["dep:ark-circom"] +noname = ["dep:noname", "dep:ark-noname"] +noir = ["dep:acvm", "dep:noir_arkworks_backend"] [[example]] diff --git a/folding-schemes/src/frontend/mod.rs b/folding-schemes/src/frontend/mod.rs index f1f73d39..65ce19be 100644 --- a/folding-schemes/src/frontend/mod.rs +++ b/folding-schemes/src/frontend/mod.rs @@ -4,8 +4,13 @@ use ark_r1cs_std::fields::fp::FpVar; use ark_relations::r1cs::{ConstraintSystemRef, SynthesisError}; use ark_std::fmt::Debug; +// we use features to activate specific frontends, to reduce the amount of dependencies and compile +// time +#[cfg(feature = "circom")] pub mod circom; +#[cfg(feature = "noir")] pub mod noir; +#[cfg(feature = "noname")] pub mod noname; /// FCircuit defines the trait of the circuit of the F function, which is the one being folded (ie. diff --git a/solidity-verifiers/Cargo.toml b/solidity-verifiers/Cargo.toml index 907f93bf..2c7ae80a 100644 --- a/solidity-verifiers/Cargo.toml +++ b/solidity-verifiers/Cargo.toml @@ -28,7 +28,8 @@ tracing-subscriber = { version = "0.2" } ark-bn254 = {version="0.4.0", features=["r1cs"]} ark-grumpkin = {version="0.4.0", features=["r1cs"]} rand = "0.8.5" -folding-schemes = { path = "../folding-schemes/", features=["light-test"]} +# use the diverse frontend features for the examples +folding-schemes = { path = "../folding-schemes/", features=["light-test", "circom", "noname", "noir"]} noname = { git = "https://github.com/dmpierre/noname" } [features] @@ -56,4 +57,3 @@ path = "../examples/noname_full_flow.rs" [[example]] name = "noir_full_flow" path = "../examples/noir_full_flow.rs" -