From 6c76a1f0d870da520a290e2c26047feeec52a1c7 Mon Sep 17 00:00:00 2001 From: Ethan-000 Date: Sat, 8 Jul 2023 11:10:58 +0100 Subject: [PATCH] chore: nix stuff (#47) * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . * . fmt.toml --- .gitattributes | 2 + .github/dependabot.yml | 11 ++ .github/workflows/nix.yml | 24 ++++ .github/workflows/pr.yml | 25 ++++ .gitignore | 6 + .rustfmt.toml | 5 + CHANGELOG.md | 16 +++ cliff.toml | 75 ++++++++++ .../benches/bench_compilation.rs | 32 ++--- .../benches/bench_noir_halo2_axiom_prove.rs | 32 ++--- .../benches/bench_noir_halo2_axiom_verify.rs | 32 ++--- .../acvm_interop/common_reference_string.rs | 37 +++-- .../src/acvm_interop/mod.rs | 6 +- .../src/acvm_interop/proof_system.rs | 47 +++---- .../src/acvm_interop/pwg.rs | 6 +- .../src/acvm_interop/smart_contract.rs | 13 +- .../src/circuit_translator.rs | 10 +- .../src/constrains.rs | 61 +++----- .../src/dimension_measure.rs | 3 +- .../src/halo2_params.rs | 3 +- .../src/halo2_plonk_api.rs | 13 +- crates/noir_halo2_backend_axiom/src/lib.rs | 3 +- crates/noir_halo2_backend_axiom/src/tests.rs | 7 +- .../src/aztec_crs.rs | 31 ++-- .../noir_halo2_backend_common/src/errors.rs | 4 +- .../src/test_helpers.rs | 48 ++----- crates/noir_halo2_backend_common/src/wasm.rs | 13 +- crates/noir_halo2_backend_pse/Cargo.toml | 2 - .../benches/bench_compilation.rs | 32 ++--- .../benches/bench_noir_halo2_pse_prove.rs | 12 +- .../benches/bench_noir_halo2_pse_verify.rs | 32 ++--- .../acvm_interop/common_reference_string.rs | 17 +-- .../src/acvm_interop/mod.rs | 6 +- .../src/acvm_interop/proof_system.rs | 54 ++++--- .../src/acvm_interop/pwg.rs | 5 +- .../src/acvm_interop/smart_contract.rs | 37 +++-- .../src/assigned_map.rs | 13 +- .../src/circuit_translator.rs | 19 +-- .../noir_halo2_backend_pse/src/constrains.rs | 49 ++----- .../src/dimension_measure.rs | 3 +- .../src/halo2_params.rs | 6 +- .../src/halo2_plonk_api.rs | 33 +---- crates/noir_halo2_backend_pse/src/tests.rs | 44 ++---- .../acvm_interop/common_reference_string.rs | 7 +- .../src/acvm_interop/mod.rs | 6 +- .../src/acvm_interop/proof_system.rs | 32 +++-- .../src/acvm_interop/pwg.rs | 6 +- .../src/acvm_interop/smart_contract.rs | 3 +- .../src/circuit_translator.rs | 25 +--- .../src/constrains.rs | 37 ++--- .../src/halo2_plonk_api.rs | 36 +---- default.nix | 10 ++ flake.lock | 132 ++++++++++++++++++ flake.nix | 123 ++++++++++++++++ shell.nix | 10 ++ 55 files changed, 727 insertions(+), 629 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/nix.yml create mode 100644 .github/workflows/pr.yml create mode 100644 .rustfmt.toml create mode 100644 CHANGELOG.md create mode 100644 cliff.toml create mode 100644 default.nix create mode 100644 flake.lock create mode 100755 flake.nix create mode 100644 shell.nix diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ee72b73 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +Cargo.lock linguist-generated=true +flake.lock linguist-generated=true \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..7521c54 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: cargo + directory: "/" + schedule: + interval: "weekly" \ No newline at end of file diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml new file mode 100644 index 0000000..c8e1192 --- /dev/null +++ b/.github/workflows/nix.yml @@ -0,0 +1,24 @@ +name: nix + +on: [push, pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref || github.run_id }} + cancel-in-progress: true + +jobs: + nix: + name: nix build + runs-on: ubuntu-latest + + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: setup nix + uses: cachix/install-nix-action@v22 + with: + github_access_token: ${{ secrets.GITHUB_TOKEN }} + + - name: run `nix flake check` + run: nix flake check --no-update-lock-file --show-trace diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000..540b523 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,25 @@ +name: "Lint PR" + +on: + pull_request_target: + types: + - opened + - edited + - synchronize + +permissions: + pull-requests: read + +jobs: + main: + name: Validate PR title + runs-on: ubuntu-latest + steps: + - uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + types: | + fix + feat + chore diff --git a/.gitignore b/.gitignore index 03d0778..a711a35 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,12 @@ node_modules pkg/ **/noir +# Nix stuff +**/outputs +result +.envrc.local +.direnv/ + # Nargo output *.proof *.acir diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..96918f6 --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,5 @@ +comment_width = 100 +imports_granularity = "Crate" +use_field_init_shorthand = true +use_small_heuristics = "Max" +wrap_comments = true diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..74fb884 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [0.1.2] - 2023-06-27 + +### Features + +- Add wasm bindgen (#44) + +### Miscellaneous Tasks + +- Refactor codebase (#43) +- Deny & cleanup (#45) + + diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..0a88218 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,75 @@ +# git-cliff ~ default configuration file +# https://git-cliff.org/docs/configuration +# +# Lines starting with "#" are comments. +# Configuration options are organized into tables and keys. +# See documentation for more information on available options. + +[changelog] +# changelog header +header = """ +# Changelog\n +All notable changes to this project will be documented in this file.\n +""" +# template for the changelog body +# https://tera.netlify.app/docs +body = """ +{% if version %}\ + ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} +{% else %}\ + ## [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ### {{ group | upper_first }} + {% for commit in commits %} + - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ + {% endfor %} +{% endfor %}\n +""" +# remove the leading and trailing whitespace from the template +trim = true +# changelog footer +footer = """ + +""" + +[git] +# parse the commits based on https://www.conventionalcommits.org +conventional_commits = true +# filter out the commits that are not conventional +filter_unconventional = true +# process each line of a commit as an individual commit +split_commits = false +# regex for preprocessing the commit messages +commit_preprocessors = [ + # { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/orhun/git-cliff/issues/${2}))"}, # replace issue numbers +] +# regex for parsing and grouping commits +commit_parsers = [ + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^doc", group = "Documentation" }, + { message = "^perf", group = "Performance" }, + { message = "^refactor", group = "Refactor" }, + { message = "^style", group = "Styling" }, + { message = "^test", group = "Testing" }, + { message = "^chore\\(release\\): prepare for", skip = true }, + { message = "^chore", group = "Miscellaneous Tasks" }, + { body = ".*security", group = "Security" }, +] +# protect breaking changes from being skipped due to matching a skipping commit_parser +protect_breaking_commits = false +# filter out the commits that are not matched by commit parsers +filter_commits = false +# glob pattern for matching git tags +tag_pattern = "v[0-9]*" +# regex for skipping tags +skip_tags = "v0.1.0-beta.1" +# regex for ignoring tags +ignore_tags = "" +# sort the tags topologically +topo_order = false +# sort the commits inside sections by oldest/newest order +sort_commits = "oldest" +# limit the number of commits included in the changelog. +# limit_commits = 42 diff --git a/crates/noir_halo2_backend_axiom/benches/bench_compilation.rs b/crates/noir_halo2_backend_axiom/benches/bench_compilation.rs index 3e4d685..3cde645 100644 --- a/crates/noir_halo2_backend_axiom/benches/bench_compilation.rs +++ b/crates/noir_halo2_backend_axiom/benches/bench_compilation.rs @@ -8,51 +8,35 @@ fn benchmark_tests_compilation(c: &mut Criterion) { // 1_mul let path = test_program_dir_path("1_mul"); - c.bench_function("1_mul_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("1_mul_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 2_div let path = test_program_dir_path("2_div"); - c.bench_function("2_div_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("2_div_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 3_add let path = test_program_dir_path("3_add"); - c.bench_function("3_add_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("3_add_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 4_sub let path = test_program_dir_path("4_sub"); - c.bench_function("4_sub_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("4_sub_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 5_over let path = test_program_dir_path("5_over"); - c.bench_function("5_over_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("5_over_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 6_array let path = test_program_dir_path("6_array"); - c.bench_function("6_array_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("6_array_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 7_function let path = test_program_dir_path("7_function"); - c.bench_function("7_function_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("7_function_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // bit_and let path = test_program_dir_path("8_bit_and"); - c.bench_function("8_bit_and_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("8_bit_and_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); } criterion_group! { diff --git a/crates/noir_halo2_backend_axiom/benches/bench_noir_halo2_axiom_prove.rs b/crates/noir_halo2_backend_axiom/benches/bench_noir_halo2_axiom_prove.rs index 3552a1a..e152adc 100644 --- a/crates/noir_halo2_backend_axiom/benches/bench_noir_halo2_axiom_prove.rs +++ b/crates/noir_halo2_backend_axiom/benches/bench_noir_halo2_axiom_prove.rs @@ -8,51 +8,35 @@ fn benchmark_tests_prove(c: &mut Criterion) { // 1_mul let path = test_program_dir_path("1_mul"); - c.bench_function("1_mul_axiom_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("1_mul_axiom_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // 2_div let path = test_program_dir_path("2_div"); - c.bench_function("2_div_axiom_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("2_div_axiom_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // 3_add let path = test_program_dir_path("3_add"); - c.bench_function("3_add_axiom_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("3_add_axiom_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // 4_sub let path = test_program_dir_path("4_sub"); - c.bench_function("4_sub_axiom_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("4_sub_axiom_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // 5_over let path = test_program_dir_path("5_over"); - c.bench_function("5_over_axiom_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("5_over_axiom_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // 6_array let path = test_program_dir_path("6_array"); - c.bench_function("6_array_axiom_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("6_array_axiom_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // 7_function let path = test_program_dir_path("7_function"); - c.bench_function("7_function_axiom_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("7_function_axiom_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // bit_and let path = test_program_dir_path("8_bit_and"); - c.bench_function("8_bit_and_axiom_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("8_bit_and_axiom_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); } criterion_group! { diff --git a/crates/noir_halo2_backend_axiom/benches/bench_noir_halo2_axiom_verify.rs b/crates/noir_halo2_backend_axiom/benches/bench_noir_halo2_axiom_verify.rs index f9ba7ad..0950077 100644 --- a/crates/noir_halo2_backend_axiom/benches/bench_noir_halo2_axiom_verify.rs +++ b/crates/noir_halo2_backend_axiom/benches/bench_noir_halo2_axiom_verify.rs @@ -8,51 +8,35 @@ fn benchmark_tests_verify(c: &mut Criterion) { // 1_mul let path = test_program_dir_path("1_mul"); - c.bench_function("1_mul_axiom_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("1_mul_axiom_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 2_div let path = test_program_dir_path("2_div"); - c.bench_function("2_div_axiom_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("2_div_axiom_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 3_add let path = test_program_dir_path("3_add"); - c.bench_function("3_add_axiom_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("3_add_axiom_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 4_sub let path = test_program_dir_path("4_sub"); - c.bench_function("4_sub_axiom_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("4_sub_axiom_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 5_over let path = test_program_dir_path("5_over"); - c.bench_function("5_over_axiom_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("5_over_axiom_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 6_array let path = test_program_dir_path("6_array"); - c.bench_function("6_array_axiom_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("6_array_axiom_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 7_function let path = test_program_dir_path("7_function"); - c.bench_function("7_function_axiom_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("7_function_axiom_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // bit_and let path = test_program_dir_path("8_bit_and"); - c.bench_function("8_bit_and_axiom_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("8_bit_and_axiom_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); } criterion_group! { diff --git a/crates/noir_halo2_backend_axiom/src/acvm_interop/common_reference_string.rs b/crates/noir_halo2_backend_axiom/src/acvm_interop/common_reference_string.rs index d81b789..fcbc02d 100644 --- a/crates/noir_halo2_backend_axiom/src/acvm_interop/common_reference_string.rs +++ b/crates/noir_halo2_backend_axiom/src/acvm_interop/common_reference_string.rs @@ -1,13 +1,14 @@ -use std::marker::PhantomData; - -use acvm::acir::native_types::WitnessMap; -use acvm::{acir::circuit::Circuit, async_trait, CommonReferenceString}; +use crate::{ + circuit_translator::NoirHalo2Translator, halo2_params::constuct_halo2_params_from_aztec_crs, + AxiomHalo2, +}; +use acvm::{ + acir::{circuit::Circuit, native_types::WitnessMap}, + async_trait, CommonReferenceString, +}; use halo2_base::halo2_proofs::halo2curves::bn256::Fr; use noir_halo2_backend_common::errors::BackendError; - -use crate::circuit_translator::NoirHalo2Translator; -use crate::halo2_params::constuct_halo2_params_from_aztec_crs; -use crate::AxiomHalo2; +use std::marker::PhantomData; // TODO(#185): Ensure CRS download works in JS #[async_trait(?Send)] @@ -25,12 +26,10 @@ impl CommonReferenceString for AxiomHalo2 { witness_values: WitnessMap::new(), _marker: PhantomData::, }; - constuct_halo2_params_from_aztec_crs(translator) - .await? - .write_custom( - &mut common_reference_string, - halo2_base::halo2_proofs::SerdeFormat::RawBytes, - ); + constuct_halo2_params_from_aztec_crs(translator).await?.write_custom( + &mut common_reference_string, + halo2_base::halo2_proofs::SerdeFormat::RawBytes, + ); // Separated to have nicer coercion on error types Ok(common_reference_string) } @@ -48,12 +47,10 @@ impl CommonReferenceString for AxiomHalo2 { witness_values: WitnessMap::new(), _marker: PhantomData::, }; - constuct_halo2_params_from_aztec_crs(translator) - .await? - .write_custom( - &mut common_reference_string, - halo2_base::halo2_proofs::SerdeFormat::RawBytes, - ); + constuct_halo2_params_from_aztec_crs(translator).await?.write_custom( + &mut common_reference_string, + halo2_base::halo2_proofs::SerdeFormat::RawBytes, + ); Ok(common_reference_string) } } diff --git a/crates/noir_halo2_backend_axiom/src/acvm_interop/mod.rs b/crates/noir_halo2_backend_axiom/src/acvm_interop/mod.rs index fae09ea..ebcc408 100644 --- a/crates/noir_halo2_backend_axiom/src/acvm_interop/mod.rs +++ b/crates/noir_halo2_backend_axiom/src/acvm_interop/mod.rs @@ -1,9 +1,9 @@ -use crate::AxiomHalo2; -use acvm::Backend; - mod common_reference_string; mod proof_system; mod pwg; mod smart_contract; +use crate::AxiomHalo2; +use acvm::Backend; + impl Backend for AxiomHalo2 {} diff --git a/crates/noir_halo2_backend_axiom/src/acvm_interop/proof_system.rs b/crates/noir_halo2_backend_axiom/src/acvm_interop/proof_system.rs index 8e88888..1f6bebd 100644 --- a/crates/noir_halo2_backend_axiom/src/acvm_interop/proof_system.rs +++ b/crates/noir_halo2_backend_axiom/src/acvm_interop/proof_system.rs @@ -1,28 +1,24 @@ -use acvm::FieldElement; -use noir_halo2_backend_common::errors::BackendError; - -use { - crate::{ - circuit_translator::NoirHalo2Translator, - halo2_plonk_api::{halo2_keygen, halo2_prove, halo2_verify}, - AxiomHalo2, - }, - acvm::{ - acir::{ - circuit::{Circuit as NoirCircuit, Opcode}, - native_types::WitnessMap, - BlackBoxFunc, - }, - Language, ProofSystemCompiler, - }, - halo2_base::halo2_proofs::{ - halo2curves::bn256::{Bn256, Fr, G1Affine}, - plonk::{ProvingKey, VerifyingKey}, - poly::kzg::commitment::ParamsKZG, - SerdeFormat, +use crate::{ + circuit_translator::NoirHalo2Translator, + halo2_plonk_api::{halo2_keygen, halo2_prove, halo2_verify}, + AxiomHalo2, +}; +use acvm::{ + acir::{ + circuit::{Circuit as NoirCircuit, Opcode}, + native_types::WitnessMap, + BlackBoxFunc, }, - std::marker::PhantomData, + FieldElement, Language, ProofSystemCompiler, +}; +use halo2_base::halo2_proofs::{ + halo2curves::bn256::{Bn256, Fr, G1Affine}, + plonk::{ProvingKey, VerifyingKey}, + poly::kzg::commitment::ParamsKZG, + SerdeFormat, }; +use noir_halo2_backend_common::errors::BackendError; +use std::marker::PhantomData; impl ProofSystemCompiler for AxiomHalo2 { type Error = BackendError; @@ -46,10 +42,7 @@ impl ProofSystemCompiler for AxiomHalo2 { ParamsKZG::::read_custom(&mut common_reference_string, SerdeFormat::RawBytes); let (pk, vk) = halo2_keygen(&translator, ¶ms); - Ok(( - pk.to_bytes(SerdeFormat::RawBytes), - vk.to_bytes(SerdeFormat::RawBytes), - )) + Ok((pk.to_bytes(SerdeFormat::RawBytes), vk.to_bytes(SerdeFormat::RawBytes))) } fn prove_with_pk( diff --git a/crates/noir_halo2_backend_axiom/src/acvm_interop/pwg.rs b/crates/noir_halo2_backend_axiom/src/acvm_interop/pwg.rs index 3a85007..a483b00 100644 --- a/crates/noir_halo2_backend_axiom/src/acvm_interop/pwg.rs +++ b/crates/noir_halo2_backend_axiom/src/acvm_interop/pwg.rs @@ -1,9 +1,5 @@ -use acvm::acir::native_types::Witness; - -use acvm::pwg::OpcodeResolutionError; -use acvm::PartialWitnessGenerator; - use crate::AxiomHalo2; +use acvm::{acir::native_types::Witness, pwg::OpcodeResolutionError, PartialWitnessGenerator}; impl PartialWitnessGenerator for AxiomHalo2 { fn schnorr_verify( diff --git a/crates/noir_halo2_backend_axiom/src/acvm_interop/smart_contract.rs b/crates/noir_halo2_backend_axiom/src/acvm_interop/smart_contract.rs index 5277330..72cd1dc 100644 --- a/crates/noir_halo2_backend_axiom/src/acvm_interop/smart_contract.rs +++ b/crates/noir_halo2_backend_axiom/src/acvm_interop/smart_contract.rs @@ -1,5 +1,5 @@ +use crate::{circuit_translator::NoirHalo2Translator, AxiomHalo2}; use acvm::SmartContract; - use halo2_base::halo2_proofs::{ halo2curves::bn256::{Bn256, Fq, Fr, G1Affine}, plonk::VerifyingKey, @@ -13,11 +13,8 @@ use snark_verifier::{ system::halo2::{compile, transcript::evm::EvmTranscript, Config}, verifier::{self, SnarkVerifier}, }; - -use crate::circuit_translator::NoirHalo2Translator; -use crate::AxiomHalo2; - use std::rc::Rc; + type PlonkVerifier = verifier::plonk::PlonkVerifier>; fn gen_evm_verifier( @@ -25,11 +22,7 @@ fn gen_evm_verifier( vk: &VerifyingKey, num_instance: Vec, ) -> String { - let protocol = compile( - params, - vk, - Config::kzg().with_num_instance(num_instance.clone()), - ); + let protocol = compile(params, vk, Config::kzg().with_num_instance(num_instance.clone())); let vk = (params.get_g()[0], params.g2(), params.s_g2()).into(); let loader = EvmLoader::new::(); diff --git a/crates/noir_halo2_backend_axiom/src/circuit_translator.rs b/crates/noir_halo2_backend_axiom/src/circuit_translator.rs index 1795b11..cf205f3 100644 --- a/crates/noir_halo2_backend_axiom/src/circuit_translator.rs +++ b/crates/noir_halo2_backend_axiom/src/circuit_translator.rs @@ -6,8 +6,9 @@ use acvm::acir::{ }; use core::panic; use halo2_base::halo2_proofs::{ - circuit::SimpleFloorPlanner, halo2curves::bn256::Fr, plonk::Circuit as Halo2PlonkCircuit, - plonk::ConstraintSystem, + circuit::SimpleFloorPlanner, + halo2curves::bn256::Fr, + plonk::{Circuit as Halo2PlonkCircuit, ConstraintSystem}, }; use noir_halo2_backend_common::errors::Error; use std::marker::PhantomData; @@ -154,10 +155,7 @@ impl Halo2PlonkCircuit for NoirHalo2Translator { BlackBoxFuncCall::FixedBaseScalarMul { .. } => { todo!() } - BlackBoxFuncCall::Keccak256 { - inputs: _, - outputs: _, - } => { + BlackBoxFuncCall::Keccak256 { inputs: _, outputs: _ } => { panic!("keccak256 has not yet been implemented") } BlackBoxFuncCall::Keccak256VariableLength { diff --git a/crates/noir_halo2_backend_axiom/src/constrains.rs b/crates/noir_halo2_backend_axiom/src/constrains.rs index f21b349..20f3aba 100644 --- a/crates/noir_halo2_backend_axiom/src/constrains.rs +++ b/crates/noir_halo2_backend_axiom/src/constrains.rs @@ -1,3 +1,7 @@ +use super::{ + assigned_map::AssignedMap, circuit_translator::NoirHalo2Translator, + halo2_plonk_api::PlonkConfig, +}; use acvm::{ acir::native_types::{Expression, Witness}, FieldElement, @@ -21,11 +25,6 @@ use noir_halo2_backend_common::{ }; use std::slice::Iter; -use super::{ - assigned_map::AssignedMap, circuit_translator::NoirHalo2Translator, - halo2_plonk_api::PlonkConfig, -}; - impl NoirHalo2Translator { pub(crate) fn add_arithmetic_constrains( &self, @@ -39,8 +38,8 @@ impl NoirHalo2Translator { let mut solution: AssignedValue; if !gate.mul_terms.is_empty() { - // if there is a mul gate, take mul term selector, left, right, and constant then compute with gates: - // mul gate: selector * left = intermediate + // if there is a mul gate, take mul term selector, left, right, and constant then + // compute with gates: mul gate: selector * left = intermediate // mul_add gate: intermediate * right + constant = output let mul_term = &gate.mul_terms[0]; @@ -49,20 +48,14 @@ impl NoirHalo2Translator { &mut ctx, &mul_term.1, noir_field_to_halo2_field( - *self - .witness_values - .get(&mul_term.1) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&mul_term.1).unwrap_or(&FieldElement::zero()), ), ); let w_r = &witness_assignments.get_or_assign( &mut ctx, &mul_term.2, noir_field_to_halo2_field( - *self - .witness_values - .get(&mul_term.1) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&mul_term.1).unwrap_or(&FieldElement::zero()), ), ); @@ -86,16 +79,11 @@ impl NoirHalo2Translator { &mut ctx, &term.1, noir_field_to_halo2_field( - *self - .witness_values - .get(&term.1) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&term.1).unwrap_or(&FieldElement::zero()), ), ); // multiply to get term value & add to existing solution value - solution = config - .gate_chip - .mul_add(&mut ctx, coefficient, *variable, solution); + solution = config.gate_chip.mul_add(&mut ctx, coefficient, *variable, solution); } // constrain the solution to the output to be equal to 0 @@ -116,16 +104,11 @@ impl NoirHalo2Translator { &mut ctx, &witness, noir_field_to_halo2_field( - *self - .witness_values - .get(&witness) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&witness).unwrap_or(&FieldElement::zero()), ), ); - config - .range_chip - .range_check(&mut ctx, *x, num_bits as usize); + config.range_chip.range_check(&mut ctx, *x, num_bits as usize); } pub(crate) fn add_and_constrain( @@ -143,30 +126,21 @@ impl NoirHalo2Translator { &mut ctx, &lhs, noir_field_to_halo2_field( - *self - .witness_values - .get(&lhs) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&lhs).unwrap_or(&FieldElement::zero()), ), ); let rhs_v = &witness_assignments.get_or_assign( &mut ctx, &rhs, noir_field_to_halo2_field( - *self - .witness_values - .get(&rhs) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&rhs).unwrap_or(&FieldElement::zero()), ), ); let output_v = &witness_assignments.get_or_assign( &mut ctx, &output, noir_field_to_halo2_field( - *self - .witness_values - .get(&output) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&output).unwrap_or(&FieldElement::zero()), ), ); @@ -212,10 +186,7 @@ impl NoirHalo2Translator { assert_eq!(res.value(), &Fr::one()); let result_value = noir_field_to_halo2_field( - *self - .witness_values - .get(&result) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&result).unwrap_or(&FieldElement::zero()), ); let output = ctx.load_witness(result_value); diff --git a/crates/noir_halo2_backend_axiom/src/dimension_measure.rs b/crates/noir_halo2_backend_axiom/src/dimension_measure.rs index 1308683..726413f 100644 --- a/crates/noir_halo2_backend_axiom/src/dimension_measure.rs +++ b/crates/noir_halo2_backend_axiom/src/dimension_measure.rs @@ -1,8 +1,6 @@ // copied and adapted from https://github.com/privacy-scaling-explorations/halo2wrong/blob/master/halo2wrong/src/utils.rs // cus fn k() is private. -use std::{cell::RefCell, ops::RangeInclusive}; - use halo2_base::halo2_proofs::{ circuit::Value, plonk::{ @@ -11,6 +9,7 @@ use halo2_base::halo2_proofs::{ }, }; use halo2_ecc::fields::PrimeField; +use std::{cell::RefCell, ops::RangeInclusive}; #[derive(Default)] pub struct DimensionMeasurement { diff --git a/crates/noir_halo2_backend_axiom/src/halo2_params.rs b/crates/noir_halo2_backend_axiom/src/halo2_params.rs index b48d019..1654940 100644 --- a/crates/noir_halo2_backend_axiom/src/halo2_params.rs +++ b/crates/noir_halo2_backend_axiom/src/halo2_params.rs @@ -1,3 +1,4 @@ +use crate::dimension_measure::DimensionMeasurement; use halo2_base::halo2_proofs::{ arithmetic::g_to_lagrange, halo2curves::{ @@ -13,8 +14,6 @@ use halo2_base::halo2_proofs::{ use noir_halo2_backend_common::{aztec_crs::get_aztec_crs, errors::Error}; use std::io::Write; -use crate::dimension_measure::DimensionMeasurement; - pub(crate) async fn constuct_halo2_params_from_aztec_crs( translator: impl halo2_base::halo2_proofs::plonk::Circuit, ) -> Result, Error> { diff --git a/crates/noir_halo2_backend_axiom/src/halo2_plonk_api.rs b/crates/noir_halo2_backend_axiom/src/halo2_plonk_api.rs index bd8a69f..79829ff 100644 --- a/crates/noir_halo2_backend_axiom/src/halo2_plonk_api.rs +++ b/crates/noir_halo2_backend_axiom/src/halo2_plonk_api.rs @@ -2,9 +2,8 @@ use crate::circuit_translator::NoirHalo2Translator; use halo2_base::{ gates::{GateChip, RangeChip}, halo2_proofs::{ - halo2curves::bn256::Fr, halo2curves::{ - bn256::{Bn256, G1Affine, G1}, + bn256::{Bn256, Fr, G1Affine, G1}, group::cofactor::CofactorCurve, }, plonk::{ @@ -26,10 +25,7 @@ use rand::rngs::OsRng; pub fn halo2_keygen( circuit: &NoirHalo2Translator, params: &ParamsKZG, -) -> ( - ProvingKey<::Affine>, - VerifyingKey<::Affine>, -) { +) -> (ProvingKey<::Affine>, VerifyingKey<::Affine>) { let vk = keygen_vk(params, circuit).expect("keygen_vk should not fail"); let vk_return = vk.clone(); let pk = keygen_pk(params, vk, circuit).expect("keygen_pk should not fail"); @@ -83,9 +79,6 @@ impl PlonkConfig { let range_chip = RangeChip::default(17); let gate_chip = GateChip::default(); - PlonkConfig { - range_chip, - gate_chip, - } + PlonkConfig { range_chip, gate_chip } } } diff --git a/crates/noir_halo2_backend_axiom/src/lib.rs b/crates/noir_halo2_backend_axiom/src/lib.rs index 5aa9c07..0526030 100644 --- a/crates/noir_halo2_backend_axiom/src/lib.rs +++ b/crates/noir_halo2_backend_axiom/src/lib.rs @@ -1,9 +1,8 @@ mod acvm_interop; -mod dimension_measure; - mod assigned_map; mod circuit_translator; mod constrains; +mod dimension_measure; mod halo2_params; mod halo2_plonk_api; mod tests; diff --git a/crates/noir_halo2_backend_axiom/src/tests.rs b/crates/noir_halo2_backend_axiom/src/tests.rs index 54fbd13..322f5b6 100644 --- a/crates/noir_halo2_backend_axiom/src/tests.rs +++ b/crates/noir_halo2_backend_axiom/src/tests.rs @@ -160,11 +160,8 @@ mod test { let (circuit, witness_values) = build_artifacts(program, "axiom_halo2_backend"); // instantiate halo2 circuit - let translator = NoirHalo2Translator:: { - circuit, - witness_values, - _marker: PhantomData::, - }; + let translator = + NoirHalo2Translator:: { circuit, witness_values, _marker: PhantomData:: }; let dimension = DimensionMeasurement::measure(&translator).unwrap(); // run mock prover expecting success diff --git a/crates/noir_halo2_backend_common/src/aztec_crs.rs b/crates/noir_halo2_backend_common/src/aztec_crs.rs index d5f2b41..5898f66 100644 --- a/crates/noir_halo2_backend_common/src/aztec_crs.rs +++ b/crates/noir_halo2_backend_common/src/aztec_crs.rs @@ -1,9 +1,7 @@ use crate::errors::{CRSError, Error}; use bytesize::ByteSize; -use std::env; - use reqwest::Client; - +use std::env; const G1_START: usize = 28; const G2_START: usize = 28 + (5_040_000 * 64); const G2_END: usize = G2_START + 128 - 1; @@ -33,29 +31,16 @@ async fn download(start: usize, end: usize) -> Result, CRSError> { .get(&transcript_url) .header(reqwest::header::RANGE, format!("bytes={start}-{end}")) .build() - .map_err(|source| CRSError::Request { - url: transcript_url.to_string(), - source, - })?; + .map_err(|source| CRSError::Request { url: transcript_url.to_string(), source })?; let response = client .execute(request) .await - .map_err(|source| CRSError::Fetch { - url: transcript_url.to_string(), - source, - })?; - let total_size = response.content_length().ok_or(CRSError::Length { - url: transcript_url.to_string(), - })?; - - println!( - "\nDownloading the Ignite SRS ({})", - ByteSize(total_size).to_string_as(false) - ); - let crs_bytes = response - .bytes() - .await - .map_err(|source| CRSError::Download { source })?; + .map_err(|source| CRSError::Fetch { url: transcript_url.to_string(), source })?; + let total_size = + response.content_length().ok_or(CRSError::Length { url: transcript_url.to_string() })?; + + println!("\nDownloading the Ignite SRS ({})", ByteSize(total_size).to_string_as(false)); + let crs_bytes = response.bytes().await.map_err(|source| CRSError::Download { source })?; println!("Downloaded the SRS successfully!"); Ok(crs_bytes.into()) diff --git a/crates/noir_halo2_backend_common/src/errors.rs b/crates/noir_halo2_backend_common/src/errors.rs index 3dc600e..eb37560 100644 --- a/crates/noir_halo2_backend_common/src/errors.rs +++ b/crates/noir_halo2_backend_common/src/errors.rs @@ -4,9 +4,7 @@ use thiserror::Error; #[derive(Debug, Error)] pub enum FeatureError { #[error("Could not slice field element")] - _FieldElementSlice { - source: std::array::TryFromSliceError, - }, + _FieldElementSlice { source: std::array::TryFromSliceError }, #[error("Expected a Vec of length {0} but it was {1}")] _FieldToArray(usize, usize), } diff --git a/crates/noir_halo2_backend_common/src/test_helpers.rs b/crates/noir_halo2_backend_common/src/test_helpers.rs index 16c25e7..7b324b3 100644 --- a/crates/noir_halo2_backend_common/src/test_helpers.rs +++ b/crates/noir_halo2_backend_common/src/test_helpers.rs @@ -1,4 +1,6 @@ #![allow(dead_code)] +use acvm::acir::{circuit::Circuit, native_types::WitnessMap}; +use serde_json::Value; use std::{ fs::{self, File}, io::{Read, Result}, @@ -6,9 +8,6 @@ use std::{ process::{Command, Output}, }; -use acvm::acir::{circuit::Circuit, native_types::WitnessMap}; -use serde_json::Value; - pub fn configure_test_dirs() -> Vec { let test_dirs_names = vec![ "1_mul", @@ -21,10 +20,7 @@ pub fn configure_test_dirs() -> Vec { "8_bit_and", // "9_public_io", ]; - test_dirs_names - .into_iter() - .map(test_program_dir_path) - .collect() + test_dirs_names.into_iter().map(test_program_dir_path).collect() } fn nargo_cmd() -> std::process::Command { @@ -32,39 +28,19 @@ fn nargo_cmd() -> std::process::Command { } fn nargo_execute(test_program_dir: &PathBuf) -> Result { - nargo_cmd() - .current_dir(test_program_dir) - .arg("execute") - .spawn() - .unwrap() - .wait_with_output() + nargo_cmd().current_dir(test_program_dir).arg("execute").spawn().unwrap().wait_with_output() } fn nargo_test(test_program_dir: &PathBuf) -> Result { - nargo_cmd() - .current_dir(test_program_dir) - .arg("test") - .spawn() - .unwrap() - .wait_with_output() + nargo_cmd().current_dir(test_program_dir).arg("test").spawn().unwrap().wait_with_output() } fn nargo_check(test_program_dir: &PathBuf) -> Result { - nargo_cmd() - .current_dir(test_program_dir) - .arg("check") - .spawn() - .unwrap() - .wait_with_output() + nargo_cmd().current_dir(test_program_dir).arg("check").spawn().unwrap().wait_with_output() } fn nargo_gates(test_program_dir: &PathBuf) -> Result { - nargo_cmd() - .current_dir(test_program_dir) - .arg("gates") - .spawn() - .unwrap() - .wait_with_output() + nargo_cmd().current_dir(test_program_dir).arg("gates").spawn().unwrap().wait_with_output() } fn nargo_compile(test_program_dir: &PathBuf) -> Result { @@ -182,7 +158,8 @@ pub fn run_nargo_verify(test_program: PathBuf) { } /** - * Given a test_program circuit program name, build the circuit and witness artifacts & return the deserialized objects + * Given a test_program circuit program name, build the circuit and witness artifacts & return + * the deserialized objects * * @param program - program name for circuit to be compiled and solved * @return - the deserialized ACIR and solved witness (given the saved Prover.toml) @@ -191,10 +168,9 @@ pub fn run_nargo_verify(test_program: PathBuf) { pub fn build_artifacts(program: &'static str, backend: &'static str) -> (Circuit, WitnessMap) { install_nargo(backend); // format path to test program - let path = std::fs::canonicalize(format!( - "../noir_halo2_backend_common/test_programs/{program}" - )) - .unwrap(); + let path = + std::fs::canonicalize(format!("../noir_halo2_backend_common/test_programs/{program}")) + .unwrap(); let path = path.to_str().unwrap(); // build circuit bytecode diff --git a/crates/noir_halo2_backend_common/src/wasm.rs b/crates/noir_halo2_backend_common/src/wasm.rs index 4c8446b..ae83360 100644 --- a/crates/noir_halo2_backend_common/src/wasm.rs +++ b/crates/noir_halo2_backend_common/src/wasm.rs @@ -45,9 +45,7 @@ macro_rules! impl_noir_halo2_backend_wasm_bindgen { serde_wasm_bindgen::from_value(common_reference_string_js)?; let circuit: Circuit = serde_wasm_bindgen::from_value(circuit_js)?; - let (pk, _) = $halo2 - .preprocess(&common_reference_string, &circuit) - .unwrap(); + let (pk, _) = $halo2.preprocess(&common_reference_string, &circuit).unwrap(); Ok(serde_wasm_bindgen::to_value(&pk)?) } @@ -61,9 +59,7 @@ macro_rules! impl_noir_halo2_backend_wasm_bindgen { serde_wasm_bindgen::from_value(common_reference_string_js)?; let circuit: Circuit = serde_wasm_bindgen::from_value(circuit_js)?; - let (_, vk) = $halo2 - .preprocess(&common_reference_string, &circuit) - .unwrap(); + let (_, vk) = $halo2.preprocess(&common_reference_string, &circuit).unwrap(); Ok(serde_wasm_bindgen::to_value(&vk)?) } @@ -132,9 +128,8 @@ macro_rules! impl_noir_halo2_backend_wasm_bindgen { serde_wasm_bindgen::from_value(common_reference_string_js)?; let verification_key: Vec = serde_wasm_bindgen::from_value(verification_key_js)?; - let contract = $halo2 - .eth_contract_from_vk(&common_reference_string, &verification_key) - .unwrap(); + let contract = + $halo2.eth_contract_from_vk(&common_reference_string, &verification_key).unwrap(); Ok(contract) } diff --git a/crates/noir_halo2_backend_pse/Cargo.toml b/crates/noir_halo2_backend_pse/Cargo.toml index 0d27f4e..5fa37ce 100644 --- a/crates/noir_halo2_backend_pse/Cargo.toml +++ b/crates/noir_halo2_backend_pse/Cargo.toml @@ -9,8 +9,6 @@ license.workspace = true [lib] crate-type = ["cdylib", "rlib"] -resolver = "2" - [dependencies] acvm.workspace = true noir_halo2_backend_common.workspace = true diff --git a/crates/noir_halo2_backend_pse/benches/bench_compilation.rs b/crates/noir_halo2_backend_pse/benches/bench_compilation.rs index 405192c..6bf3bfd 100644 --- a/crates/noir_halo2_backend_pse/benches/bench_compilation.rs +++ b/crates/noir_halo2_backend_pse/benches/bench_compilation.rs @@ -8,51 +8,35 @@ fn benchmark_tests_compilation(c: &mut Criterion) { // 1_mul let path = test_program_dir_path("1_mul"); - c.bench_function("1_mul_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("1_mul_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 2_div let path = test_program_dir_path("2_div"); - c.bench_function("2_div_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("2_div_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 3_add let path = test_program_dir_path("3_add"); - c.bench_function("3_add_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("3_add_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 4_sub let path = test_program_dir_path("4_sub"); - c.bench_function("4_sub_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("4_sub_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 5_over let path = test_program_dir_path("5_over"); - c.bench_function("5_over_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("5_over_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 6_array let path = test_program_dir_path("6_array"); - c.bench_function("6_array_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("6_array_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // 7_function let path = test_program_dir_path("7_function"); - c.bench_function("7_function_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("7_function_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); // bit_and let path = test_program_dir_path("8_bit_and"); - c.bench_function("8_bit_and_compilation", |b| { - b.iter(|| run_nargo_compile(path.clone())) - }); + c.bench_function("8_bit_and_compilation", |b| b.iter(|| run_nargo_compile(path.clone()))); } criterion_group! { diff --git a/crates/noir_halo2_backend_pse/benches/bench_noir_halo2_pse_prove.rs b/crates/noir_halo2_backend_pse/benches/bench_noir_halo2_pse_prove.rs index ffc74eb..6164c84 100644 --- a/crates/noir_halo2_backend_pse/benches/bench_noir_halo2_pse_prove.rs +++ b/crates/noir_halo2_backend_pse/benches/bench_noir_halo2_pse_prove.rs @@ -28,21 +28,15 @@ fn benchmark_tests_prove(c: &mut Criterion) { // 6_array let path = test_program_dir_path("6_array"); - c.bench_function("6_array_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("6_array_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // 7_function let path = test_program_dir_path("7_function"); - c.bench_function("7_function_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("7_function_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); // bit_and let path = test_program_dir_path("8_bit_and"); - c.bench_function("8_bit_and_prove", |b| { - b.iter(|| run_nargo_prove(path.clone())) - }); + c.bench_function("8_bit_and_prove", |b| b.iter(|| run_nargo_prove(path.clone()))); } criterion_group! { diff --git a/crates/noir_halo2_backend_pse/benches/bench_noir_halo2_pse_verify.rs b/crates/noir_halo2_backend_pse/benches/bench_noir_halo2_pse_verify.rs index d65f2bb..909968c 100644 --- a/crates/noir_halo2_backend_pse/benches/bench_noir_halo2_pse_verify.rs +++ b/crates/noir_halo2_backend_pse/benches/bench_noir_halo2_pse_verify.rs @@ -8,51 +8,35 @@ fn benchmark_tests_verify(c: &mut Criterion) { // 1_mul let path = test_program_dir_path("1_mul"); - c.bench_function("1_mul_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("1_mul_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 2_div let path = test_program_dir_path("2_div"); - c.bench_function("2_div_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("2_div_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 3_add let path = test_program_dir_path("3_add"); - c.bench_function("3_add_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("3_add_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 4_sub let path = test_program_dir_path("4_sub"); - c.bench_function("4_sub_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("4_sub_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 5_over let path = test_program_dir_path("5_over"); - c.bench_function("5_over_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("5_over_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 6_array let path = test_program_dir_path("6_array"); - c.bench_function("6_array_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("6_array_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // 7_function let path = test_program_dir_path("7_function"); - c.bench_function("7_function_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("7_function_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); // bit_and let path = test_program_dir_path("8_bit_and"); - c.bench_function("8_bit_and_verify", |b| { - b.iter(|| run_nargo_verify(path.clone())) - }); + c.bench_function("8_bit_and_verify", |b| b.iter(|| run_nargo_verify(path.clone()))); } criterion_group! { diff --git a/crates/noir_halo2_backend_pse/src/acvm_interop/common_reference_string.rs b/crates/noir_halo2_backend_pse/src/acvm_interop/common_reference_string.rs index 3a70cec..94ac3ff 100644 --- a/crates/noir_halo2_backend_pse/src/acvm_interop/common_reference_string.rs +++ b/crates/noir_halo2_backend_pse/src/acvm_interop/common_reference_string.rs @@ -1,13 +1,14 @@ -use std::marker::PhantomData; - -use acvm::acir::native_types::WitnessMap; -use acvm::{acir::circuit::Circuit, async_trait, CommonReferenceString}; +use crate::{ + circuit_translator::NoirHalo2Translator, halo2_params::constuct_halo2_params_from_aztec_crs, + PseHalo2, +}; +use acvm::{ + acir::{circuit::Circuit, native_types::WitnessMap}, + async_trait, CommonReferenceString, +}; use noir_halo2_backend_common::errors::BackendError; use pse_halo2wrong::curves::bn256::Fr; - -use crate::circuit_translator::NoirHalo2Translator; -use crate::halo2_params::constuct_halo2_params_from_aztec_crs; -use crate::PseHalo2; +use std::marker::PhantomData; #[async_trait(?Send)] impl CommonReferenceString for PseHalo2 { diff --git a/crates/noir_halo2_backend_pse/src/acvm_interop/mod.rs b/crates/noir_halo2_backend_pse/src/acvm_interop/mod.rs index f7b8119..c4c7cd1 100644 --- a/crates/noir_halo2_backend_pse/src/acvm_interop/mod.rs +++ b/crates/noir_halo2_backend_pse/src/acvm_interop/mod.rs @@ -1,9 +1,9 @@ -use crate::PseHalo2; -use acvm::Backend; - mod common_reference_string; mod proof_system; mod pwg; mod smart_contract; +use crate::PseHalo2; +use acvm::Backend; + impl Backend for PseHalo2 {} diff --git a/crates/noir_halo2_backend_pse/src/acvm_interop/proof_system.rs b/crates/noir_halo2_backend_pse/src/acvm_interop/proof_system.rs index 0d82cca..38f9193 100644 --- a/crates/noir_halo2_backend_pse/src/acvm_interop/proof_system.rs +++ b/crates/noir_halo2_backend_pse/src/acvm_interop/proof_system.rs @@ -1,27 +1,26 @@ +use crate::{ + circuit_translator::NoirHalo2Translator, + dimension_measure::DimensionMeasurement, + halo2_plonk_api::{halo2_keygen, halo2_prove, halo2_verify, OpcodeFlags}, + PseHalo2, +}; +use acvm::{ + acir::{ + circuit::{Circuit as NoirCircuit, Opcode}, + native_types::WitnessMap, + BlackBoxFunc, + }, + FieldElement, Language, ProofSystemCompiler, +}; +use noir_halo2_backend_common::{errors::BackendError, noir_field_to_halo2_field}; +use pse_halo2wrong::halo2::{ + halo2curves::bn256::{Bn256, Fr, G1Affine}, + plonk::{ProvingKey, VerifyingKey}, + poly::kzg::commitment::ParamsKZG, + SerdeFormat, +}; use std::marker::PhantomData; -use acvm::acir::circuit::Circuit as NoirCircuit; -use acvm::acir::circuit::Opcode; -use acvm::acir::native_types::WitnessMap; -use acvm::acir::BlackBoxFunc; -use acvm::FieldElement; -use acvm::{Language, ProofSystemCompiler}; -use noir_halo2_backend_common::errors::BackendError; -use noir_halo2_backend_common::noir_field_to_halo2_field; -use pse_halo2wrong::halo2::halo2curves::bn256::Fr; -use pse_halo2wrong::halo2::halo2curves::bn256::{Bn256, G1Affine}; -use pse_halo2wrong::halo2::plonk::{ProvingKey, VerifyingKey}; - -use pse_halo2wrong::halo2::poly::kzg::commitment::ParamsKZG; -use pse_halo2wrong::halo2::SerdeFormat; - -use crate::circuit_translator::NoirHalo2Translator; -use crate::dimension_measure::DimensionMeasurement; -use crate::halo2_plonk_api::OpcodeFlags; -use crate::halo2_plonk_api::{halo2_keygen, halo2_prove, halo2_verify}; - -use crate::PseHalo2; - impl ProofSystemCompiler for PseHalo2 { type Error = BackendError; @@ -57,10 +56,7 @@ impl ProofSystemCompiler for PseHalo2 { .unwrap(); let (pk, vk) = halo2_keygen(&translator, ¶ms); - Ok(( - pk.to_bytes(SerdeFormat::RawBytes), - vk.to_bytes(SerdeFormat::RawBytes), - )) + Ok((pk.to_bytes(SerdeFormat::RawBytes), vk.to_bytes(SerdeFormat::RawBytes))) } /// Generate proof with Proving Key @@ -129,10 +125,8 @@ impl ProofSystemCompiler for PseHalo2 { ) .unwrap(); - let instance: Vec = public_inputs - .into_iter() - .map(|(_, el)| noir_field_to_halo2_field(el)) - .collect(); + let instance: Vec = + public_inputs.into_iter().map(|(_, el)| noir_field_to_halo2_field(el)).collect(); Ok(halo2_verify(¶ms, &vk, proof, &instance[..]).is_ok()) } diff --git a/crates/noir_halo2_backend_pse/src/acvm_interop/pwg.rs b/crates/noir_halo2_backend_pse/src/acvm_interop/pwg.rs index 42f2f47..e87d5db 100644 --- a/crates/noir_halo2_backend_pse/src/acvm_interop/pwg.rs +++ b/crates/noir_halo2_backend_pse/src/acvm_interop/pwg.rs @@ -1,8 +1,5 @@ -use acvm::acir::native_types::Witness; -use acvm::pwg::OpcodeResolutionError; -use acvm::PartialWitnessGenerator; - use crate::PseHalo2; +use acvm::{acir::native_types::Witness, pwg::OpcodeResolutionError, PartialWitnessGenerator}; impl PartialWitnessGenerator for PseHalo2 { fn schnorr_verify( diff --git a/crates/noir_halo2_backend_pse/src/acvm_interop/smart_contract.rs b/crates/noir_halo2_backend_pse/src/acvm_interop/smart_contract.rs index 2605afa..bb625b3 100644 --- a/crates/noir_halo2_backend_pse/src/acvm_interop/smart_contract.rs +++ b/crates/noir_halo2_backend_pse/src/acvm_interop/smart_contract.rs @@ -1,21 +1,22 @@ -use std::rc::Rc; - +use crate::{circuit_translator::NoirHalo2Translator, halo2_plonk_api::OpcodeFlags, PseHalo2}; use acvm::SmartContract; use noir_halo2_backend_common::errors::BackendError; -use pse_halo2wrong::curves::bn256::{Bn256, Fq, Fr, G1Affine}; -use pse_halo2wrong::halo2::plonk::VerifyingKey; -use pse_halo2wrong::halo2::poly::commitment::ParamsProver; -use pse_halo2wrong::halo2::poly::kzg::commitment::ParamsKZG; -use pse_halo2wrong::halo2::SerdeFormat; -use pse_snark_verifier::loader::evm::EvmLoader; -use pse_snark_verifier::pcs::kzg::{Gwc19, KzgAs}; -use pse_snark_verifier::system::halo2::transcript::evm::EvmTranscript; -use pse_snark_verifier::system::halo2::{compile, Config}; -use pse_snark_verifier::verifier::{self, SnarkVerifier}; +use pse_halo2wrong::{ + curves::bn256::{Bn256, Fq, Fr, G1Affine}, + halo2::{ + plonk::VerifyingKey, + poly::{commitment::ParamsProver, kzg::commitment::ParamsKZG}, + SerdeFormat, + }, +}; +use pse_snark_verifier::{ + loader::evm::EvmLoader, + pcs::kzg::{Gwc19, KzgAs}, + system::halo2::{compile, transcript::evm::EvmTranscript, Config}, + verifier::{self, SnarkVerifier}, +}; +use std::rc::Rc; -use crate::circuit_translator::NoirHalo2Translator; -use crate::halo2_plonk_api::OpcodeFlags; -use crate::PseHalo2; type PlonkVerifier = verifier::plonk::PlonkVerifier>; /// Generate the evm verifier of the circuit as Yul code @@ -24,11 +25,7 @@ fn gen_evm_verifier( vk: &VerifyingKey, num_instance: Vec, ) -> String { - let protocol = compile( - params, - vk, - Config::kzg().with_num_instance(num_instance.clone()), - ); + let protocol = compile(params, vk, Config::kzg().with_num_instance(num_instance.clone())); let vk = (params.get_g()[0], params.g2(), params.s_g2()).into(); let loader = EvmLoader::new::(); diff --git a/crates/noir_halo2_backend_pse/src/assigned_map.rs b/crates/noir_halo2_backend_pse/src/assigned_map.rs index b4139a1..0891adf 100644 --- a/crates/noir_halo2_backend_pse/src/assigned_map.rs +++ b/crates/noir_halo2_backend_pse/src/assigned_map.rs @@ -38,14 +38,15 @@ impl AssignedMap { }; } - /// Check if a given acir witness index needs a copy constraint when assigning a witness to a halo2 cell. - /// If so, perform an equality constraint on a given cell if a given witness appears in the assignment map + /// Check if a given acir witness index needs a copy constraint when assigning a witness to a + /// halo2 cell. If so, perform an equality constraint on a given cell if a given witness + /// appears in the assignment map // // @param ctx - the context for the region being assigned to - // @param assignments - the assignment map of acir witness index to exsiting halo2 cells storing witness assignments - // @param witness - the acir witness index to check for - // @param cell - the newly assigned cell to copy constrain with a cell stored in the assignment map - // @return - success if copy constraint operation succeeds + // @param assignments - the assignment map of acir witness index to exsiting halo2 cells storing + // witness assignments @param witness - the acir witness index to check for + // @param cell - the newly assigned cell to copy constrain with a cell stored in the assignment + // map @return - success if copy constraint operation succeeds pub fn check_and_copy( &self, ctx: &mut RegionCtx, diff --git a/crates/noir_halo2_backend_pse/src/circuit_translator.rs b/crates/noir_halo2_backend_pse/src/circuit_translator.rs index 27109ed..ac42391 100644 --- a/crates/noir_halo2_backend_pse/src/circuit_translator.rs +++ b/crates/noir_halo2_backend_pse/src/circuit_translator.rs @@ -1,19 +1,17 @@ -use core::panic; -use std::marker::PhantomData; - +use super::halo2_plonk_api::OpcodeFlags; use crate::{assigned_map::AssignedMap, halo2_plonk_api::PlonkConfig}; use acvm::acir::{ circuit::{opcodes::BlackBoxFuncCall, Circuit as NoirCircuit, Opcode}, native_types::WitnessMap, }; - +use core::panic; use pse_halo2wrong::halo2::{ - circuit::SimpleFloorPlanner, halo2curves::bn256::Fr, plonk::Circuit as Halo2PlonkCircuit, - plonk::ConstraintSystem, + circuit::SimpleFloorPlanner, + halo2curves::bn256::Fr, + plonk::{Circuit as Halo2PlonkCircuit, ConstraintSystem}, }; use pse_maingate::{RangeChip, RangeInstructions}; - -use super::halo2_plonk_api::OpcodeFlags; +use std::marker::PhantomData; /// Concrete Halo2 Circuit #[derive(Clone, Default, Debug)] @@ -127,10 +125,7 @@ impl Halo2PlonkCircuit for NoirHalo2Translator { BlackBoxFuncCall::FixedBaseScalarMul { .. } => { todo!() } - BlackBoxFuncCall::Keccak256 { - inputs: _, - outputs: _, - } => { + BlackBoxFuncCall::Keccak256 { inputs: _, outputs: _ } => { panic!("keccak256 has not yet been implemented") } BlackBoxFuncCall::Keccak256VariableLength { diff --git a/crates/noir_halo2_backend_pse/src/constrains.rs b/crates/noir_halo2_backend_pse/src/constrains.rs index 5fbf6d1..d34c387 100644 --- a/crates/noir_halo2_backend_pse/src/constrains.rs +++ b/crates/noir_halo2_backend_pse/src/constrains.rs @@ -1,8 +1,9 @@ +use super::halo2_plonk_api::{NoirConstraint, PlonkConfig}; +use crate::{assigned_map::AssignedMap, circuit_translator::NoirHalo2Translator}; use acvm::{ acir::native_types::{Expression, Witness}, FieldElement, }; - use noir_halo2_backend_common::noir_field_to_halo2_field; use pse_halo2wrong::{ halo2::{ @@ -16,10 +17,6 @@ use pse_maingate::{ RangeInstructions, Term, }; -use crate::{assigned_map::AssignedMap, circuit_translator::NoirHalo2Translator}; - -use super::halo2_plonk_api::{NoirConstraint, PlonkConfig}; - impl NoirHalo2Translator { pub(crate) fn add_arithmetic_constrains( &self, @@ -51,22 +48,13 @@ impl NoirHalo2Translator { noir_cs.qc = gate.q_c; let a = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get_index(noir_cs.a as u32) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get_index(noir_cs.a as u32).unwrap_or(&FieldElement::zero()), )); let b = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get_index(noir_cs.b as u32) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get_index(noir_cs.b as u32).unwrap_or(&FieldElement::zero()), )); let c = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get_index(noir_cs.c as u32) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get_index(noir_cs.c as u32).unwrap_or(&FieldElement::zero()), )); let qm = noir_field_to_halo2_field(noir_cs.qm); @@ -137,10 +125,7 @@ impl NoirHalo2Translator { witness_assignments: &mut AssignedMap, ) -> Result<(), pse_halo2wrong::halo2::plonk::Error> { let input = noir_field_to_halo2_field( - *self - .witness_values - .get(&witness) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&witness).unwrap_or(&FieldElement::zero()), ); layouter.assign_region( @@ -176,24 +161,15 @@ impl NoirHalo2Translator { witness_assignments: &mut AssignedMap, ) -> Result<(), pse_halo2wrong::halo2::plonk::Error> { let lhs_v = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get(&lhs) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&lhs).unwrap_or(&FieldElement::zero()), )); let rhs_v = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get(&rhs) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&rhs).unwrap_or(&FieldElement::zero()), )); let output_v = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get(&output) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get(&output).unwrap_or(&FieldElement::zero()), )); layouter.assign_region( @@ -239,11 +215,8 @@ impl NoirHalo2Translator { let main_gate = MainGate::::new(config.main_gate_config.clone()); // loop through public witness indices and expose publicly through main gate for (i, _) in public_indices.iter().enumerate() { - let assigned = witness_assignments - .get_index(public_indices[i]) - .unwrap() - .last() - .unwrap(); + let assigned = + witness_assignments.get_index(public_indices[i]).unwrap().last().unwrap(); main_gate.expose_public( layouter.namespace(|| format!("Public IO #{i:?}")), assigned.clone(), diff --git a/crates/noir_halo2_backend_pse/src/dimension_measure.rs b/crates/noir_halo2_backend_pse/src/dimension_measure.rs index a287475..5d117a7 100644 --- a/crates/noir_halo2_backend_pse/src/dimension_measure.rs +++ b/crates/noir_halo2_backend_pse/src/dimension_measure.rs @@ -1,8 +1,6 @@ // copied and adapted from https://github.com/privacy-scaling-explorations/halo2wrong/blob/master/halo2wrong/src/utils.rs // cus fn k() is private. -use std::{cell::RefCell, ops::RangeInclusive}; - use pse_halo2wrong::{ curves::group::ff::PrimeField, halo2::{ @@ -13,6 +11,7 @@ use pse_halo2wrong::{ }, }, }; +use std::{cell::RefCell, ops::RangeInclusive}; #[derive(Default)] pub struct DimensionMeasurement { diff --git a/crates/noir_halo2_backend_pse/src/halo2_params.rs b/crates/noir_halo2_backend_pse/src/halo2_params.rs index f89e73c..85b31f6 100644 --- a/crates/noir_halo2_backend_pse/src/halo2_params.rs +++ b/crates/noir_halo2_backend_pse/src/halo2_params.rs @@ -1,5 +1,4 @@ -use std::io::Write; - +use crate::dimension_measure::DimensionMeasurement; use noir_halo2_backend_common::{aztec_crs::get_aztec_crs, errors::Error}; use pse_halo2wrong::{ curves::bn256::Fr, @@ -16,8 +15,7 @@ use pse_halo2wrong::{ SerdeFormat, }, }; - -use crate::dimension_measure::DimensionMeasurement; +use std::io::Write; /// Serialize halo2 parameters from Aztec CRS ceremony pub(crate) async fn constuct_halo2_params_from_aztec_crs( diff --git a/crates/noir_halo2_backend_pse/src/halo2_plonk_api.rs b/crates/noir_halo2_backend_pse/src/halo2_plonk_api.rs index d6c062e..382d1df 100644 --- a/crates/noir_halo2_backend_pse/src/halo2_plonk_api.rs +++ b/crates/noir_halo2_backend_pse/src/halo2_plonk_api.rs @@ -1,12 +1,11 @@ +use crate::circuit_translator::NoirHalo2Translator; use acvm::{ acir::circuit::{opcodes::BlackBoxFuncCall, Opcode}, FieldElement, }; - use pse_halo2wrong::halo2::{ - halo2curves::bn256::Fr, halo2curves::{ - bn256::{Bn256, G1Affine, G1}, + bn256::{Bn256, Fr, G1Affine, G1}, group::cofactor::CofactorCurve, }, plonk::{ @@ -22,22 +21,15 @@ use pse_halo2wrong::halo2::{ Blake2bRead, Blake2bWrite, Challenge255, TranscriptReadBuffer, TranscriptWriterBuffer, }, }; - use pse_maingate::{MainGate, MainGateConfig, RangeChip, RangeConfig}; - use rand::rngs::OsRng; use serde::{Deserialize, Serialize}; -use crate::circuit_translator::NoirHalo2Translator; - /// Generate Halo2 Proving and Verifying Keys pub fn halo2_keygen( circuit: &NoirHalo2Translator, params: &ParamsKZG, -) -> ( - ProvingKey<::Affine>, - VerifyingKey<::Affine>, -) { +) -> (ProvingKey<::Affine>, VerifyingKey<::Affine>) { let vk = keygen_vk(params, circuit).expect("keygen_vk should not fail"); let vk_return = vk.clone(); let pk = keygen_pk(params, vk, circuit).expect("keygen_pk should not fail"); @@ -62,14 +54,7 @@ pub fn halo2_prove( _, Blake2bWrite, G1Affine, Challenge255<_>>, _, - >( - params, - pk, - &[circuit], - &[&[public_inputs]], - rng, - &mut transcript, - ) + >(params, pk, &[circuit], &[&[public_inputs]], rng, &mut transcript) .expect("proof generation should not fail"); transcript.finalize() } @@ -114,10 +99,7 @@ impl PlonkConfig { overflow_bit_lens, ); - PlonkConfig { - main_gate_config, - range_config, - } + PlonkConfig { main_gate_config, range_config } } pub(crate) fn configure_with_params( @@ -136,10 +118,7 @@ impl PlonkConfig { overflow_bit_lens, ); - PlonkConfig { - main_gate_config, - range_config, - } + PlonkConfig { main_gate_config, range_config } } } diff --git a/crates/noir_halo2_backend_pse/src/tests.rs b/crates/noir_halo2_backend_pse/src/tests.rs index 33a2d2e..912f545 100644 --- a/crates/noir_halo2_backend_pse/src/tests.rs +++ b/crates/noir_halo2_backend_pse/src/tests.rs @@ -7,8 +7,10 @@ mod test { use noir_halo2_backend_common::test_helpers::build_artifacts; use pse_halo2wrong::{ curves::bn256::Fr, - halo2::dev::{FailureLocation, MockProver, VerifyFailure}, - halo2::plonk::Any, + halo2::{ + dev::{FailureLocation, MockProver, VerifyFailure}, + plonk::Any, + }, }; use std::marker::PhantomData; @@ -18,11 +20,8 @@ mod test { let (circuit, witness_values) = build_artifacts("9_public_io", "pse_halo2_backend"); // instantiate halo2 circuit - let translator = NoirHalo2Translator:: { - circuit, - witness_values, - _marker: PhantomData::, - }; + let translator = + NoirHalo2Translator:: { circuit, witness_values, _marker: PhantomData:: }; let dimension = DimensionMeasurement::measure(&translator).unwrap(); // instance value (known to be 7) @@ -39,11 +38,8 @@ mod test { let (circuit, witness_values) = build_artifacts("9_public_io", "pse_halo2_backend"); // instantiate halo2 circuit - let translator = NoirHalo2Translator:: { - circuit, - witness_values, - _marker: PhantomData::, - }; + let translator = + NoirHalo2Translator:: { circuit, witness_values, _marker: PhantomData:: }; let dimension = DimensionMeasurement::measure(&translator).unwrap(); // instance value (known to be 7, incorrectly set to 8) @@ -53,10 +49,7 @@ mod test { let permutation_error = Err(vec![ VerifyFailure::Permutation { column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (7, "region 0").into(), - offset: 0, - }, + location: FailureLocation::InRegion { region: (7, "region 0").into(), offset: 0 }, }, VerifyFailure::Permutation { column: (Any::Instance, 0usize).into(), @@ -82,11 +75,8 @@ mod test { witness_values.insert(Witness(1), FieldElement::from(4u128)); // instantiate halo2 circuit - let translator = NoirHalo2Translator:: { - circuit, - witness_values, - _marker: PhantomData::, - }; + let translator = + NoirHalo2Translator:: { circuit, witness_values, _marker: PhantomData:: }; let dimension = DimensionMeasurement::measure(&translator).unwrap(); // instance value (known to be 7) @@ -98,10 +88,7 @@ mod test { prover.verify(), Err(vec![VerifyFailure::ConstraintNotSatisfied { constraint: ((0, "main_gate").into(), 0, "").into(), - location: FailureLocation::InRegion { - region: (5, "region 0").into(), - offset: 5, - }, + location: FailureLocation::InRegion { region: (5, "region 0").into(), offset: 5 }, cell_values: vec![ (((Any::advice(), 0).into(), 0).into(), String::from("0x4")), (((Any::advice(), 1).into(), 0).into(), String::from("0x4")), @@ -140,11 +127,8 @@ mod test { let (circuit, witness_values) = build_artifacts(program, "pse_halo2_backend"); // instantiate halo2 circuit - let translator = NoirHalo2Translator:: { - circuit, - witness_values, - _marker: PhantomData::, - }; + let translator = + NoirHalo2Translator:: { circuit, witness_values, _marker: PhantomData:: }; let dimension = DimensionMeasurement::measure(&translator).unwrap(); // run mock prover expecting success diff --git a/crates/noir_halo2_backend_zcash/src/acvm_interop/common_reference_string.rs b/crates/noir_halo2_backend_zcash/src/acvm_interop/common_reference_string.rs index 24e77b7..56624b2 100644 --- a/crates/noir_halo2_backend_zcash/src/acvm_interop/common_reference_string.rs +++ b/crates/noir_halo2_backend_zcash/src/acvm_interop/common_reference_string.rs @@ -1,10 +1,7 @@ +use crate::{halo2_params::constuct_halo2_ipa_params, ZcashHalo2}; use acvm::{acir::circuit::Circuit, async_trait, CommonReferenceString, ProofSystemCompiler}; use noir_halo2_backend_common::errors::BackendError; -use zcash_halo2_proofs::pasta::EqAffine; -use zcash_halo2_proofs::poly::commitment::Params; - -use crate::halo2_params::constuct_halo2_ipa_params; -use crate::ZcashHalo2; +use zcash_halo2_proofs::{pasta::EqAffine, poly::commitment::Params}; // TODO(#185): Ensure CRS download works in JS #[async_trait(?Send)] diff --git a/crates/noir_halo2_backend_zcash/src/acvm_interop/mod.rs b/crates/noir_halo2_backend_zcash/src/acvm_interop/mod.rs index ad92907..4228aac 100644 --- a/crates/noir_halo2_backend_zcash/src/acvm_interop/mod.rs +++ b/crates/noir_halo2_backend_zcash/src/acvm_interop/mod.rs @@ -1,9 +1,9 @@ -use crate::ZcashHalo2; -use acvm::Backend; - mod common_reference_string; mod proof_system; mod pwg; mod smart_contract; +use crate::ZcashHalo2; +use acvm::Backend; + impl Backend for ZcashHalo2 {} diff --git a/crates/noir_halo2_backend_zcash/src/acvm_interop/proof_system.rs b/crates/noir_halo2_backend_zcash/src/acvm_interop/proof_system.rs index 44a5f3e..8f98e55 100644 --- a/crates/noir_halo2_backend_zcash/src/acvm_interop/proof_system.rs +++ b/crates/noir_halo2_backend_zcash/src/acvm_interop/proof_system.rs @@ -1,19 +1,21 @@ -use std::marker::PhantomData; - -use acvm::acir::circuit::Circuit as NoirCircuit; -use acvm::acir::circuit::Opcode; -use acvm::acir::native_types::WitnessMap; -use acvm::acir::BlackBoxFunc; -use acvm::FieldElement; -use acvm::{Language, ProofSystemCompiler}; +use crate::{ + circuit_translator::NoirHalo2Translator, + halo2_plonk_api::{halo2_keygen, halo2_prove, halo2_verify}, +}; +use acvm::{ + acir::{ + circuit::{Circuit as NoirCircuit, Opcode}, + native_types::WitnessMap, + BlackBoxFunc, + }, + FieldElement, Language, ProofSystemCompiler, +}; use noir_halo2_backend_common::errors::BackendError; -use zcash_halo2_proofs::pasta::EqAffine; -use zcash_halo2_proofs::pasta::Fp; - -use zcash_halo2_proofs::poly::commitment::Params; - -use crate::circuit_translator::NoirHalo2Translator; -use crate::halo2_plonk_api::{halo2_keygen, halo2_prove, halo2_verify}; +use std::marker::PhantomData; +use zcash_halo2_proofs::{ + pasta::{EqAffine, Fp}, + poly::commitment::Params, +}; use crate::ZcashHalo2; diff --git a/crates/noir_halo2_backend_zcash/src/acvm_interop/pwg.rs b/crates/noir_halo2_backend_zcash/src/acvm_interop/pwg.rs index 35bf9fb..4a04cb1 100644 --- a/crates/noir_halo2_backend_zcash/src/acvm_interop/pwg.rs +++ b/crates/noir_halo2_backend_zcash/src/acvm_interop/pwg.rs @@ -1,9 +1,5 @@ -use acvm::acir::native_types::Witness; - -use acvm::pwg::OpcodeResolutionError; -use acvm::PartialWitnessGenerator; - use crate::ZcashHalo2; +use acvm::{acir::native_types::Witness, pwg::OpcodeResolutionError, PartialWitnessGenerator}; impl PartialWitnessGenerator for ZcashHalo2 { fn schnorr_verify( diff --git a/crates/noir_halo2_backend_zcash/src/acvm_interop/smart_contract.rs b/crates/noir_halo2_backend_zcash/src/acvm_interop/smart_contract.rs index ef4777a..53c85cd 100644 --- a/crates/noir_halo2_backend_zcash/src/acvm_interop/smart_contract.rs +++ b/crates/noir_halo2_backend_zcash/src/acvm_interop/smart_contract.rs @@ -1,8 +1,7 @@ +use crate::ZcashHalo2; use acvm::SmartContract; use noir_halo2_backend_common::errors::BackendError; -use crate::ZcashHalo2; - impl SmartContract for ZcashHalo2 { type Error = BackendError; fn eth_contract_from_vk( diff --git a/crates/noir_halo2_backend_zcash/src/circuit_translator.rs b/crates/noir_halo2_backend_zcash/src/circuit_translator.rs index 2865270..d75db58 100644 --- a/crates/noir_halo2_backend_zcash/src/circuit_translator.rs +++ b/crates/noir_halo2_backend_zcash/src/circuit_translator.rs @@ -1,16 +1,14 @@ -use core::panic; -use std::marker::PhantomData; - use crate::halo2_plonk_api::{PlonkConfig, StandardPlonk}; use acvm::acir::{ circuit::{opcodes::BlackBoxFuncCall, Circuit as NoirCircuit, Opcode}, native_types::WitnessMap, }; +use core::panic; +use std::marker::PhantomData; use zcash_halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner}, pasta::Fp, - plonk::Circuit as Halo2PlonkCircuit, - plonk::ConstraintSystem, + plonk::{Circuit as Halo2PlonkCircuit, ConstraintSystem}, }; #[derive(Clone, Default)] @@ -50,16 +48,8 @@ impl Halo2PlonkCircuit for NoirHalo2Translator { BlackBoxFuncCall::RANGE { input: _ } => { panic!("range constraint has not yet been implemented") } - BlackBoxFuncCall::AND { - lhs, - rhs, - output: _, - } - | BlackBoxFuncCall::XOR { - lhs, - rhs, - output: _, - } => { + BlackBoxFuncCall::AND { lhs, rhs, output: _ } + | BlackBoxFuncCall::XOR { lhs, rhs, output: _ } => { assert_eq!(lhs.num_bits, rhs.num_bits); match gadget_call { @@ -99,10 +89,7 @@ impl Halo2PlonkCircuit for NoirHalo2Translator { BlackBoxFuncCall::FixedBaseScalarMul { .. } => { todo!() } - BlackBoxFuncCall::Keccak256 { - inputs: _, - outputs: _, - } => { + BlackBoxFuncCall::Keccak256 { inputs: _, outputs: _ } => { panic!("keccak256 has not yet been implemented") } BlackBoxFuncCall::Keccak256VariableLength { diff --git a/crates/noir_halo2_backend_zcash/src/constrains.rs b/crates/noir_halo2_backend_zcash/src/constrains.rs index 85e272f..a9decfc 100644 --- a/crates/noir_halo2_backend_zcash/src/constrains.rs +++ b/crates/noir_halo2_backend_zcash/src/constrains.rs @@ -1,4 +1,8 @@ -use crate::halo2_plonk_api::{PolyTriple, StandardCs}; +use super::halo2_plonk_api::NoirConstraint; +use crate::{ + circuit_translator::NoirHalo2Translator, + halo2_plonk_api::{PolyTriple, StandardCs}, +}; use acvm::{acir::native_types::Expression, FieldElement}; use zcash_halo2_proofs::{ circuit::{Layouter, Value}, @@ -6,10 +10,6 @@ use zcash_halo2_proofs::{ plonk::Assigned, }; -use crate::circuit_translator::NoirHalo2Translator; - -use super::halo2_plonk_api::NoirConstraint; - impl NoirHalo2Translator { #[allow(non_snake_case)] pub(crate) fn add_arithmetic_constrains( @@ -41,26 +41,17 @@ impl NoirHalo2Translator { noir_cs.qc = gate.q_c; let a: Value> = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get_index(noir_cs.a as u32) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get_index(noir_cs.a as u32).unwrap_or(&FieldElement::zero()), )) .into(); let b: Value> = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get_index(noir_cs.b as u32) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get_index(noir_cs.b as u32).unwrap_or(&FieldElement::zero()), )) .into(); let c: Value> = Value::known(noir_field_to_halo2_field( - *self - .witness_values - .get_index(noir_cs.c as u32) - .unwrap_or(&FieldElement::zero()), + *self.witness_values.get_index(noir_cs.c as u32).unwrap_or(&FieldElement::zero()), )) .into(); @@ -74,16 +65,8 @@ impl NoirHalo2Translator { let qc = noir_field_to_halo2_field(noir_cs.qc); - let poly_gate = PolyTriple::new( - a, - b, - c, - qm.into(), - ql.into(), - qr.into(), - qo.into(), - qc.into(), - ); + let poly_gate = + PolyTriple::new(a, b, c, qm.into(), ql.into(), qr.into(), qo.into(), qc.into()); cs.raw_poly(layouter, || poly_gate).unwrap(); } diff --git a/crates/noir_halo2_backend_zcash/src/halo2_plonk_api.rs b/crates/noir_halo2_backend_zcash/src/halo2_plonk_api.rs index 30caa66..3f77813 100644 --- a/crates/noir_halo2_backend_zcash/src/halo2_plonk_api.rs +++ b/crates/noir_halo2_backend_zcash/src/halo2_plonk_api.rs @@ -1,7 +1,8 @@ -use std::marker::PhantomData; - +use crate::circuit_translator::NoirHalo2Translator; use acvm::FieldElement; +use rand::rngs::OsRng; use serde::{Deserialize, Serialize}; +use std::marker::PhantomData; use zcash_halo2_proofs::{ arithmetic::Field, circuit::{Cell, Layouter, Value}, @@ -14,10 +15,6 @@ use zcash_halo2_proofs::{ transcript::{Blake2bRead, Blake2bWrite, Challenge255}, }; -use rand::rngs::OsRng; - -use crate::circuit_translator::NoirHalo2Translator; - pub fn halo2_keygen( circuit: &NoirHalo2Translator, params: &Params, @@ -94,16 +91,7 @@ impl PlonkConfig { vec![a.clone() * sl + b.clone() * sr + a * b * sm + (c * so) + sc] }); - PlonkConfig { - a, - b, - c, - sl, - sr, - so, - sm, - sc, - } + PlonkConfig { a, b, c, sl, sr, so, sm, sc } } } #[allow(clippy::type_complexity)] @@ -161,16 +149,7 @@ impl PolyTriple { qo: F, qc: F, ) -> PolyTriple { - PolyTriple { - a, - b, - c, - qm, - ql, - qr, - qo, - qc, - } + PolyTriple { a, b, c, qm, ql, qr, qo, qc } } } @@ -225,10 +204,7 @@ pub struct StandardPlonk { impl StandardPlonk { pub fn new(config: PlonkConfig) -> Self { - StandardPlonk { - config, - _marker: PhantomData, - } + StandardPlonk { config, _marker: PhantomData } } } diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..2cccff2 --- /dev/null +++ b/default.nix @@ -0,0 +1,10 @@ +(import + ( + let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in + fetchTarball { + url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; + sha256 = lock.nodes.flake-compat.locked.narHash; + } + ) + { src = ./.; } +).defaultNix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..68b6f0a --- /dev/null +++ b/flake.lock @@ -0,0 +1,132 @@ +{ + "nodes": { + "crane": { + "inputs": { + "flake-compat": [ + "flake-compat" + ], + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ], + "rust-overlay": [ + "rust-overlay" + ] + }, + "locked": { + "lastModified": 1688690832, + "narHash": "sha256-RJIYuOn9FaQWVzj6ytaKsHyur0KsYO9tOgaMz1XHtpQ=", + "owner": "ipetkov", + "repo": "crane", + "rev": "bfc1c3dca576e2f9e02eb0176e4058305192afe3", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1687709756, + "narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1688646010, + "narHash": "sha256-kCeza5eKI2NEi8k0EoeZfv3lN1r1Vwx+L/VA6I8tmG4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5daaa32204e9c46b05cd709218b7ba733d07e80c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "crane": "crane", + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688697203, + "narHash": "sha256-0dMSJzu2bFMr9mfkXGRqMr3aPviny4zD4h7yUPk1B0U=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "f95db88269e9a46c67cd442fb667c5ad05a6d962", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100755 index 0000000..fa95ceb --- /dev/null +++ b/flake.nix @@ -0,0 +1,123 @@ +{ + description = "build halo2 backend"; + + inputs = { + nixpkgs = { + url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + }; + + flake-utils = { + url = "github:numtide/flake-utils"; + }; + + flake-compat = { + url = "github:edolstra/flake-compat"; + flake = false; + }; + + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs = { + nixpkgs.follows = "nixpkgs"; + flake-utils.follows = "flake-utils"; + }; + }; + + crane = { + url = "github:ipetkov/crane"; + inputs = { + nixpkgs.follows = "nixpkgs"; + flake-utils.follows = "flake-utils"; + flake-compat.follows = "flake-compat"; + rust-overlay.follows = "rust-overlay"; + }; + }; + }; + + outputs = { self, nixpkgs, flake-utils, rust-overlay, crane, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + overlays = [ (import rust-overlay) ]; + pkgs = import nixpkgs { + inherit system overlays; + }; + + rust_toolchain = pkgs.rust-bin.nightly."2022-10-28".default.override { + extensions = [ "rust-src" ]; + targets = [ "wasm32-unknown-unknown" ] + ++ pkgs.lib.optional (pkgs.hostPlatform.isx86_64 && pkgs.hostPlatform.isLinux) "x86_64-unknown-linux-gnu" + ++ pkgs.lib.optional (pkgs.hostPlatform.isAarch64 && pkgs.hostPlatform.isLinux) "aarch64-unknown-linux-gnu" + ++ pkgs.lib.optional (pkgs.hostPlatform.isx86_64 && pkgs.hostPlatform.isDarwin) "x86_64-apple-darwin" + ++ pkgs.lib.optional (pkgs.hostPlatform.isAarch64 && pkgs.hostPlatform.isDarwin) "aarch64-apple-darwin"; + }; + + crane_lib = (crane.mkLib pkgs).overrideToolchain rust_toolchain; + + common_args = { + src = crane_lib.cleanCargoSource (crane_lib.path ./.); + }; + + extraBuildInputs = pkgs.lib.optionals pkgs.stdenv.isDarwin [ + pkgs.libiconv + pkgs.darwin.apple_sdk.frameworks.Security + ]; + + noir_halo2_pse_naitive_args = common_args // { + pname = "noir_halo2_backend_pse_naitive"; + + buildInputs = [] ++ extraBuildInputs; + }; + + noir_halo2_pse_wasm_args = common_args // { + pname = "noir_halo2_backend_pse_wasm"; + + cargoExtraArgs = "--target wasm32-unknown-unknown"; + + buildInputs = [] ++ extraBuildInputs; + }; + + noir_halo2_pse_naitive_cargo_artifacts = crane_lib.buildDepsOnly noir_halo2_pse_naitive_args; + noir_halo2_pse_wasm_cargo_artifacts = crane_lib.buildDepsOnly noir_halo2_pse_wasm_args; + + noir_halo2_pse_naitive = crane_lib.buildPackage (noir_halo2_pse_naitive_args // { + + cargoArtifacts = noir_halo2_pse_naitive_cargo_artifacts; + + doCheck = false; + }); + + noir_halo2_pse_wasm = crane_lib.buildPackage (noir_halo2_pse_wasm_args // { + + cargoArtifacts = noir_halo2_pse_wasm_cargo_artifacts; + + doCheck = false; + }); + in + { + checks = { + cargo-fmt = crane_lib.cargoFmt (noir_halo2_pse_naitive_args // { + cargoArtifacts = noir_halo2_pse_naitive_cargo_artifacts; + }); + cargo-clippy = crane_lib.cargoClippy (noir_halo2_pse_naitive_args // { + cargoArtifacts = noir_halo2_pse_naitive_cargo_artifacts; + cargoClippyExtraArgs = "--all-targets -- --deny warnings"; + }); + }; + + packages = { + default = noir_halo2_pse_naitive; + + # wasm not working with nix at the moment + wasm = noir_halo2_pse_wasm; + }; + + devShells.default = pkgs.mkShell ( { + inputsFrom = builtins.attrValues self.checks.${system}; + + nativeBuildInputs = with pkgs; [ + git + rust_toolchain + ]; + }); + }); +} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..6234bb4 --- /dev/null +++ b/shell.nix @@ -0,0 +1,10 @@ +(import + ( + let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in + fetchTarball { + url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; + sha256 = lock.nodes.flake-compat.locked.narHash; + } + ) + { src = ./.; } +).shellNix