From 60138cfcc29d80acba1449eb12708b41a630a2a5 Mon Sep 17 00:00:00 2001 From: Tom French Date: Fri, 12 Jan 2024 14:34:34 +0000 Subject: [PATCH 1/3] chore: provide a canonical "failing" `BlackBoxSolver` --- acvm-repo/acvm/tests/solver.rs | 56 +++---------- .../src/curve_specific_solver.rs | 79 +++++++++++++++++++ acvm-repo/blackbox_solver/src/lib.rs | 35 ++------ .../src/ssa/acir_gen/acir_ir/acir_variable.rs | 52 +----------- tooling/debugger/src/context.rs | 50 +----------- tooling/lsp/src/requests/goto_definition.rs | 6 +- tooling/lsp/src/requests/mod.rs | 8 +- tooling/lsp/src/solver.rs | 42 ---------- 8 files changed, 105 insertions(+), 223 deletions(-) create mode 100644 acvm-repo/blackbox_solver/src/curve_specific_solver.rs diff --git a/acvm-repo/acvm/tests/solver.rs b/acvm-repo/acvm/tests/solver.rs index b4011a994a5..25c291a56cb 100644 --- a/acvm-repo/acvm/tests/solver.rs +++ b/acvm-repo/acvm/tests/solver.rs @@ -11,46 +11,8 @@ use acir::{ FieldElement, }; -use acvm::{ - pwg::{ACVMStatus, ErrorLocation, ForeignCallWaitInfo, OpcodeResolutionError, ACVM}, - BlackBoxFunctionSolver, -}; -use acvm_blackbox_solver::BlackBoxResolutionError; - -pub(crate) struct StubbedBackend; - -impl BlackBoxFunctionSolver for StubbedBackend { - fn schnorr_verify( - &self, - _public_key_x: &FieldElement, - _public_key_y: &FieldElement, - _signature: &[u8], - _message: &[u8], - ) -> Result { - panic!("Path not trodden by this test") - } - fn pedersen_commitment( - &self, - _inputs: &[FieldElement], - _domain_separator: u32, - ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError> { - panic!("Path not trodden by this test") - } - fn pedersen_hash( - &self, - _inputs: &[FieldElement], - _domain_separator: u32, - ) -> Result { - panic!("Path not trodden by this test") - } - fn fixed_base_scalar_mul( - &self, - _low: &FieldElement, - _high: &FieldElement, - ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError> { - panic!("Path not trodden by this test") - } -} +use acvm::pwg::{ACVMStatus, ErrorLocation, ForeignCallWaitInfo, OpcodeResolutionError, ACVM}; +use acvm_blackbox_solver::StubbedSolver; // Reenable these test cases once we move the brillig implementation of inversion down into the acvm stdlib. @@ -135,7 +97,7 @@ fn inversion_brillig_oracle_equivalence() { ]) .into(); - let mut acvm = ACVM::new(&StubbedBackend, &opcodes, witness_assignments); + let mut acvm = ACVM::new(&StubbedSolver, &opcodes, witness_assignments); // use the partial witness generation solver with our acir program let solver_status = acvm.solve(); @@ -264,7 +226,7 @@ fn double_inversion_brillig_oracle() { ]) .into(); - let mut acvm = ACVM::new(&StubbedBackend, &opcodes, witness_assignments); + let mut acvm = ACVM::new(&StubbedSolver, &opcodes, witness_assignments); // use the partial witness generation solver with our acir program let solver_status = acvm.solve(); @@ -385,7 +347,7 @@ fn oracle_dependent_execution() { let witness_assignments = BTreeMap::from([(w_x, FieldElement::from(2u128)), (w_y, FieldElement::from(2u128))]).into(); - let mut acvm = ACVM::new(&StubbedBackend, &opcodes, witness_assignments); + let mut acvm = ACVM::new(&StubbedSolver, &opcodes, witness_assignments); // use the partial witness generation solver with our acir program let solver_status = acvm.solve(); @@ -484,7 +446,7 @@ fn brillig_oracle_predicate() { ]) .into(); - let mut acvm = ACVM::new(&StubbedBackend, &opcodes, witness_assignments); + let mut acvm = ACVM::new(&StubbedSolver, &opcodes, witness_assignments); let solver_status = acvm.solve(); assert_eq!(solver_status, ACVMStatus::Solved, "should be fully solved"); @@ -517,7 +479,7 @@ fn unsatisfied_opcode_resolved() { values.insert(d, FieldElement::from(2_i128)); let opcodes = vec![Opcode::AssertZero(opcode_a)]; - let mut acvm = ACVM::new(&StubbedBackend, &opcodes, values); + let mut acvm = ACVM::new(&StubbedSolver, &opcodes, values); let solver_status = acvm.solve(); assert_eq!( solver_status, @@ -597,7 +559,7 @@ fn unsatisfied_opcode_resolved_brillig() { let opcodes = vec![brillig_opcode, Opcode::AssertZero(opcode_a)]; - let mut acvm = ACVM::new(&StubbedBackend, &opcodes, values); + let mut acvm = ACVM::new(&StubbedSolver, &opcodes, values); let solver_status = acvm.solve(); assert_eq!( solver_status, @@ -641,7 +603,7 @@ fn memory_operations() { let opcodes = vec![init, read_op, expression]; - let mut acvm = ACVM::new(&StubbedBackend, &opcodes, initial_witness); + let mut acvm = ACVM::new(&StubbedSolver, &opcodes, initial_witness); let solver_status = acvm.solve(); assert_eq!(solver_status, ACVMStatus::Solved); let witness_map = acvm.finalize(); diff --git a/acvm-repo/blackbox_solver/src/curve_specific_solver.rs b/acvm-repo/blackbox_solver/src/curve_specific_solver.rs new file mode 100644 index 00000000000..01b19a234d9 --- /dev/null +++ b/acvm-repo/blackbox_solver/src/curve_specific_solver.rs @@ -0,0 +1,79 @@ +use acir::{BlackBoxFunc, FieldElement}; + +use crate::BlackBoxResolutionError; + +/// This component will generate outputs for Blackbox function calls where the underlying [`acir::BlackBoxFunc`] +/// doesn't have a canonical Rust implementation. +/// +/// Returns an [`BlackBoxResolutionError`] if the backend does not support the given [`acir::BlackBoxFunc`]. +pub trait BlackBoxFunctionSolver { + fn schnorr_verify( + &self, + public_key_x: &FieldElement, + public_key_y: &FieldElement, + signature: &[u8], + message: &[u8], + ) -> Result; + fn pedersen_commitment( + &self, + inputs: &[FieldElement], + domain_separator: u32, + ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError>; + fn pedersen_hash( + &self, + inputs: &[FieldElement], + domain_separator: u32, + ) -> Result; + fn fixed_base_scalar_mul( + &self, + low: &FieldElement, + high: &FieldElement, + ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError>; +} + +pub struct StubbedSolver; + +impl BlackBoxFunctionSolver for StubbedSolver { + fn schnorr_verify( + &self, + _public_key_x: &FieldElement, + _public_key_y: &FieldElement, + _signature: &[u8], + _message: &[u8], + ) -> Result { + Err(BlackBoxResolutionError::Failed( + BlackBoxFunc::SchnorrVerify, + "SchnorrVerify is not supported".to_string(), + )) + } + fn pedersen_commitment( + &self, + _inputs: &[FieldElement], + _domain_separator: u32, + ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError> { + Err(BlackBoxResolutionError::Failed( + BlackBoxFunc::PedersenCommitment, + "PedersenCommitment is not supported".to_string(), + )) + } + fn pedersen_hash( + &self, + _inputs: &[FieldElement], + _domain_separator: u32, + ) -> Result { + Err(BlackBoxResolutionError::Failed( + BlackBoxFunc::PedersenHash, + "PedersenHash is not supported".to_string(), + )) + } + fn fixed_base_scalar_mul( + &self, + _low: &FieldElement, + _high: &FieldElement, + ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError> { + Err(BlackBoxResolutionError::Failed( + BlackBoxFunc::FixedBaseScalarMul, + "FixedBaseScalarMul is not supported".to_string(), + )) + } +} diff --git a/acvm-repo/blackbox_solver/src/lib.rs b/acvm-repo/blackbox_solver/src/lib.rs index 9518854de8e..05a2afe9e46 100644 --- a/acvm-repo/blackbox_solver/src/lib.rs +++ b/acvm-repo/blackbox_solver/src/lib.rs @@ -7,48 +7,23 @@ //! For functions that are backend-dependent, it provides a Trait [BlackBoxFunctionSolver] that must be implemented by the backend. //! For functions that have a reference implementation, such as [keccak256], this crate exports the reference implementation directly. -use acir::{BlackBoxFunc, FieldElement}; +use acir::BlackBoxFunc; use blake2::digest::generic_array::GenericArray; use blake2::{Blake2s256, Digest}; use sha2::Sha256; use sha3::Keccak256; use thiserror::Error; +mod curve_specific_solver; + +pub use curve_specific_solver::{BlackBoxFunctionSolver, StubbedSolver}; + #[derive(Clone, PartialEq, Eq, Debug, Error)] pub enum BlackBoxResolutionError { #[error("failed to solve blackbox function: {0}, reason: {1}")] Failed(BlackBoxFunc, String), } -/// This component will generate outputs for Blackbox function calls where the underlying [`acir::BlackBoxFunc`] -/// doesn't have a canonical Rust implementation. -/// -/// Returns an [`BlackBoxResolutionError`] if the backend does not support the given [`acir::BlackBoxFunc`]. -pub trait BlackBoxFunctionSolver { - fn schnorr_verify( - &self, - public_key_x: &FieldElement, - public_key_y: &FieldElement, - signature: &[u8], - message: &[u8], - ) -> Result; - fn pedersen_commitment( - &self, - inputs: &[FieldElement], - domain_separator: u32, - ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError>; - fn pedersen_hash( - &self, - inputs: &[FieldElement], - domain_separator: u32, - ) -> Result; - fn fixed_base_scalar_mul( - &self, - low: &FieldElement, - high: &FieldElement, - ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError>; -} - pub fn sha256(inputs: &[u8]) -> Result<[u8; 32], BlackBoxResolutionError> { generic_hash_256::(inputs) .map_err(|err| BlackBoxResolutionError::Failed(BlackBoxFunc::SHA256, err)) diff --git a/compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs b/compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs index e7c55237259..160fe71e0b4 100644 --- a/compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs +++ b/compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs @@ -9,6 +9,7 @@ use crate::ssa::ir::{instruction::Endian, types::NumericType}; use acvm::acir::circuit::brillig::{BrilligInputs, BrilligOutputs}; use acvm::acir::circuit::opcodes::{BlockId, MemOp}; use acvm::acir::circuit::Opcode; +use acvm::blackbox_solver; use acvm::brillig_vm::{brillig::Value, Registers, VMStatus, VM}; use acvm::{ acir::{ @@ -19,7 +20,6 @@ use acvm::{ }, FieldElement, }; -use acvm::{BlackBoxFunctionSolver, BlackBoxResolutionError}; use fxhash::FxHashMap as HashMap; use iter_extended::{try_vecmap, vecmap}; use num_bigint::BigUint; @@ -1711,53 +1711,6 @@ fn execute_brillig( code: &[BrilligOpcode], inputs: &[BrilligInputs], ) -> Option<(Registers, Vec)> { - struct NullBbSolver; - - impl BlackBoxFunctionSolver for NullBbSolver { - fn schnorr_verify( - &self, - _public_key_x: &FieldElement, - _public_key_y: &FieldElement, - _signature: &[u8], - _message: &[u8], - ) -> Result { - Err(BlackBoxResolutionError::Failed( - BlackBoxFunc::SchnorrVerify, - "SchnorrVerify is not supported".to_string(), - )) - } - fn pedersen_commitment( - &self, - _inputs: &[FieldElement], - _domain_separator: u32, - ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError> { - Err(BlackBoxResolutionError::Failed( - BlackBoxFunc::PedersenCommitment, - "PedersenCommitment is not supported".to_string(), - )) - } - fn pedersen_hash( - &self, - _inputs: &[FieldElement], - _domain_separator: u32, - ) -> Result { - Err(BlackBoxResolutionError::Failed( - BlackBoxFunc::PedersenHash, - "PedersenHash is not supported".to_string(), - )) - } - fn fixed_base_scalar_mul( - &self, - _low: &FieldElement, - _high: &FieldElement, - ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError> { - Err(BlackBoxResolutionError::Failed( - BlackBoxFunc::FixedBaseScalarMul, - "FixedBaseScalarMul is not supported".to_string(), - )) - } - } - // Set input values let mut input_register_values: Vec = Vec::with_capacity(inputs.len()); let mut input_memory: Vec = Vec::new(); @@ -1783,7 +1736,8 @@ fn execute_brillig( // Instantiate a Brillig VM given the solved input registers and memory, along with the Brillig bytecode. let input_registers = Registers::load(input_register_values); - let mut vm = VM::new(input_registers, input_memory, code, Vec::new(), &NullBbSolver); + let mut vm = + VM::new(input_registers, input_memory, code, Vec::new(), &blackbox_solver::StubbedSolver); // Run the Brillig VM on these inputs, bytecode, etc! let vm_status = vm.process_opcodes(); diff --git a/tooling/debugger/src/context.rs b/tooling/debugger/src/context.rs index 74224ce3795..1371541944d 100644 --- a/tooling/debugger/src/context.rs +++ b/tooling/debugger/src/context.rs @@ -440,6 +440,7 @@ mod tests { }, native_types::Expression, }, + blackbox_solver::StubbedSolver, brillig_vm::brillig::{ BinaryFieldOp, Opcode as BrilligOpcode, RegisterIndex, RegisterOrMemory, }, @@ -447,52 +448,12 @@ mod tests { use nargo::{artifacts::debug::DebugArtifact, ops::DefaultForeignCallExecutor}; use std::collections::BTreeMap; - struct StubbedSolver; - - impl BlackBoxFunctionSolver for StubbedSolver { - fn schnorr_verify( - &self, - _public_key_x: &FieldElement, - _public_key_y: &FieldElement, - _signature: &[u8], - _message: &[u8], - ) -> Result { - unimplemented!(); - } - - fn pedersen_commitment( - &self, - _inputs: &[FieldElement], - _domain_separator: u32, - ) -> Result<(FieldElement, FieldElement), acvm::BlackBoxResolutionError> { - unimplemented!(); - } - - fn pedersen_hash( - &self, - _inputs: &[FieldElement], - _domain_separator: u32, - ) -> Result { - unimplemented!(); - } - - fn fixed_base_scalar_mul( - &self, - _low: &FieldElement, - _high: &FieldElement, - ) -> Result<(FieldElement, FieldElement), acvm::BlackBoxResolutionError> { - unimplemented!(); - } - } - #[test] fn test_resolve_foreign_calls_stepping_into_brillig() { let fe_0 = FieldElement::zero(); let fe_1 = FieldElement::one(); let w_x = Witness(1); - let blackbox_solver = &StubbedSolver; - let brillig_opcodes = Brillig { inputs: vec![BrilligInputs::Single(Expression { linear_combinations: vec![(fe_1, w_x)], @@ -525,7 +486,7 @@ mod tests { let initial_witness = BTreeMap::from([(Witness(1), fe_1)]).into(); let mut context = DebugContext::new( - blackbox_solver, + &StubbedSolver, circuit, debug_artifact, initial_witness, @@ -572,8 +533,6 @@ mod tests { let w_y = Witness(2); let w_z = Witness(3); - let blackbox_solver = &StubbedSolver; - // This Brillig block is equivalent to: z = x + y let brillig_opcodes = Brillig { inputs: vec![ @@ -619,7 +578,7 @@ mod tests { let initial_witness = BTreeMap::from([(Witness(1), fe_1), (Witness(2), fe_1)]).into(); let mut context = DebugContext::new( - blackbox_solver, + &StubbedSolver, circuit, debug_artifact, initial_witness, @@ -648,7 +607,6 @@ mod tests { #[test] fn test_offset_opcode_location() { - let blackbox_solver = &StubbedSolver; let opcodes = vec![ Opcode::Brillig(Brillig { inputs: vec![], @@ -669,7 +627,7 @@ mod tests { let debug_artifact = DebugArtifact { debug_symbols: vec![], file_map: BTreeMap::new(), warnings: vec![] }; let context = DebugContext::new( - blackbox_solver, + &StubbedSolver, &circuit, &debug_artifact, WitnessMap::new(), diff --git a/tooling/lsp/src/requests/goto_definition.rs b/tooling/lsp/src/requests/goto_definition.rs index 6d44761de94..df9a6382974 100644 --- a/tooling/lsp/src/requests/goto_definition.rs +++ b/tooling/lsp/src/requests/goto_definition.rs @@ -80,19 +80,17 @@ fn on_goto_definition_inner( #[cfg(test)] mod goto_definition_tests { + use acvm::blackbox_solver::StubbedSolver; use async_lsp::ClientSocket; use lsp_types::{Position, Url}; use tokio::test; - use crate::solver::MockBackend; - use super::*; #[test] async fn test_on_goto_definition() { let client = ClientSocket::new_closed(); - let solver = MockBackend; - let mut state = LspState::new(&client, solver); + let mut state = LspState::new(&client, StubbedSolver); let root_path = std::env::current_dir() .unwrap() diff --git a/tooling/lsp/src/requests/mod.rs b/tooling/lsp/src/requests/mod.rs index ba2ef870d88..2037a0c9640 100644 --- a/tooling/lsp/src/requests/mod.rs +++ b/tooling/lsp/src/requests/mod.rs @@ -209,21 +209,19 @@ pub(crate) fn on_shutdown( #[cfg(test)] mod initialization { + use acvm::blackbox_solver::StubbedSolver; use async_lsp::ClientSocket; use lsp_types::{ CodeLensOptions, InitializeParams, TextDocumentSyncCapability, TextDocumentSyncKind, }; use tokio::test; - use crate::{ - requests::on_initialize, solver::MockBackend, types::ServerCapabilities, LspState, - }; + use crate::{requests::on_initialize, types::ServerCapabilities, LspState}; #[test] async fn test_on_initialize() { let client = ClientSocket::new_closed(); - let solver = MockBackend; - let mut state = LspState::new(&client, solver); + let mut state = LspState::new(&client, StubbedSolver); let params = InitializeParams::default(); let response = on_initialize(&mut state, params).await.unwrap(); assert!(matches!( diff --git a/tooling/lsp/src/solver.rs b/tooling/lsp/src/solver.rs index 090f71d63b4..90dd4a63f64 100644 --- a/tooling/lsp/src/solver.rs +++ b/tooling/lsp/src/solver.rs @@ -40,45 +40,3 @@ impl BlackBoxFunctionSolver for WrapperSolver { self.0.pedersen_hash(inputs, domain_separator) } } - -// We also have a mocked implementation of the `BlackBoxFunctionSolver` trait for use in tests - -#[cfg(test)] -pub(crate) struct MockBackend; - -#[cfg(test)] -impl BlackBoxFunctionSolver for MockBackend { - fn schnorr_verify( - &self, - _public_key_x: &acvm::FieldElement, - _public_key_y: &acvm::FieldElement, - _signature: &[u8], - _message: &[u8], - ) -> Result { - unimplemented!() - } - - fn pedersen_commitment( - &self, - _inputs: &[acvm::FieldElement], - _domain_separator: u32, - ) -> Result<(acvm::FieldElement, acvm::FieldElement), acvm::BlackBoxResolutionError> { - unimplemented!() - } - - fn fixed_base_scalar_mul( - &self, - _low: &acvm::FieldElement, - _high: &acvm::FieldElement, - ) -> Result<(acvm::FieldElement, acvm::FieldElement), acvm::BlackBoxResolutionError> { - unimplemented!() - } - - fn pedersen_hash( - &self, - _inputs: &[acvm::FieldElement], - _domain_separator: u32, - ) -> Result { - unimplemented!() - } -} From 8f4d96e10429a5316b7422768b7e690c9bd53e6b Mon Sep 17 00:00:00 2001 From: Tom French Date: Fri, 12 Jan 2024 14:36:19 +0000 Subject: [PATCH 2/3] chore: rename `StubbedSolver` to `StubbedBlackBoxSolver` --- acvm-repo/acvm/tests/solver.rs | 16 ++++++++-------- .../blackbox_solver/src/curve_specific_solver.rs | 4 ++-- acvm-repo/blackbox_solver/src/lib.rs | 2 +- .../src/ssa/acir_gen/acir_ir/acir_variable.rs | 9 +++++++-- tooling/debugger/src/context.rs | 8 ++++---- tooling/lsp/src/requests/goto_definition.rs | 4 ++-- tooling/lsp/src/requests/mod.rs | 4 ++-- 7 files changed, 26 insertions(+), 21 deletions(-) diff --git a/acvm-repo/acvm/tests/solver.rs b/acvm-repo/acvm/tests/solver.rs index 25c291a56cb..4a4b75df146 100644 --- a/acvm-repo/acvm/tests/solver.rs +++ b/acvm-repo/acvm/tests/solver.rs @@ -12,7 +12,7 @@ use acir::{ }; use acvm::pwg::{ACVMStatus, ErrorLocation, ForeignCallWaitInfo, OpcodeResolutionError, ACVM}; -use acvm_blackbox_solver::StubbedSolver; +use acvm_blackbox_solver::StubbedBlackBoxSolver; // Reenable these test cases once we move the brillig implementation of inversion down into the acvm stdlib. @@ -97,7 +97,7 @@ fn inversion_brillig_oracle_equivalence() { ]) .into(); - let mut acvm = ACVM::new(&StubbedSolver, &opcodes, witness_assignments); + let mut acvm = ACVM::new(&StubbedBlackBoxSolver, &opcodes, witness_assignments); // use the partial witness generation solver with our acir program let solver_status = acvm.solve(); @@ -226,7 +226,7 @@ fn double_inversion_brillig_oracle() { ]) .into(); - let mut acvm = ACVM::new(&StubbedSolver, &opcodes, witness_assignments); + let mut acvm = ACVM::new(&StubbedBlackBoxSolver, &opcodes, witness_assignments); // use the partial witness generation solver with our acir program let solver_status = acvm.solve(); @@ -347,7 +347,7 @@ fn oracle_dependent_execution() { let witness_assignments = BTreeMap::from([(w_x, FieldElement::from(2u128)), (w_y, FieldElement::from(2u128))]).into(); - let mut acvm = ACVM::new(&StubbedSolver, &opcodes, witness_assignments); + let mut acvm = ACVM::new(&StubbedBlackBoxSolver, &opcodes, witness_assignments); // use the partial witness generation solver with our acir program let solver_status = acvm.solve(); @@ -446,7 +446,7 @@ fn brillig_oracle_predicate() { ]) .into(); - let mut acvm = ACVM::new(&StubbedSolver, &opcodes, witness_assignments); + let mut acvm = ACVM::new(&StubbedBlackBoxSolver, &opcodes, witness_assignments); let solver_status = acvm.solve(); assert_eq!(solver_status, ACVMStatus::Solved, "should be fully solved"); @@ -479,7 +479,7 @@ fn unsatisfied_opcode_resolved() { values.insert(d, FieldElement::from(2_i128)); let opcodes = vec![Opcode::AssertZero(opcode_a)]; - let mut acvm = ACVM::new(&StubbedSolver, &opcodes, values); + let mut acvm = ACVM::new(&StubbedBlackBoxSolver, &opcodes, values); let solver_status = acvm.solve(); assert_eq!( solver_status, @@ -559,7 +559,7 @@ fn unsatisfied_opcode_resolved_brillig() { let opcodes = vec![brillig_opcode, Opcode::AssertZero(opcode_a)]; - let mut acvm = ACVM::new(&StubbedSolver, &opcodes, values); + let mut acvm = ACVM::new(&StubbedBlackBoxSolver, &opcodes, values); let solver_status = acvm.solve(); assert_eq!( solver_status, @@ -603,7 +603,7 @@ fn memory_operations() { let opcodes = vec![init, read_op, expression]; - let mut acvm = ACVM::new(&StubbedSolver, &opcodes, initial_witness); + let mut acvm = ACVM::new(&StubbedBlackBoxSolver, &opcodes, initial_witness); let solver_status = acvm.solve(); assert_eq!(solver_status, ACVMStatus::Solved); let witness_map = acvm.finalize(); diff --git a/acvm-repo/blackbox_solver/src/curve_specific_solver.rs b/acvm-repo/blackbox_solver/src/curve_specific_solver.rs index 01b19a234d9..28e0699795f 100644 --- a/acvm-repo/blackbox_solver/src/curve_specific_solver.rs +++ b/acvm-repo/blackbox_solver/src/curve_specific_solver.rs @@ -31,9 +31,9 @@ pub trait BlackBoxFunctionSolver { ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError>; } -pub struct StubbedSolver; +pub struct StubbedBlackBoxSolver; -impl BlackBoxFunctionSolver for StubbedSolver { +impl BlackBoxFunctionSolver for StubbedBlackBoxSolver { fn schnorr_verify( &self, _public_key_x: &FieldElement, diff --git a/acvm-repo/blackbox_solver/src/lib.rs b/acvm-repo/blackbox_solver/src/lib.rs index 05a2afe9e46..afba4eff17c 100644 --- a/acvm-repo/blackbox_solver/src/lib.rs +++ b/acvm-repo/blackbox_solver/src/lib.rs @@ -16,7 +16,7 @@ use thiserror::Error; mod curve_specific_solver; -pub use curve_specific_solver::{BlackBoxFunctionSolver, StubbedSolver}; +pub use curve_specific_solver::{BlackBoxFunctionSolver, StubbedBlackBoxSolver}; #[derive(Clone, PartialEq, Eq, Debug, Error)] pub enum BlackBoxResolutionError { diff --git a/compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs b/compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs index 160fe71e0b4..cf7c6151110 100644 --- a/compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs +++ b/compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs @@ -1736,8 +1736,13 @@ fn execute_brillig( // Instantiate a Brillig VM given the solved input registers and memory, along with the Brillig bytecode. let input_registers = Registers::load(input_register_values); - let mut vm = - VM::new(input_registers, input_memory, code, Vec::new(), &blackbox_solver::StubbedSolver); + let mut vm = VM::new( + input_registers, + input_memory, + code, + Vec::new(), + &blackbox_solver::StubbedBlackBoxSolver, + ); // Run the Brillig VM on these inputs, bytecode, etc! let vm_status = vm.process_opcodes(); diff --git a/tooling/debugger/src/context.rs b/tooling/debugger/src/context.rs index 1371541944d..12b55708b15 100644 --- a/tooling/debugger/src/context.rs +++ b/tooling/debugger/src/context.rs @@ -440,7 +440,7 @@ mod tests { }, native_types::Expression, }, - blackbox_solver::StubbedSolver, + blackbox_solver::StubbedBlackBoxSolver, brillig_vm::brillig::{ BinaryFieldOp, Opcode as BrilligOpcode, RegisterIndex, RegisterOrMemory, }, @@ -486,7 +486,7 @@ mod tests { let initial_witness = BTreeMap::from([(Witness(1), fe_1)]).into(); let mut context = DebugContext::new( - &StubbedSolver, + &StubbedBlackBoxSolver, circuit, debug_artifact, initial_witness, @@ -578,7 +578,7 @@ mod tests { let initial_witness = BTreeMap::from([(Witness(1), fe_1), (Witness(2), fe_1)]).into(); let mut context = DebugContext::new( - &StubbedSolver, + &StubbedBlackBoxSolver, circuit, debug_artifact, initial_witness, @@ -627,7 +627,7 @@ mod tests { let debug_artifact = DebugArtifact { debug_symbols: vec![], file_map: BTreeMap::new(), warnings: vec![] }; let context = DebugContext::new( - &StubbedSolver, + &StubbedBlackBoxSolver, &circuit, &debug_artifact, WitnessMap::new(), diff --git a/tooling/lsp/src/requests/goto_definition.rs b/tooling/lsp/src/requests/goto_definition.rs index df9a6382974..277bbf013f9 100644 --- a/tooling/lsp/src/requests/goto_definition.rs +++ b/tooling/lsp/src/requests/goto_definition.rs @@ -80,7 +80,7 @@ fn on_goto_definition_inner( #[cfg(test)] mod goto_definition_tests { - use acvm::blackbox_solver::StubbedSolver; + use acvm::blackbox_solver::StubbedBlackBoxSolver; use async_lsp::ClientSocket; use lsp_types::{Position, Url}; use tokio::test; @@ -90,7 +90,7 @@ mod goto_definition_tests { #[test] async fn test_on_goto_definition() { let client = ClientSocket::new_closed(); - let mut state = LspState::new(&client, StubbedSolver); + let mut state = LspState::new(&client, StubbedBlackBoxSolver); let root_path = std::env::current_dir() .unwrap() diff --git a/tooling/lsp/src/requests/mod.rs b/tooling/lsp/src/requests/mod.rs index 2037a0c9640..9a4738e1985 100644 --- a/tooling/lsp/src/requests/mod.rs +++ b/tooling/lsp/src/requests/mod.rs @@ -209,7 +209,7 @@ pub(crate) fn on_shutdown( #[cfg(test)] mod initialization { - use acvm::blackbox_solver::StubbedSolver; + use acvm::blackbox_solver::StubbedBlackBoxSolver; use async_lsp::ClientSocket; use lsp_types::{ CodeLensOptions, InitializeParams, TextDocumentSyncCapability, TextDocumentSyncKind, @@ -221,7 +221,7 @@ mod initialization { #[test] async fn test_on_initialize() { let client = ClientSocket::new_closed(); - let mut state = LspState::new(&client, StubbedSolver); + let mut state = LspState::new(&client, StubbedBlackBoxSolver); let params = InitializeParams::default(); let response = on_initialize(&mut state, params).await.unwrap(); assert!(matches!( From d142d30f7facb2a77e8951500ac257acb6ee08b4 Mon Sep 17 00:00:00 2001 From: Tom French Date: Fri, 12 Jan 2024 14:43:50 +0000 Subject: [PATCH 3/3] chore: standardize `StubbedBlackBoxSolver` error --- .../src/curve_specific_solver.rs | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/acvm-repo/blackbox_solver/src/curve_specific_solver.rs b/acvm-repo/blackbox_solver/src/curve_specific_solver.rs index 28e0699795f..c71eebb8f98 100644 --- a/acvm-repo/blackbox_solver/src/curve_specific_solver.rs +++ b/acvm-repo/blackbox_solver/src/curve_specific_solver.rs @@ -33,6 +33,15 @@ pub trait BlackBoxFunctionSolver { pub struct StubbedBlackBoxSolver; +impl StubbedBlackBoxSolver { + fn fail(black_box_function: BlackBoxFunc) -> BlackBoxResolutionError { + BlackBoxResolutionError::Failed( + black_box_function, + format!("{} is not supported", black_box_function.name()), + ) + } +} + impl BlackBoxFunctionSolver for StubbedBlackBoxSolver { fn schnorr_verify( &self, @@ -41,39 +50,27 @@ impl BlackBoxFunctionSolver for StubbedBlackBoxSolver { _signature: &[u8], _message: &[u8], ) -> Result { - Err(BlackBoxResolutionError::Failed( - BlackBoxFunc::SchnorrVerify, - "SchnorrVerify is not supported".to_string(), - )) + Err(Self::fail(BlackBoxFunc::SchnorrVerify)) } fn pedersen_commitment( &self, _inputs: &[FieldElement], _domain_separator: u32, ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError> { - Err(BlackBoxResolutionError::Failed( - BlackBoxFunc::PedersenCommitment, - "PedersenCommitment is not supported".to_string(), - )) + Err(Self::fail(BlackBoxFunc::PedersenCommitment)) } fn pedersen_hash( &self, _inputs: &[FieldElement], _domain_separator: u32, ) -> Result { - Err(BlackBoxResolutionError::Failed( - BlackBoxFunc::PedersenHash, - "PedersenHash is not supported".to_string(), - )) + Err(Self::fail(BlackBoxFunc::PedersenHash)) } fn fixed_base_scalar_mul( &self, _low: &FieldElement, _high: &FieldElement, ) -> Result<(FieldElement, FieldElement), BlackBoxResolutionError> { - Err(BlackBoxResolutionError::Failed( - BlackBoxFunc::FixedBaseScalarMul, - "FixedBaseScalarMul is not supported".to_string(), - )) + Err(Self::fail(BlackBoxFunc::FixedBaseScalarMul)) } }