From be16e462d6f6ec7bb5d0ef86bf93f5683d778ea2 Mon Sep 17 00:00:00 2001 From: Tom French Date: Thu, 27 Apr 2023 16:50:36 +0100 Subject: [PATCH] feat: update to ACVM 0.10.0 --- Cargo.lock | 108 ++---------------- Cargo.toml | 3 +- crates/nargo/src/ops/execute.rs | 7 +- crates/nargo_cli/Cargo.toml | 2 +- crates/noirc_evaluator/src/lib.rs | 2 +- .../src/ssa/acir_gen/constraints.rs | 20 ++-- .../src/ssa/acir_gen/internal_var.rs | 2 +- .../src/ssa/acir_gen/operations/binary.rs | 4 +- .../src/ssa/acir_gen/operations/bitwise.rs | 4 +- .../src/ssa/acir_gen/operations/cmp.rs | 4 +- .../src/ssa/acir_gen/operations/intrinsics.rs | 2 +- .../src/ssa/acir_gen/operations/not.rs | 2 +- .../src/ssa/acir_gen/operations/sort.rs | 5 +- crates/noirc_evaluator/src/ssa/builtin.rs | 10 +- 14 files changed, 46 insertions(+), 129 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 506f9296028..b96fc7e0e80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,8 +5,7 @@ version = 3 [[package]] name = "acir" version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "018148d69bf14422b1c1d62909a241af2a7f51fec064feb2b01de88fb02b11b8" +source = "git+https://github.com/noir-lang/acvm?rev=15d3c5a9be2dd92f266fcb7e672da17cada9fec5#15d3c5a9be2dd92f266fcb7e672da17cada9fec5" dependencies = [ "acir_field", "flate2", @@ -17,8 +16,7 @@ dependencies = [ [[package]] name = "acir_field" version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d40dac25cf6be6335dd86286caeac859afd0dc74a4a75c64eed041b0f00a278" +source = "git+https://github.com/noir-lang/acvm?rev=15d3c5a9be2dd92f266fcb7e672da17cada9fec5#15d3c5a9be2dd92f266fcb7e672da17cada9fec5" dependencies = [ "ark-bn254", "ark-ff", @@ -31,8 +29,7 @@ dependencies = [ [[package]] name = "acvm" version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17b7bc8f2b2215075b8e080ba3a0b8b7d759f04bc44b27e5bb8d845f4c77f20" +source = "git+https://github.com/noir-lang/acvm?rev=15d3c5a9be2dd92f266fcb7e672da17cada9fec5#15d3c5a9be2dd92f266fcb7e672da17cada9fec5" dependencies = [ "acir", "acvm_stdlib", @@ -48,23 +45,27 @@ dependencies = [ [[package]] name = "acvm-backend-barretenberg" -version = "0.1.0" -source = "git+https://github.com/noir-lang/aztec_backend?rev=ba1d0d61b94de91b15044d97608907c21bfb5299#ba1d0d61b94de91b15044d97608907c21bfb5299" +version = "0.0.0" +source = "git+https://github.com/noir-lang/aztec_backend?rev=880210c5dcb55d29437a68c11913406704a0eb71#880210c5dcb55d29437a68c11913406704a0eb71" dependencies = [ + "acvm", "barretenberg-sys", "blake2", - "common", + "dirs 3.0.2", + "futures-util", "getrandom", + "indicatif", "pkg-config", + "reqwest", "rust-embed", + "tokio", "wasmer", ] [[package]] name = "acvm_stdlib" version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ce2d19a9d1e7ff1bf415ed909b43031e33ef6df21be70e470bb1817b3e6989" +source = "git+https://github.com/noir-lang/acvm?rev=15d3c5a9be2dd92f266fcb7e672da17cada9fec5#15d3c5a9be2dd92f266fcb7e672da17cada9fec5" dependencies = [ "acir", ] @@ -611,21 +612,6 @@ dependencies = [ "tracing-error", ] -[[package]] -name = "common" -version = "0.1.0" -source = "git+https://github.com/noir-lang/aztec_backend?rev=ba1d0d61b94de91b15044d97608907c21bfb5299#ba1d0d61b94de91b15044d97608907c21bfb5299" -dependencies = [ - "acvm", - "blake2", - "dirs 3.0.2", - "futures-util", - "indicatif", - "reqwest", - "sled", - "tokio", -] - [[package]] name = "console" version = "0.15.5" @@ -1195,16 +1181,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -1278,15 +1254,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generational-arena" version = "0.2.8" @@ -1754,16 +1721,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" -[[package]] -name = "lock_api" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" version = "0.4.17" @@ -2116,31 +2073,6 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi", -] - [[package]] name = "paste" version = "1.0.12" @@ -2933,22 +2865,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "sled" -version = "0.34.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" -dependencies = [ - "crc32fast", - "crossbeam-epoch", - "crossbeam-utils", - "fs2", - "fxhash", - "libc", - "log", - "parking_lot", -] - [[package]] name = "smallvec" version = "1.10.0" diff --git a/Cargo.toml b/Cargo.toml index 26eec846ef9..d74e2b2475c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,8 @@ edition = "2021" rust-version = "1.66" [workspace.dependencies] -acvm = "0.9.0" +#acvm = "0.9.0" +acvm = { git = "https://github.com/noir-lang/acvm", rev = "15d3c5a9be2dd92f266fcb7e672da17cada9fec5", features = ["bn254"] } arena = { path = "crates/arena" } fm = { path = "crates/fm" } iter-extended = { path = "crates/iter-extended" } diff --git a/crates/nargo/src/ops/execute.rs b/crates/nargo/src/ops/execute.rs index eb82df60d41..e4c8a5afbb5 100644 --- a/crates/nargo/src/ops/execute.rs +++ b/crates/nargo/src/ops/execute.rs @@ -1,5 +1,5 @@ -use acvm::PartialWitnessGenerator; use acvm::{acir::circuit::Circuit, pwg::block::Blocks}; +use acvm::{PartialWitnessGenerator, PartialWitnessGeneratorStatus}; use noirc_abi::WitnessMap; use crate::NargoError; @@ -10,9 +10,8 @@ pub fn execute_circuit( mut initial_witness: WitnessMap, ) -> Result { let mut blocks = Blocks::default(); - let (unresolved_opcodes, oracles) = - backend.solve(&mut initial_witness, &mut blocks, circuit.opcodes)?; - if !unresolved_opcodes.is_empty() || !oracles.is_empty() { + let solver_status = backend.solve(&mut initial_witness, &mut blocks, circuit.opcodes)?; + if matches!(solver_status, PartialWitnessGeneratorStatus::RequiresOracleData { .. }) { todo!("Add oracle support to nargo execute") } diff --git a/crates/nargo_cli/Cargo.toml b/crates/nargo_cli/Cargo.toml index cd423acaa31..c4691c4ab21 100644 --- a/crates/nargo_cli/Cargo.toml +++ b/crates/nargo_cli/Cargo.toml @@ -37,7 +37,7 @@ termcolor = "1.1.2" color-eyre = "0.6.2" # Backends -acvm-backend-barretenberg = { git = "https://github.com/noir-lang/aztec_backend", rev = "ba1d0d61b94de91b15044d97608907c21bfb5299", default-features=false } +acvm-backend-barretenberg = { git = "https://github.com/noir-lang/aztec_backend", rev = "880210c5dcb55d29437a68c11913406704a0eb71", default-features=false } [dev-dependencies] tempdir = "0.3.7" diff --git a/crates/noirc_evaluator/src/lib.rs b/crates/noirc_evaluator/src/lib.rs index 8b3cbb009a9..a94bc45dbf6 100644 --- a/crates/noirc_evaluator/src/lib.rs +++ b/crates/noirc_evaluator/src/lib.rs @@ -158,7 +158,7 @@ impl Evaluator { let inter_var_witness = self.add_witness_to_cs(); // Link that witness to the arithmetic gate - let constraint = &arithmetic_gate - &inter_var_witness; + let constraint = &arithmetic_gate - inter_var_witness; self.opcodes.push(AcirOpcode::Arithmetic(constraint)); inter_var_witness } diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/constraints.rs b/crates/noirc_evaluator/src/ssa/acir_gen/constraints.rs index 8257e0c9f9a..11371dc54a6 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/constraints.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/constraints.rs @@ -31,7 +31,7 @@ pub(crate) fn mul_with_witness( let a_arith; let a_arith = if !a.mul_terms.is_empty() && !b.is_const() { let a_witness = evaluator.create_intermediate_variable(a.clone()); - a_arith = Expression::from(&a_witness); + a_arith = Expression::from(a_witness); &a_arith } else { a @@ -42,7 +42,7 @@ pub(crate) fn mul_with_witness( a_arith } else { let b_witness = evaluator.create_intermediate_variable(b.clone()); - b_arith = Expression::from(&b_witness); + b_arith = Expression::from(b_witness); &b_arith } } else { @@ -54,9 +54,9 @@ pub(crate) fn mul_with_witness( //a*b pub(crate) fn mul(a: &Expression, b: &Expression) -> Expression { if a.is_const() { - return b * &a.q_c; + return b * a.q_c; } else if b.is_const() { - return a * &b.q_c; + return a * b.q_c; } else if !(a.is_linear() && b.is_linear()) { unreachable!("Can only multiply linear terms"); } @@ -125,9 +125,9 @@ pub(crate) fn subtract(a: &Expression, k: FieldElement, b: &Expression) -> Expre // TODO in either case, we can put this in ACIR, if its useful pub(crate) fn add(a: &Expression, k: FieldElement, b: &Expression) -> Expression { if a.is_const() { - return (b * &k) + &a.q_c; + return (b * k) + a.q_c; } else if b.is_const() { - return a.clone() + &(k * b.q_c); + return a.clone() + (k * b.q_c); } let mut output = Expression::from_field(a.q_c + k * b.q_c); @@ -497,7 +497,7 @@ pub(crate) fn evaluate_truncate( if let Some(a_c) = lhs.to_const() { let mut a_big = BigUint::from_bytes_be(&a_c.to_be_bytes()); a_big %= exp_big; - return Expression::from(&FieldElement::from_be_bytes_reduce(&a_big.to_bytes_be())); + return Expression::from(FieldElement::from_be_bytes_reduce(&a_big.to_bytes_be())); } let exp = FieldElement::from_be_bytes_reduce(&exp_big.to_bytes_be()); @@ -524,7 +524,7 @@ pub(crate) fn evaluate_truncate( let my_constraint = add(&res, -FieldElement::one(), lhs); evaluator.push_opcode(AcirOpcode::Arithmetic(my_constraint)); - Expression::from(&b_witness) + Expression::from(b_witness) } pub(crate) fn evaluate_udiv( @@ -552,8 +552,8 @@ pub(crate) fn evaluate_udiv( //range check q<=a try_range_constraint(q_witness, bit_size, evaluator); // a-b*q-r = 0 - let mut d = mul_with_witness(evaluator, rhs, &Expression::from(&q_witness)); - d = add(&d, FieldElement::one(), &Expression::from(&r_witness)); + let mut d = mul_with_witness(evaluator, rhs, &Expression::from(q_witness)); + d = add(&d, FieldElement::one(), &Expression::from(r_witness)); d = mul_with_witness(evaluator, &d, predicate); let div_euclidean = subtract(&pa, FieldElement::one(), &d); diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/internal_var.rs b/crates/noirc_evaluator/src/ssa/acir_gen/internal_var.rs index 8e6e16776a9..27d6b0ec25b 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/internal_var.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/internal_var.rs @@ -98,7 +98,7 @@ impl InternalVar { /// Expression, this method is infallible. pub(crate) fn from_witness(witness: Witness) -> InternalVar { InternalVar { - expression: Expression::from(&witness), + expression: Expression::from(witness), cached_witness: Some(witness), id: None, } diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/binary.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/binary.rs index bf1f59391f9..87280eb1fde 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/binary.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/binary.rs @@ -146,12 +146,12 @@ pub(crate) fn evaluate( if r_value.is_zero() { panic!("Panic - division by zero"); } else { - (l_c.expression() * &r_value.inverse()).into() + (l_c.expression() * r_value.inverse()).into() } } else { //TODO avoid creating witnesses here. let x_witness = acir_gen.var_cache.get_or_compute_witness(r_c, evaluator).expect("unexpected constant expression"); - let inverse = Expression::from(&constraints::evaluate_inverse( + let inverse = Expression::from(constraints::evaluate_inverse( x_witness, &predicate, evaluator, )); InternalVar::from(constraints::mul_with_witness( diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/bitwise.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/bitwise.rs index 947cf93edd9..f8ca271835e 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/bitwise.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/bitwise.rs @@ -155,9 +155,9 @@ pub(super) fn evaluate_bitwise( constraints::subtract( &Expression::from_field(max), FieldElement::one(), - &Expression::from(&result), + &Expression::from(result), ) } else { - Expression::from(&result) + Expression::from(result) } } diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/cmp.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/cmp.rs index 4abd34f6e01..0f8091e2f6f 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/cmp.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/cmp.rs @@ -69,7 +69,7 @@ pub(super) fn evaluate_neq( .get_or_compute_witness(x, evaluator) .expect("unexpected constant expression"); - return Expression::from(&constraints::evaluate_zero_equality(x_witness, evaluator)); + return Expression::from(constraints::evaluate_zero_equality(x_witness, evaluator)); } // Arriving here means that `lhs` and `rhs` are not Arrays @@ -95,7 +95,7 @@ pub(super) fn evaluate_neq( .var_cache .get_or_compute_witness(x, evaluator) .expect("unexpected constant expression"); - Expression::from(&constraints::evaluate_zero_equality(x_witness, evaluator)) + Expression::from(constraints::evaluate_zero_equality(x_witness, evaluator)) } } diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs index 7d6f7e2c32c..ea7d3d9c6c0 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs @@ -107,7 +107,7 @@ pub(crate) fn evaluate( } outputs = prepare_outputs(&mut acir_gen.memory, instruction_id, array.len, ctx, evaluator); - let out_expr: Vec = outputs.iter().map(|w| w.into()).collect(); + let out_expr: Vec = outputs.iter().map(|w| (*w).into()).collect(); for i in 0..(out_expr.len() - 1) { bound_constraint_with_offset( &out_expr[i], diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/not.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/not.rs index ff8bb26f788..76ad7c93a88 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/not.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/not.rs @@ -19,7 +19,7 @@ pub(crate) fn evaluate( let l_c = var_cache.get_or_compute_internal_var_unwrap(*value, evaluator, ctx); Some( constraints::subtract( - &Expression::from(&FieldElement::from(a)), + &Expression::from(FieldElement::from(a)), FieldElement::one(), l_c.expression(), ) diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/sort.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/sort.rs index 04524959fbe..ffcbf1ea7c0 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/sort.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/sort.rs @@ -119,6 +119,7 @@ mod test { acir::{circuit::opcodes::BlackBoxFuncCall, native_types::Witness}, pwg::block::Blocks, FieldElement, OpcodeResolution, OpcodeResolutionError, PartialWitnessGenerator, + PartialWitnessGeneratorStatus, }; use crate::{ @@ -180,10 +181,10 @@ mod test { // compute the network output by solving the constraints let backend = MockBackend {}; let mut blocks = Blocks::default(); - let (unresolved_opcodes, oracles) = backend + let solver_status = backend .solve(&mut solved_witness, &mut blocks, eval.opcodes.clone()) .expect("Could not solve permutation constraints"); - assert!(unresolved_opcodes.is_empty() && oracles.is_empty(), "Incomplete solution"); + assert_eq!(solver_status, PartialWitnessGeneratorStatus::Solved, "Incomplete solution"); let mut b_val = Vec::new(); for i in 0..output.len() { b_val.push(solved_witness[&b_wit[i]]); diff --git a/crates/noirc_evaluator/src/ssa/builtin.rs b/crates/noirc_evaluator/src/ssa/builtin.rs index 8248322c488..81b4abe934e 100644 --- a/crates/noirc_evaluator/src/ssa/builtin.rs +++ b/crates/noirc_evaluator/src/ssa/builtin.rs @@ -77,10 +77,10 @@ impl Opcode { | BlackBoxFunc::Pedersen | BlackBoxFunc::FixedBaseScalarMul => BigUint::zero(), // Verify returns zero or one - BlackBoxFunc::SchnorrVerify - | BlackBoxFunc::EcdsaSecp256k1 - | BlackBoxFunc::MerkleMembership => BigUint::one(), - BlackBoxFunc::HashToField128Security => ObjectType::native_field().max_size(), + BlackBoxFunc::SchnorrVerify | BlackBoxFunc::EcdsaSecp256k1 => BigUint::one(), + BlackBoxFunc::ComputeMerkleRoot | BlackBoxFunc::HashToField128Security => { + ObjectType::native_field().max_size() + } BlackBoxFunc::AES => { todo!("ICE: AES is unimplemented") } @@ -113,7 +113,7 @@ impl Opcode { } BlackBoxFunc::HashToField128Security => (1, ObjectType::native_field()), // See issue #775 on changing this to return a boolean - BlackBoxFunc::MerkleMembership + BlackBoxFunc::ComputeMerkleRoot | BlackBoxFunc::SchnorrVerify | BlackBoxFunc::EcdsaSecp256k1 => (1, ObjectType::native_field()), BlackBoxFunc::Pedersen => (2, ObjectType::native_field()),