From 2918f3382a78988cedca3fdfb09bbe59f66603ec Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Fri, 17 Feb 2023 13:43:04 +0000 Subject: [PATCH] chore: remove support for InputValue::Undefined (#867) * feat: remove support for undefined `InputValues` * chore: add quick test for parsing empty strings * chore: remove unused imports --- crates/nargo/src/cli/execute_cmd.rs | 9 +-------- crates/nargo/src/cli/verify_cmd.rs | 9 +-------- crates/noirc_abi/src/errors.rs | 2 -- crates/noirc_abi/src/input_parser/mod.rs | 3 --- crates/noirc_abi/src/input_parser/toml.rs | 18 ++++++++++++------ crates/noirc_abi/src/lib.rs | 14 ++++++-------- 6 files changed, 20 insertions(+), 35 deletions(-) diff --git a/crates/nargo/src/cli/execute_cmd.rs b/crates/nargo/src/cli/execute_cmd.rs index d9291b00876..492c14529a3 100644 --- a/crates/nargo/src/cli/execute_cmd.rs +++ b/crates/nargo/src/cli/execute_cmd.rs @@ -3,7 +3,6 @@ use std::path::{Path, PathBuf}; use acvm::acir::native_types::Witness; use acvm::PartialWitnessGenerator; use clap::Args; -use noirc_abi::errors::AbiError; use noirc_abi::input_parser::{Format, InputValue}; use noirc_abi::{InputMap, WitnessMap, MAIN_RETURN_NAME}; use noirc_driver::CompiledProgram; @@ -86,13 +85,7 @@ pub(crate) fn solve_witness( compiled_program: &CompiledProgram, input_map: &InputMap, ) -> Result { - let mut solved_witness = - compiled_program.abi.encode(input_map, true).map_err(|error| match error { - AbiError::UndefinedInput(_) => { - CliError::Generic(format!("{error} in the {PROVER_INPUT_FILE}.toml file.")) - } - _ => CliError::from(error), - })?; + let mut solved_witness = compiled_program.abi.encode(input_map, true)?; let backend = crate::backends::ConcreteBackend; backend.solve(&mut solved_witness, compiled_program.circuit.opcodes.clone())?; diff --git a/crates/nargo/src/cli/verify_cmd.rs b/crates/nargo/src/cli/verify_cmd.rs index cb062077e78..391a384e2c6 100644 --- a/crates/nargo/src/cli/verify_cmd.rs +++ b/crates/nargo/src/cli/verify_cmd.rs @@ -8,7 +8,6 @@ use crate::{ }; use acvm::{FieldElement, ProofSystemCompiler}; use clap::Args; -use noirc_abi::errors::AbiError; use noirc_abi::input_parser::Format; use noirc_driver::CompiledProgram; use std::{collections::BTreeMap, path::Path}; @@ -93,13 +92,7 @@ pub(crate) fn verify_proof( verification_key: Vec, ) -> Result { let public_abi = compiled_program.abi.public_abi(); - let public_inputs = - public_abi.encode(&public_inputs_map, false).map_err(|error| match error { - AbiError::UndefinedInput(_) => { - CliError::Generic(format!("{error} in the {VERIFIER_INPUT_FILE}.toml file.")) - } - _ => CliError::from(error), - })?; + let public_inputs = public_abi.encode(&public_inputs_map, false)?; let public_inputs_vec: Vec = public_inputs.values().copied().collect(); diff --git a/crates/noirc_abi/src/errors.rs b/crates/noirc_abi/src/errors.rs index 55a3683b347..34ef45a8415 100644 --- a/crates/noirc_abi/src/errors.rs +++ b/crates/noirc_abi/src/errors.rs @@ -38,8 +38,6 @@ pub enum AbiError { TypeMismatch { param: AbiParameter, value: InputValue }, #[error("ABI expects the parameter `{0}`, but this was not found")] MissingParam(String), - #[error("Input value `{0}` is not defined")] - UndefinedInput(String), #[error( "Could not read witness value at index {witness_index:?} (required for parameter \"{name}\")" )] diff --git a/crates/noirc_abi/src/input_parser/mod.rs b/crates/noirc_abi/src/input_parser/mod.rs index 914b5261e49..368adb45cfb 100644 --- a/crates/noirc_abi/src/input_parser/mod.rs +++ b/crates/noirc_abi/src/input_parser/mod.rs @@ -17,7 +17,6 @@ pub enum InputValue { Vec(Vec), String(String), Struct(BTreeMap), - Undefined, } impl InputValue { @@ -59,8 +58,6 @@ impl InputValue { }) } - (InputValue::Undefined, _) => true, - // All other InputValue-AbiType combinations are fundamentally incompatible. _ => false, } diff --git a/crates/noirc_abi/src/input_parser/toml.rs b/crates/noirc_abi/src/input_parser/toml.rs index 876724ebdd5..75c13f5c410 100644 --- a/crates/noirc_abi/src/input_parser/toml.rs +++ b/crates/noirc_abi/src/input_parser/toml.rs @@ -78,7 +78,6 @@ impl From for TomlTypes { btree_map(map, |(key, value)| (key, TomlTypes::from(value))); TomlTypes::Table(map_with_toml_types) } - InputValue::Undefined => unreachable!(), } } } @@ -92,11 +91,7 @@ impl InputValue { TomlTypes::String(string) => match param_type { AbiType::String { .. } => InputValue::String(string), AbiType::Field | AbiType::Integer { .. } => { - if string.is_empty() { - InputValue::Undefined - } else { - InputValue::Field(parse_str_to_field(&string)?) - } + InputValue::Field(parse_str_to_field(&string)?) } _ => return Err(InputParserError::AbiTypeMismatch(param_type.clone())), }, @@ -149,3 +144,14 @@ fn parse_str_to_field(value: &str) -> Result { .map(FieldElement::from) } } + +#[cfg(test)] +mod test { + use super::parse_str_to_field; + + #[test] + fn parse_empty_str_fails() { + // Check that this fails appropriately rather than being treated as 0, etc. + assert!(parse_str_to_field("").is_err()); + } +} diff --git a/crates/noirc_abi/src/lib.rs b/crates/noirc_abi/src/lib.rs index b8d658a8b3f..e3250a5d335 100644 --- a/crates/noirc_abi/src/lib.rs +++ b/crates/noirc_abi/src/lib.rs @@ -192,7 +192,7 @@ impl Abi { return Err(AbiError::TypeMismatch { param, value }); } - Self::encode_value(value, ¶m_name).map(|v| (param_name, v)) + Self::encode_value(value).map(|v| (param_name, v)) }) .collect::>()?; @@ -223,7 +223,7 @@ impl Abi { Ok(()) } - fn encode_value(value: InputValue, param_name: &String) -> Result, AbiError> { + fn encode_value(value: InputValue) -> Result, AbiError> { let mut encoded_value = Vec::new(); match value { InputValue::Field(elem) => encoded_value.push(elem), @@ -234,12 +234,10 @@ impl Abi { encoded_value.extend(str_as_fields) } InputValue::Struct(object) => { - for (field_name, value) in object { - let new_name = format!("{param_name}.{field_name}"); - encoded_value.extend(Self::encode_value(value, &new_name)?) + for value in object.into_values() { + encoded_value.extend(Self::encode_value(value)?) } } - InputValue::Undefined => return Err(AbiError::UndefinedInput(param_name.to_string())), } Ok(encoded_value) } @@ -364,8 +362,8 @@ mod test { ("thing2".to_string(), InputValue::Field(FieldElement::zero())), ]); - let witness_map = abi.encode_to_witness(&inputs).unwrap(); - let reconstructed_inputs = abi.decode_from_witness(&witness_map).unwrap(); + let witness_map = abi.encode(&inputs, true).unwrap(); + let reconstructed_inputs = abi.decode(&witness_map).unwrap(); for (key, expected_value) in inputs { assert_eq!(reconstructed_inputs[&key], expected_value);