refactor Field + PrimeField -> PrimeField, all tests still pass

This commit is contained in:
gluax 2021-02-16 14:41:59 -05:00
parent a7c9caf4b3
commit ba3ca6069a
64 changed files with 168 additions and 267 deletions

View File

@ -33,7 +33,7 @@ use leo_state::verify_local_data_commitment;
use snarkvm_dpc::{base_dpc::instantiated::Components, SystemParameters}; use snarkvm_dpc::{base_dpc::instantiated::Components, SystemParameters};
use snarkvm_errors::gadgets::SynthesisError; use snarkvm_errors::gadgets::SynthesisError;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::r1cs::{ConstraintSynthesizer, ConstraintSystem}, gadgets::r1cs::{ConstraintSynthesizer, ConstraintSystem},
}; };
@ -46,7 +46,7 @@ use std::{
/// Stores information to compile a Leo program. /// Stores information to compile a Leo program.
#[derive(Clone)] #[derive(Clone)]
pub struct Compiler<F: Field + PrimeField, G: GroupType<F>> { pub struct Compiler<F: PrimeField, G: GroupType<F>> {
program_name: String, program_name: String,
main_file_path: PathBuf, main_file_path: PathBuf,
output_directory: PathBuf, output_directory: PathBuf,
@ -57,7 +57,7 @@ pub struct Compiler<F: Field + PrimeField, G: GroupType<F>> {
_group: PhantomData<G>, _group: PhantomData<G>,
} }
impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> { impl<F: PrimeField, G: GroupType<F>> Compiler<F, G> {
/// ///
/// Returns a new Leo program compiler. /// Returns a new Leo program compiler.
/// ///
@ -261,7 +261,7 @@ impl<F: Field + PrimeField, G: GroupType<F>> Compiler<F, G> {
} }
} }
impl<F: Field + PrimeField, G: GroupType<F>> ConstraintSynthesizer<F> for Compiler<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstraintSynthesizer<F> for Compiler<F, G> {
/// ///
/// Synthesizes the circuit with program input. /// Synthesizes the circuit with program input.
/// ///

View File

@ -27,11 +27,11 @@ use leo_asg::{Expression, Span};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn evaluate_console_assert<CS: ConstraintSystem<F>>( pub fn evaluate_console_assert<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -20,11 +20,11 @@ use crate::{errors::ConsoleError, program::ConstrainedProgram, statement::get_in
use leo_asg::{ConsoleFunction, ConsoleStatement}; use leo_asg::{ConsoleFunction, ConsoleStatement};
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn evaluate_console_function_call<CS: ConstraintSystem<F>>( pub fn evaluate_console_function_call<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -19,12 +19,9 @@
use crate::{errors::ConsoleError, program::ConstrainedProgram, GroupType}; use crate::{errors::ConsoleError, program::ConstrainedProgram, GroupType};
use leo_asg::FormattedString; use leo_asg::FormattedString;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn format<CS: ConstraintSystem<F>>( pub fn format<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -23,12 +23,12 @@ use leo_input::LeoInputParser;
use leo_package::inputs::InputPairs; use leo_package::inputs::InputPairs;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::r1cs::{ConstraintSystem, TestConstraintSystem}, gadgets::r1cs::{ConstraintSystem, TestConstraintSystem},
}; };
use std::path::Path; use std::path::Path;
pub fn generate_constraints<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn generate_constraints<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
asg: &Asg, asg: &Asg,
input: &Input, input: &Input,
@ -50,7 +50,7 @@ pub fn generate_constraints<F: Field + PrimeField, G: GroupType<F>, CS: Constrai
} }
} }
pub fn generate_test_constraints<F: Field + PrimeField, G: GroupType<F>>( pub fn generate_test_constraints<F: PrimeField, G: GroupType<F>>(
asg: &Asg, asg: &Asg,
input: InputPairs, input: InputPairs,
main_file_path: &Path, main_file_path: &Path,

View File

@ -19,9 +19,9 @@
use crate::{program::ConstrainedProgram, value::ConstrainedValue, GroupType}; use crate::{program::ConstrainedProgram, value::ConstrainedValue, GroupType};
use leo_asg::Variable; use leo_asg::Variable;
use snarkvm_models::curves::{Field, PrimeField}; use snarkvm_models::curves::PrimeField;
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn store_definition(&mut self, variable: &Variable, value: ConstrainedValue<F, G>) { pub fn store_definition(&mut self, variable: &Variable, value: ConstrainedValue<F, G>) {
let variable = variable.borrow(); let variable = variable.borrow();

View File

@ -19,12 +19,9 @@
use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_ast::Span; use leo_ast::Span;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn enforce_add<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn enforce_add<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -19,12 +19,9 @@
use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_ast::Span; use leo_ast::Span;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn enforce_div<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn enforce_div<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -19,12 +19,9 @@
use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_ast::Span; use leo_ast::Span;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn enforce_mul<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn enforce_mul<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -19,12 +19,9 @@
use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_ast::Span; use leo_ast::Span;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn enforce_negate<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn enforce_negate<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
value: ConstrainedValue<F, G>, value: ConstrainedValue<F, G>,
span: &Span, span: &Span,

View File

@ -19,12 +19,9 @@
use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_ast::Span; use leo_ast::Span;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn enforce_pow<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn enforce_pow<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -19,12 +19,9 @@
use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_ast::Span; use leo_ast::Span;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn enforce_sub<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn enforce_sub<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, program::ConstrainedProgram, value::Constra
use leo_asg::{Expression, Span}; use leo_asg::{Expression, Span};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_array_access<CS: ConstraintSystem<F>>( pub fn enforce_array_access<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, program::ConstrainedProgram, value::Constra
use leo_asg::{Expression, Span}; use leo_asg::{Expression, Span};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// Enforce array expressions /// Enforce array expressions
pub fn enforce_array<CS: ConstraintSystem<F>>( pub fn enforce_array<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, program::ConstrainedProgram, value::Constra
use leo_asg::{Expression, Span}; use leo_asg::{Expression, Span};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub(crate) fn enforce_index<CS: ConstraintSystem<F>>( pub(crate) fn enforce_index<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -20,14 +20,11 @@ use crate::{errors::ExpressionError, program::ConstrainedProgram, value::Constra
use leo_asg::Expression; use leo_asg::Expression;
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
type ConstrainedValuePair<T, U> = (ConstrainedValue<T, U>, ConstrainedValue<T, U>); type ConstrainedValuePair<T, U> = (ConstrainedValue<T, U>, ConstrainedValue<T, U>);
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_binary_expression<CS: ConstraintSystem<F>>( pub fn enforce_binary_expression<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -19,12 +19,9 @@
use crate::{errors::ExpressionError, program::ConstrainedProgram, value::ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, program::ConstrainedProgram, value::ConstrainedValue, GroupType};
use leo_asg::{CircuitAccessExpression, Node}; use leo_asg::{CircuitAccessExpression, Node};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_circuit_access<CS: ConstraintSystem<F>>( pub fn enforce_circuit_access<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -24,12 +24,9 @@ use crate::{
}; };
use leo_asg::{CircuitInitExpression, CircuitMemberBody, Span}; use leo_asg::{CircuitInitExpression, CircuitMemberBody, Span};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn enforce_circuit<CS: ConstraintSystem<F>>( pub fn enforce_circuit<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -21,11 +21,11 @@ use leo_asg::{Expression, Span};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::select::CondSelectGadget}, gadgets::{r1cs::ConstraintSystem, utilities::select::CondSelectGadget},
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// Enforce ternary conditional expression /// Enforce ternary conditional expression
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_conditional_expression<CS: ConstraintSystem<F>>( pub fn enforce_conditional_expression<CS: ConstraintSystem<F>>(

View File

@ -31,11 +31,11 @@ use leo_asg::{expression::*, ConstValue, Expression, Node};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub(crate) fn enforce_expression<CS: ConstraintSystem<F>>( pub(crate) fn enforce_expression<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -17,13 +17,10 @@ use crate::{program::ConstrainedProgram, value::ConstrainedValue, CoreCircuit, G
use crate::errors::ExpressionError; use crate::errors::ExpressionError;
use leo_asg::{Expression, Function, Span}; use leo_asg::{Expression, Function, Span};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
use std::sync::Arc; use std::sync::Arc;
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// Call a default core circuit function with arguments /// Call a default core circuit function with arguments
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_core_circuit_call_expression<CS: ConstraintSystem<F>, C: CoreCircuit<F, G>>( pub fn enforce_core_circuit_call_expression<CS: ConstraintSystem<F>, C: CoreCircuit<F, G>>(

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, program::ConstrainedProgram, value::Constra
use leo_asg::{Expression, Function, Span}; use leo_asg::{Expression, Function, Span};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_function_call_expression<CS: ConstraintSystem<F>>( pub fn enforce_function_call_expression<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -20,11 +20,11 @@ use crate::{errors::BooleanError, value::ConstrainedValue, GroupType};
use leo_asg::Span; use leo_asg::Span;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
pub fn enforce_and<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn enforce_and<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -19,9 +19,9 @@
use crate::{errors::BooleanError, value::ConstrainedValue, GroupType}; use crate::{errors::BooleanError, value::ConstrainedValue, GroupType};
use leo_asg::Span; use leo_asg::Span;
use snarkvm_models::curves::{Field, PrimeField}; use snarkvm_models::curves::PrimeField;
pub fn evaluate_not<F: Field + PrimeField, G: GroupType<F>>( pub fn evaluate_not<F: PrimeField, G: GroupType<F>>(
value: ConstrainedValue<F, G>, value: ConstrainedValue<F, G>,
span: &Span, span: &Span,
) -> Result<ConstrainedValue<F, G>, BooleanError> { ) -> Result<ConstrainedValue<F, G>, BooleanError> {

View File

@ -20,11 +20,11 @@ use crate::{errors::BooleanError, value::ConstrainedValue, GroupType};
use leo_asg::Span; use leo_asg::Span;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
pub fn enforce_or<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn enforce_or<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -20,14 +20,14 @@ use crate::{enforce_and, errors::ExpressionError, value::ConstrainedValue, Group
use leo_asg::Span; use leo_asg::Span;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
r1cs::ConstraintSystem, r1cs::ConstraintSystem,
utilities::{boolean::Boolean, eq::EvaluateEqGadget}, utilities::{boolean::Boolean, eq::EvaluateEqGadget},
}, },
}; };
pub fn evaluate_eq<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn evaluate_eq<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_asg::Span; use leo_asg::Span;
use leo_gadgets::bits::ComparatorGadget; use leo_gadgets::bits::ComparatorGadget;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn evaluate_ge<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn evaluate_ge<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_asg::Span; use leo_asg::Span;
use leo_gadgets::bits::ComparatorGadget; use leo_gadgets::bits::ComparatorGadget;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn evaluate_gt<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn evaluate_gt<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_asg::Span; use leo_asg::Span;
use leo_gadgets::bits::ComparatorGadget; use leo_gadgets::bits::ComparatorGadget;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn evaluate_le<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn evaluate_le<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, value::ConstrainedValue, GroupType};
use leo_asg::Span; use leo_asg::Span;
use leo_gadgets::bits::comparator::EvaluateLtGadget; use leo_gadgets::bits::comparator::EvaluateLtGadget;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub fn evaluate_lt<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub fn evaluate_lt<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
left: ConstrainedValue<F, G>, left: ConstrainedValue<F, G>,
right: ConstrainedValue<F, G>, right: ConstrainedValue<F, G>,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, program::ConstrainedProgram, value::Constra
use leo_asg::{Expression, Span}; use leo_asg::{Expression, Span};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_tuple_access<CS: ConstraintSystem<F>>( pub fn enforce_tuple_access<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -20,12 +20,9 @@ use crate::{errors::ExpressionError, program::ConstrainedProgram, value::Constra
use leo_asg::Expression; use leo_asg::Expression;
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// Enforce tuple expressions /// Enforce tuple expressions
pub fn enforce_tuple<CS: ConstraintSystem<F>>( pub fn enforce_tuple<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -19,9 +19,9 @@
use crate::{errors::ExpressionError, program::ConstrainedProgram, value::ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, program::ConstrainedProgram, value::ConstrainedValue, GroupType};
use leo_asg::VariableRef; use leo_asg::VariableRef;
use snarkvm_models::curves::{Field, PrimeField}; use snarkvm_models::curves::PrimeField;
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// Enforce a variable expression by getting the resolved value /// Enforce a variable expression by getting the resolved value
pub fn evaluate_ref(&mut self, variable_ref: &VariableRef) -> Result<ConstrainedValue<F, G>, ExpressionError> { pub fn evaluate_ref(&mut self, variable_ref: &VariableRef) -> Result<ConstrainedValue<F, G>, ExpressionError> {
// Evaluate the identifier name in the current function scope // Evaluate the identifier name in the current function scope

View File

@ -22,11 +22,11 @@ use leo_asg::{Expression, FunctionBody, FunctionQualifier};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub(crate) fn enforce_function<CS: ConstraintSystem<F>>( pub(crate) fn enforce_function<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -21,12 +21,9 @@ use crate::{errors::FunctionError, program::ConstrainedProgram, value::Constrain
use leo_asg::Type; use leo_asg::Type;
use leo_ast::{InputValue, Span}; use leo_ast::{InputValue, Span};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn allocate_array<CS: ConstraintSystem<F>>( pub fn allocate_array<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -19,17 +19,14 @@ use leo_asg::{CircuitBody, CircuitMemberBody, Type};
use leo_ast::{Identifier, Input, Span}; use leo_ast::{Identifier, Input, Span};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub const RECORD_VARIABLE_NAME: &str = "record"; pub const RECORD_VARIABLE_NAME: &str = "record";
pub const REGISTERS_VARIABLE_NAME: &str = "registers"; pub const REGISTERS_VARIABLE_NAME: &str = "registers";
pub const STATE_VARIABLE_NAME: &str = "state"; pub const STATE_VARIABLE_NAME: &str = "state";
pub const STATE_LEAF_VARIABLE_NAME: &str = "state_leaf"; pub const STATE_LEAF_VARIABLE_NAME: &str = "state_leaf";
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn allocate_input_keyword<CS: ConstraintSystem<F>>( pub fn allocate_input_keyword<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -19,14 +19,11 @@ use leo_asg::{AsgConvertError, CircuitBody, CircuitMemberBody};
use leo_ast::{Identifier, InputValue, Parameter}; use leo_ast::{Identifier, InputValue, Parameter};
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
use indexmap::IndexMap; use indexmap::IndexMap;
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn allocate_input_section<CS: ConstraintSystem<F>>( pub fn allocate_input_section<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -32,12 +32,9 @@ use crate::{
use leo_asg::Type; use leo_asg::Type;
use leo_ast::{InputValue, Span}; use leo_ast::{InputValue, Span};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn allocate_main_function_input<CS: ConstraintSystem<F>>( pub fn allocate_main_function_input<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -21,12 +21,9 @@ use crate::{errors::FunctionError, program::ConstrainedProgram, value::Constrain
use leo_asg::Type; use leo_asg::Type;
use leo_ast::{InputValue, Span}; use leo_ast::{InputValue, Span};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn allocate_tuple<CS: ConstraintSystem<F>>( pub fn allocate_tuple<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -22,12 +22,9 @@ use leo_asg::{Expression, FunctionBody, FunctionQualifier};
use leo_ast::Input; use leo_ast::Input;
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn enforce_main_function<CS: ConstraintSystem<F>>( pub fn enforce_main_function<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -35,12 +35,9 @@ use leo_asg::{
}; };
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
fn prepare_mut_access<CS: ConstraintSystem<F>>( fn prepare_mut_access<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -27,14 +27,14 @@ use crate::{
use leo_asg::{Span, Type}; use leo_asg::{Span, Type};
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
r1cs::ConstraintSystem, r1cs::ConstraintSystem,
utilities::{boolean::Boolean, select::CondSelectGadget}, utilities::{boolean::Boolean, select::CondSelectGadget},
}, },
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// ///
/// Returns a conditionally selected result from the given possible function returns and /// Returns a conditionally selected result from the given possible function returns and
/// given function return type. /// given function return type.

View File

@ -18,7 +18,7 @@ use crate::{errors::OutputBytesError, ConstrainedValue, GroupType, REGISTERS_VAR
use leo_asg::Program; use leo_asg::Program;
use leo_ast::{Parameter, Registers, Span}; use leo_ast::{Parameter, Registers, Span};
use snarkvm_models::curves::{Field, PrimeField}; use snarkvm_models::curves::PrimeField;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -31,7 +31,7 @@ impl OutputBytes {
&self.0 &self.0
} }
pub fn new_from_constrained_value<F: Field + PrimeField, G: GroupType<F>>( pub fn new_from_constrained_value<F: PrimeField, G: GroupType<F>>(
program: &Program, program: &Program,
registers: &Registers, registers: &Registers,
value: ConstrainedValue<F, G>, value: ConstrainedValue<F, G>,

View File

@ -21,7 +21,7 @@ use crate::{errors::ExpressionError, ConstrainedValue, GroupType, Integer};
use leo_asg::{FunctionBody, Span}; use leo_asg::{FunctionBody, Span};
use snarkvm_gadgets::algorithms::prf::Blake2sGadget; use snarkvm_gadgets::algorithms::prf::Blake2sGadget;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
algorithms::PRFGadget, algorithms::PRFGadget,
r1cs::ConstraintSystem, r1cs::ConstraintSystem,
@ -31,7 +31,7 @@ use snarkvm_models::{
pub struct Blake2s; pub struct Blake2s;
fn unwrap_argument<F: Field + PrimeField, G: GroupType<F>>(arg: ConstrainedValue<F, G>) -> Vec<UInt8> { fn unwrap_argument<F: PrimeField, G: GroupType<F>>(arg: ConstrainedValue<F, G>) -> Vec<UInt8> {
if let ConstrainedValue::Array(args) = arg { if let ConstrainedValue::Array(args) = arg {
assert_eq!(args.len(), 32); // asg enforced assert_eq!(args.len(), 32); // asg enforced
args.into_iter() args.into_iter()
@ -48,7 +48,7 @@ fn unwrap_argument<F: Field + PrimeField, G: GroupType<F>>(arg: ConstrainedValue
} }
} }
impl<F: Field + PrimeField, G: GroupType<F>> CoreCircuit<F, G> for Blake2s { impl<F: PrimeField, G: GroupType<F>> CoreCircuit<F, G> for Blake2s {
fn call_function<CS: ConstraintSystem<F>>( fn call_function<CS: ConstraintSystem<F>>(
&self, &self,
cs: &mut CS, cs: &mut CS,

View File

@ -21,12 +21,9 @@ pub use blake2s::*;
use crate::{errors::ExpressionError, ConstrainedValue, GroupType}; use crate::{errors::ExpressionError, ConstrainedValue, GroupType};
use leo_asg::{FunctionBody, Span}; use leo_asg::{FunctionBody, Span};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub trait CoreCircuit<F: Field + PrimeField, G: GroupType<F>>: Send + Sync { pub trait CoreCircuit<F: PrimeField, G: GroupType<F>>: Send + Sync {
fn call_function<CS: ConstraintSystem<F>>( fn call_function<CS: ConstraintSystem<F>>(
&self, &self,
cs: &mut CS, cs: &mut CS,
@ -37,7 +34,7 @@ pub trait CoreCircuit<F: Field + PrimeField, G: GroupType<F>>: Send + Sync {
) -> Result<ConstrainedValue<F, G>, ExpressionError>; ) -> Result<ConstrainedValue<F, G>, ExpressionError>;
} }
pub fn resolve_core_circuit<F: Field + PrimeField, G: GroupType<F>>(name: &str) -> impl CoreCircuit<F, G> { pub fn resolve_core_circuit<F: PrimeField, G: GroupType<F>>(name: &str) -> impl CoreCircuit<F, G> {
match name { match name {
"blake2s" => Blake2s, "blake2s" => Blake2s,
_ => unimplemented!("invalid core circuit: {}", name), _ => unimplemented!("invalid core circuit: {}", name),

View File

@ -19,17 +19,17 @@
use crate::{value::ConstrainedValue, GroupType}; use crate::{value::ConstrainedValue, GroupType};
use leo_asg::Program; use leo_asg::Program;
use snarkvm_models::curves::{Field, PrimeField}; use snarkvm_models::curves::PrimeField;
use indexmap::IndexMap; use indexmap::IndexMap;
use uuid::Uuid; use uuid::Uuid;
pub struct ConstrainedProgram<F: Field + PrimeField, G: GroupType<F>> { pub struct ConstrainedProgram<F: PrimeField, G: GroupType<F>> {
pub asg: Program, pub asg: Program,
identifiers: IndexMap<Uuid, ConstrainedValue<F, G>>, identifiers: IndexMap<Uuid, ConstrainedValue<F, G>>,
} }
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn new(asg: Program) -> Self { pub fn new(asg: Program) -> Self {
Self { Self {
asg, asg,

View File

@ -20,14 +20,14 @@ use crate::{arithmetic::*, errors::StatementError, program::ConstrainedProgram,
use leo_asg::{AssignOperation, AssignStatement, Span}; use leo_asg::{AssignOperation, AssignStatement, Span};
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
r1cs::ConstraintSystem, r1cs::ConstraintSystem,
utilities::{boolean::Boolean, select::CondSelectGadget}, utilities::{boolean::Boolean, select::CondSelectGadget},
}, },
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_assign_statement<CS: ConstraintSystem<F>>( pub fn enforce_assign_statement<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -19,10 +19,7 @@
use crate::{errors::StatementError, program::ConstrainedProgram, value::ConstrainedValue, GroupType}; use crate::{errors::StatementError, program::ConstrainedProgram, value::ConstrainedValue, GroupType};
use leo_asg::{AssignAccess, AssignStatement, Identifier, Span}; use leo_asg::{AssignAccess, AssignStatement, Identifier, Span};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub(crate) enum ResolvedAssigneeAccess { pub(crate) enum ResolvedAssigneeAccess {
ArrayRange(Option<usize>, Option<usize>), ArrayRange(Option<usize>, Option<usize>),
@ -31,7 +28,7 @@ pub(crate) enum ResolvedAssigneeAccess {
Member(Identifier), Member(Identifier),
} }
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn resolve_assign<CS: ConstraintSystem<F>>( pub fn resolve_assign<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -20,11 +20,11 @@ use crate::{program::ConstrainedProgram, GroupType, IndicatorAndConstrainedValue
use leo_asg::BlockStatement; use leo_asg::BlockStatement;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// Evaluates a branch of one or more statements and returns a result in /// Evaluates a branch of one or more statements and returns a result in
/// the given scope. /// the given scope.
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]

View File

@ -27,7 +27,7 @@ use crate::{
use leo_asg::ConditionalStatement; use leo_asg::ConditionalStatement;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
@ -38,7 +38,7 @@ fn indicator_to_string(indicator: &Boolean) -> String {
.unwrap_or_else(|| "[input]".to_string()) .unwrap_or_else(|| "[input]".to_string())
} }
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// Enforces a conditional statement with one or more branches. /// Enforces a conditional statement with one or more branches.
/// Due to R1CS constraints, we must evaluate every branch to properly construct the circuit. /// Due to R1CS constraints, we must evaluate every branch to properly construct the circuit.
/// At program execution, we will pass an `indicator` bit down to all child statements within each branch. /// At program execution, we will pass an `indicator` bit down to all child statements within each branch.

View File

@ -19,12 +19,9 @@
use crate::{errors::StatementError, program::ConstrainedProgram, ConstrainedValue, GroupType}; use crate::{errors::StatementError, program::ConstrainedProgram, ConstrainedValue, GroupType};
use leo_asg::{DefinitionStatement, Span, Variable}; use leo_asg::{DefinitionStatement, Span, Variable};
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
fn enforce_multiple_definition( fn enforce_multiple_definition(
&mut self, &mut self,
variable_names: &[Variable], variable_names: &[Variable],

View File

@ -27,14 +27,14 @@ use crate::{
use leo_asg::IterationStatement; use leo_asg::IterationStatement;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
r1cs::ConstraintSystem, r1cs::ConstraintSystem,
utilities::{boolean::Boolean, uint::UInt32}, utilities::{boolean::Boolean, uint::UInt32},
}, },
}; };
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn enforce_iteration_statement<CS: ConstraintSystem<F>>( pub fn enforce_iteration_statement<CS: ConstraintSystem<F>>(
&mut self, &mut self,

View File

@ -19,12 +19,9 @@
use crate::{errors::StatementError, program::ConstrainedProgram, value::ConstrainedValue, GroupType}; use crate::{errors::StatementError, program::ConstrainedProgram, value::ConstrainedValue, GroupType};
use leo_asg::ReturnStatement; use leo_asg::ReturnStatement;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn enforce_return_statement<CS: ConstraintSystem<F>>( pub fn enforce_return_statement<CS: ConstraintSystem<F>>(
&mut self, &mut self,
cs: &mut CS, cs: &mut CS,

View File

@ -21,14 +21,14 @@ use leo_asg::Statement;
use std::sync::Arc; use std::sync::Arc;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean}, gadgets::{r1cs::ConstraintSystem, utilities::boolean::Boolean},
}; };
pub type StatementResult<T> = Result<T, StatementError>; pub type StatementResult<T> = Result<T, StatementError>;
pub type IndicatorAndConstrainedValue<T, U> = (Boolean, ConstrainedValue<T, U>); pub type IndicatorAndConstrainedValue<T, U> = (Boolean, ConstrainedValue<T, U>);
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
/// ///
/// Enforce a program statement. /// Enforce a program statement.
/// Returns a Vector of (indicator, value) tuples. /// Returns a Vector of (indicator, value) tuples.

View File

@ -20,7 +20,7 @@ use leo_ast::{InputValue, Span};
use snarkvm_dpc::base_dpc::instantiated::Components; use snarkvm_dpc::base_dpc::instantiated::Components;
use snarkvm_errors::gadgets::SynthesisError; use snarkvm_errors::gadgets::SynthesisError;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
r1cs::{Assignment, ConstraintSystem}, r1cs::{Assignment, ConstraintSystem},
utilities::{ utilities::{
@ -63,7 +63,7 @@ impl Address {
self.bytes.iter().all(|byte| byte.is_constant()) self.bytes.iter().all(|byte| byte.is_constant())
} }
pub(crate) fn from_input<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub(crate) fn from_input<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
name: &str, name: &str,
input_value: Option<InputValue>, input_value: Option<InputValue>,
@ -105,7 +105,7 @@ impl Address {
} }
} }
impl<F: Field + PrimeField> AllocGadget<String, F> for Address { impl<F: PrimeField> AllocGadget<String, F> for Address {
fn alloc<Fn: FnOnce() -> Result<T, SynthesisError>, T: Borrow<String>, CS: ConstraintSystem<F>>( fn alloc<Fn: FnOnce() -> Result<T, SynthesisError>, T: Borrow<String>, CS: ConstraintSystem<F>>(
cs: CS, cs: CS,
value_gen: Fn, value_gen: Fn,
@ -143,7 +143,7 @@ impl<F: Field + PrimeField> AllocGadget<String, F> for Address {
} }
} }
impl<F: Field + PrimeField> EvaluateEqGadget<F> for Address { impl<F: PrimeField> EvaluateEqGadget<F> for Address {
fn evaluate_equal<CS: ConstraintSystem<F>>(&self, mut cs: CS, other: &Self) -> Result<Boolean, SynthesisError> { fn evaluate_equal<CS: ConstraintSystem<F>>(&self, mut cs: CS, other: &Self) -> Result<Boolean, SynthesisError> {
if self.is_constant() && other.is_constant() { if self.is_constant() && other.is_constant() {
Ok(Boolean::Constant(self.eq(other))) Ok(Boolean::Constant(self.eq(other)))
@ -178,7 +178,7 @@ fn cond_equal_helper(first: &Address, second: &Address, cond: bool) -> Result<()
} }
} }
impl<F: Field + PrimeField> ConditionalEqGadget<F> for Address { impl<F: PrimeField> ConditionalEqGadget<F> for Address {
fn conditional_enforce_equal<CS: ConstraintSystem<F>>( fn conditional_enforce_equal<CS: ConstraintSystem<F>>(
&self, &self,
mut cs: CS, mut cs: CS,
@ -208,7 +208,7 @@ fn cond_select_helper(first: &Address, second: &Address, cond: bool) -> Address
if cond { first.clone() } else { second.clone() } if cond { first.clone() } else { second.clone() }
} }
impl<F: Field + PrimeField> CondSelectGadget<F> for Address { impl<F: PrimeField> CondSelectGadget<F> for Address {
fn conditionally_select<CS: ConstraintSystem<F>>( fn conditionally_select<CS: ConstraintSystem<F>>(
mut cs: CS, mut cs: CS,
cond: &Boolean, cond: &Boolean,

View File

@ -21,14 +21,14 @@ use leo_ast::{InputValue, Span};
use snarkvm_errors::gadgets::SynthesisError; use snarkvm_errors::gadgets::SynthesisError;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
r1cs::ConstraintSystem, r1cs::ConstraintSystem,
utilities::{alloc::AllocGadget, boolean::Boolean}, utilities::{alloc::AllocGadget, boolean::Boolean},
}, },
}; };
pub(crate) fn allocate_bool<F: Field + PrimeField, CS: ConstraintSystem<F>>( pub(crate) fn allocate_bool<F: PrimeField, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
name: &str, name: &str,
option: Option<bool>, option: Option<bool>,
@ -41,7 +41,7 @@ pub(crate) fn allocate_bool<F: Field + PrimeField, CS: ConstraintSystem<F>>(
.map_err(|_| BooleanError::missing_boolean(format!("{}: bool", name), span.to_owned())) .map_err(|_| BooleanError::missing_boolean(format!("{}: bool", name), span.to_owned()))
} }
pub(crate) fn bool_from_input<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub(crate) fn bool_from_input<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
name: &str, name: &str,
input_value: Option<InputValue>, input_value: Option<InputValue>,

View File

@ -21,7 +21,7 @@ use leo_ast::Span;
use snarkvm_errors::gadgets::SynthesisError; use snarkvm_errors::gadgets::SynthesisError;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
curves::{FieldGadget, FpGadget}, curves::{FieldGadget, FpGadget},
r1cs::ConstraintSystem, r1cs::ConstraintSystem,
@ -40,12 +40,12 @@ use snarkvm_models::{
use std::{borrow::Borrow, cmp::Ordering}; use std::{borrow::Borrow, cmp::Ordering};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub enum FieldType<F: Field + PrimeField> { pub enum FieldType<F: PrimeField> {
Constant(F), Constant(F),
Allocated(FpGadget<F>), Allocated(FpGadget<F>),
} }
impl<F: Field + PrimeField> FieldType<F> { impl<F: PrimeField> FieldType<F> {
pub fn get_value(&self) -> Option<F> { pub fn get_value(&self) -> Option<F> {
match self { match self {
FieldType::Constant(field) => Some(*field), FieldType::Constant(field) => Some(*field),
@ -186,7 +186,7 @@ impl<F: Field + PrimeField> FieldType<F> {
} }
} }
impl<F: Field + PrimeField> AllocGadget<String, F> for FieldType<F> { impl<F: PrimeField> AllocGadget<String, F> for FieldType<F> {
fn alloc<Fn: FnOnce() -> Result<T, SynthesisError>, T: Borrow<String>, CS: ConstraintSystem<F>>( fn alloc<Fn: FnOnce() -> Result<T, SynthesisError>, T: Borrow<String>, CS: ConstraintSystem<F>>(
cs: CS, cs: CS,
value_gen: Fn, value_gen: Fn,
@ -206,7 +206,7 @@ impl<F: Field + PrimeField> AllocGadget<String, F> for FieldType<F> {
} }
} }
impl<F: Field + PrimeField> PartialEq for FieldType<F> { impl<F: PrimeField> PartialEq for FieldType<F> {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
let self_value = self.get_value(); let self_value = self.get_value();
let other_value = other.get_value(); let other_value = other.get_value();
@ -215,9 +215,9 @@ impl<F: Field + PrimeField> PartialEq for FieldType<F> {
} }
} }
impl<F: Field + PrimeField> Eq for FieldType<F> {} impl<F: PrimeField> Eq for FieldType<F> {}
impl<F: Field + PrimeField> PartialOrd for FieldType<F> { impl<F: PrimeField> PartialOrd for FieldType<F> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> { fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
let self_value = self.get_value(); let self_value = self.get_value();
let other_value = other.get_value(); let other_value = other.get_value();
@ -226,7 +226,7 @@ impl<F: Field + PrimeField> PartialOrd for FieldType<F> {
} }
} }
impl<F: Field + PrimeField> EvaluateEqGadget<F> for FieldType<F> { impl<F: PrimeField> EvaluateEqGadget<F> for FieldType<F> {
fn evaluate_equal<CS: ConstraintSystem<F>>(&self, mut _cs: CS, other: &Self) -> Result<Boolean, SynthesisError> { fn evaluate_equal<CS: ConstraintSystem<F>>(&self, mut _cs: CS, other: &Self) -> Result<Boolean, SynthesisError> {
match (self, other) { match (self, other) {
(FieldType::Constant(first), FieldType::Constant(second)) => Ok(Boolean::constant(first.eq(second))), (FieldType::Constant(first), FieldType::Constant(second)) => Ok(Boolean::constant(first.eq(second))),
@ -242,9 +242,9 @@ impl<F: Field + PrimeField> EvaluateEqGadget<F> for FieldType<F> {
} }
} }
impl<F: Field + PrimeField> EqGadget<F> for FieldType<F> {} impl<F: PrimeField> EqGadget<F> for FieldType<F> {}
impl<F: Field + PrimeField> ConditionalEqGadget<F> for FieldType<F> { impl<F: PrimeField> ConditionalEqGadget<F> for FieldType<F> {
fn conditional_enforce_equal<CS: ConstraintSystem<F>>( fn conditional_enforce_equal<CS: ConstraintSystem<F>>(
&self, &self,
mut cs: CS, mut cs: CS,
@ -278,7 +278,7 @@ impl<F: Field + PrimeField> ConditionalEqGadget<F> for FieldType<F> {
} }
} }
impl<F: Field + PrimeField> CondSelectGadget<F> for FieldType<F> { impl<F: PrimeField> CondSelectGadget<F> for FieldType<F> {
fn conditionally_select<CS: ConstraintSystem<F>>( fn conditionally_select<CS: ConstraintSystem<F>>(
mut cs: CS, mut cs: CS,
cond: &Boolean, cond: &Boolean,
@ -301,7 +301,7 @@ impl<F: Field + PrimeField> CondSelectGadget<F> for FieldType<F> {
} }
} }
impl<F: Field + PrimeField> ToBitsGadget<F> for FieldType<F> { impl<F: PrimeField> ToBitsGadget<F> for FieldType<F> {
fn to_bits<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<Vec<Boolean>, SynthesisError> { fn to_bits<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<Vec<Boolean>, SynthesisError> {
let self_gadget = self.allocated(&mut cs)?; let self_gadget = self.allocated(&mut cs)?;
self_gadget.to_bits(cs) self_gadget.to_bits(cs)
@ -313,7 +313,7 @@ impl<F: Field + PrimeField> ToBitsGadget<F> for FieldType<F> {
} }
} }
impl<F: Field + PrimeField> ToBytesGadget<F> for FieldType<F> { impl<F: PrimeField> ToBytesGadget<F> for FieldType<F> {
fn to_bytes<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<Vec<UInt8>, SynthesisError> { fn to_bytes<CS: ConstraintSystem<F>>(&self, mut cs: CS) -> Result<Vec<UInt8>, SynthesisError> {
let self_gadget = self.allocated(&mut cs)?; let self_gadget = self.allocated(&mut cs)?;
self_gadget.to_bytes(cs) self_gadget.to_bytes(cs)
@ -325,7 +325,7 @@ impl<F: Field + PrimeField> ToBytesGadget<F> for FieldType<F> {
} }
} }
impl<F: Field + PrimeField> std::fmt::Display for FieldType<F> { impl<F: PrimeField> std::fmt::Display for FieldType<F> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{:?}", self.get_value().ok_or(std::fmt::Error)) write!(f, "{:?}", self.get_value().ok_or(std::fmt::Error))
} }

View File

@ -21,11 +21,11 @@ use leo_ast::{InputValue, Span};
use snarkvm_errors::gadgets::SynthesisError; use snarkvm_errors::gadgets::SynthesisError;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{r1cs::ConstraintSystem, utilities::alloc::AllocGadget}, gadgets::{r1cs::ConstraintSystem, utilities::alloc::AllocGadget},
}; };
pub(crate) fn allocate_field<F: Field + PrimeField, CS: ConstraintSystem<F>>( pub(crate) fn allocate_field<F: PrimeField, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
name: &str, name: &str,
option: Option<String>, option: Option<String>,
@ -38,7 +38,7 @@ pub(crate) fn allocate_field<F: Field + PrimeField, CS: ConstraintSystem<F>>(
.map_err(|_| FieldError::missing_field(format!("{}: field", name), span.to_owned())) .map_err(|_| FieldError::missing_field(format!("{}: field", name), span.to_owned()))
} }
pub(crate) fn field_from_input<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub(crate) fn field_from_input<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
name: &str, name: &str,
input_value: Option<InputValue>, input_value: Option<InputValue>,

View File

@ -21,12 +21,9 @@ use leo_asg::{GroupValue, Span};
use leo_ast::InputValue; use leo_ast::InputValue;
use snarkvm_errors::gadgets::SynthesisError; use snarkvm_errors::gadgets::SynthesisError;
use snarkvm_models::{ use snarkvm_models::{curves::PrimeField, gadgets::r1cs::ConstraintSystem};
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
pub(crate) fn allocate_group<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub(crate) fn allocate_group<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
name: &str, name: &str,
option: Option<GroupValue>, option: Option<GroupValue>,
@ -39,7 +36,7 @@ pub(crate) fn allocate_group<F: Field + PrimeField, G: GroupType<F>, CS: Constra
.map_err(|_| GroupError::missing_group(format!("{}: group", name), span.to_owned())) .map_err(|_| GroupError::missing_group(format!("{}: group", name), span.to_owned()))
} }
pub(crate) fn group_from_input<F: Field + PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>( pub(crate) fn group_from_input<F: PrimeField, G: GroupType<F>, CS: ConstraintSystem<F>>(
cs: &mut CS, cs: &mut CS,
name: &str, name: &str,
input_value: Option<InputValue>, input_value: Option<InputValue>,

View File

@ -298,7 +298,7 @@ impl Integer {
Self::allocate_type(cs, integer_type, name, option, span) Self::allocate_type(cs, integer_type, name, option, span)
} }
pub fn negate<F: Field + PrimeField, CS: ConstraintSystem<F>>( pub fn negate<F: PrimeField, CS: ConstraintSystem<F>>(
self, self,
cs: &mut CS, cs: &mut CS,
span: &Span, span: &Span,
@ -312,7 +312,7 @@ impl Integer {
result.ok_or_else(|| IntegerError::negate_operation(span.to_owned())) result.ok_or_else(|| IntegerError::negate_operation(span.to_owned()))
} }
pub fn add<F: Field + PrimeField, CS: ConstraintSystem<F>>( pub fn add<F: PrimeField, CS: ConstraintSystem<F>>(
self, self,
cs: &mut CS, cs: &mut CS,
other: Self, other: Self,
@ -328,7 +328,7 @@ impl Integer {
result.ok_or_else(|| IntegerError::binary_operation("+".to_string(), span.to_owned())) result.ok_or_else(|| IntegerError::binary_operation("+".to_string(), span.to_owned()))
} }
pub fn sub<F: Field + PrimeField, CS: ConstraintSystem<F>>( pub fn sub<F: PrimeField, CS: ConstraintSystem<F>>(
self, self,
cs: &mut CS, cs: &mut CS,
other: Self, other: Self,
@ -344,7 +344,7 @@ impl Integer {
result.ok_or_else(|| IntegerError::binary_operation("-".to_string(), span.to_owned())) result.ok_or_else(|| IntegerError::binary_operation("-".to_string(), span.to_owned()))
} }
pub fn mul<F: Field + PrimeField, CS: ConstraintSystem<F>>( pub fn mul<F: PrimeField, CS: ConstraintSystem<F>>(
self, self,
cs: &mut CS, cs: &mut CS,
other: Self, other: Self,
@ -360,7 +360,7 @@ impl Integer {
result.ok_or_else(|| IntegerError::binary_operation("*".to_string(), span.to_owned())) result.ok_or_else(|| IntegerError::binary_operation("*".to_string(), span.to_owned()))
} }
pub fn div<F: Field + PrimeField, CS: ConstraintSystem<F>>( pub fn div<F: PrimeField, CS: ConstraintSystem<F>>(
self, self,
cs: &mut CS, cs: &mut CS,
other: Self, other: Self,
@ -376,7 +376,7 @@ impl Integer {
result.ok_or_else(|| IntegerError::binary_operation("÷".to_string(), span.to_owned())) result.ok_or_else(|| IntegerError::binary_operation("÷".to_string(), span.to_owned()))
} }
pub fn pow<F: Field + PrimeField, CS: ConstraintSystem<F>>( pub fn pow<F: PrimeField, CS: ConstraintSystem<F>>(
self, self,
cs: &mut CS, cs: &mut CS,
other: Self, other: Self,
@ -393,7 +393,7 @@ impl Integer {
} }
} }
impl<F: Field + PrimeField> EvaluateEqGadget<F> for Integer { impl<F: PrimeField> EvaluateEqGadget<F> for Integer {
fn evaluate_equal<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Boolean, SynthesisError> { fn evaluate_equal<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Boolean, SynthesisError> {
let a = self; let a = self;
let b = other; let b = other;
@ -404,7 +404,7 @@ impl<F: Field + PrimeField> EvaluateEqGadget<F> for Integer {
} }
} }
impl<F: Field + PrimeField> EvaluateLtGadget<F> for Integer { impl<F: PrimeField> EvaluateLtGadget<F> for Integer {
fn less_than<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Boolean, SynthesisError> { fn less_than<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Boolean, SynthesisError> {
let a = self; let a = self;
let b = other; let b = other;
@ -414,11 +414,11 @@ impl<F: Field + PrimeField> EvaluateLtGadget<F> for Integer {
} }
} }
impl<F: Field + PrimeField> ComparatorGadget<F> for Integer {} impl<F: PrimeField> ComparatorGadget<F> for Integer {}
impl<F: Field + PrimeField> EqGadget<F> for Integer {} impl<F: PrimeField> EqGadget<F> for Integer {}
impl<F: Field + PrimeField> ConditionalEqGadget<F> for Integer { impl<F: PrimeField> ConditionalEqGadget<F> for Integer {
fn conditional_enforce_equal<CS: ConstraintSystem<F>>( fn conditional_enforce_equal<CS: ConstraintSystem<F>>(
&self, &self,
cs: CS, cs: CS,
@ -438,7 +438,7 @@ impl<F: Field + PrimeField> ConditionalEqGadget<F> for Integer {
} }
} }
impl<F: Field + PrimeField> CondSelectGadget<F> for Integer { impl<F: PrimeField> CondSelectGadget<F> for Integer {
fn conditionally_select<CS: ConstraintSystem<F>>( fn conditionally_select<CS: ConstraintSystem<F>>(
cs: CS, cs: CS,
cond: &Boolean, cond: &Boolean,

View File

@ -21,7 +21,7 @@ use leo_asg::{CircuitBody, Identifier, Span, Type};
use snarkvm_errors::gadgets::SynthesisError; use snarkvm_errors::gadgets::SynthesisError;
use snarkvm_models::{ use snarkvm_models::{
curves::{Field, PrimeField}, curves::PrimeField,
gadgets::{ gadgets::{
r1cs::ConstraintSystem, r1cs::ConstraintSystem,
utilities::{boolean::Boolean, eq::ConditionalEqGadget, select::CondSelectGadget}, utilities::{boolean::Boolean, eq::ConditionalEqGadget, select::CondSelectGadget},
@ -30,10 +30,10 @@ use snarkvm_models::{
use std::{fmt, sync::Arc}; use std::{fmt, sync::Arc};
#[derive(Clone, PartialEq, Eq)] #[derive(Clone, PartialEq, Eq)]
pub struct ConstrainedCircuitMember<F: Field + PrimeField, G: GroupType<F>>(pub Identifier, pub ConstrainedValue<F, G>); pub struct ConstrainedCircuitMember<F: PrimeField, G: GroupType<F>>(pub Identifier, pub ConstrainedValue<F, G>);
#[derive(Clone, PartialEq, Eq)] #[derive(Clone, PartialEq, Eq)]
pub enum ConstrainedValue<F: Field + PrimeField, G: GroupType<F>> { pub enum ConstrainedValue<F: PrimeField, G: GroupType<F>> {
// Data types // Data types
Address(Address), Address(Address),
Boolean(Boolean), Boolean(Boolean),
@ -51,7 +51,7 @@ pub enum ConstrainedValue<F: Field + PrimeField, G: GroupType<F>> {
CircuitExpression(Arc<CircuitBody>, Vec<ConstrainedCircuitMember<F, G>>), CircuitExpression(Arc<CircuitBody>, Vec<ConstrainedCircuitMember<F, G>>),
} }
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedValue<F, G> { impl<F: PrimeField, G: GroupType<F>> ConstrainedValue<F, G> {
pub(crate) fn to_type(&self, span: &Span) -> Result<Type, ValueError> { pub(crate) fn to_type(&self, span: &Span) -> Result<Type, ValueError> {
Ok(match self { Ok(match self {
// Data types // Data types
@ -82,7 +82,7 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedValue<F, G> {
} }
} }
impl<F: Field + PrimeField, G: GroupType<F>> fmt::Display for ConstrainedValue<F, G> { impl<F: PrimeField, G: GroupType<F>> fmt::Display for ConstrainedValue<F, G> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self { match *self {
// Data types // Data types
@ -129,13 +129,13 @@ impl<F: Field + PrimeField, G: GroupType<F>> fmt::Display for ConstrainedValue<F
} }
} }
impl<F: Field + PrimeField, G: GroupType<F>> fmt::Debug for ConstrainedValue<F, G> { impl<F: PrimeField, G: GroupType<F>> fmt::Debug for ConstrainedValue<F, G> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self) write!(f, "{}", self)
} }
} }
impl<F: Field + PrimeField, G: GroupType<F>> ConditionalEqGadget<F> for ConstrainedValue<F, G> { impl<F: PrimeField, G: GroupType<F>> ConditionalEqGadget<F> for ConstrainedValue<F, G> {
fn conditional_enforce_equal<CS: ConstraintSystem<F>>( fn conditional_enforce_equal<CS: ConstraintSystem<F>>(
&self, &self,
mut cs: CS, mut cs: CS,
@ -179,7 +179,7 @@ impl<F: Field + PrimeField, G: GroupType<F>> ConditionalEqGadget<F> for Constrai
} }
} }
impl<F: Field + PrimeField, G: GroupType<F>> CondSelectGadget<F> for ConstrainedValue<F, G> { impl<F: PrimeField, G: GroupType<F>> CondSelectGadget<F> for ConstrainedValue<F, G> {
fn conditionally_select<CS: ConstraintSystem<F>>( fn conditionally_select<CS: ConstraintSystem<F>>(
mut cs: CS, mut cs: CS,
cond: &Boolean, cond: &Boolean,
@ -256,7 +256,7 @@ impl<F: Field + PrimeField, G: GroupType<F>> CondSelectGadget<F> for Constrained
} }
} }
impl<F: Field + PrimeField, G: GroupType<F>> CondSelectGadget<F> for ConstrainedCircuitMember<F, G> { impl<F: PrimeField, G: GroupType<F>> CondSelectGadget<F> for ConstrainedCircuitMember<F, G> {
fn conditionally_select<CS: ConstraintSystem<F>>( fn conditionally_select<CS: ConstraintSystem<F>>(
cs: CS, cs: CS,
cond: &Boolean, cond: &Boolean,

View File

@ -36,7 +36,7 @@ where
// Implement unsigned integers // Implement unsigned integers
macro_rules! add_uint_impl { macro_rules! add_uint_impl {
($($gadget: ident),*) => ($( ($($gadget: ident),*) => ($(
impl<F: Field + PrimeField> Add<F> for $gadget { impl<F: PrimeField> Add<F> for $gadget {
type ErrorType = SynthesisError; type ErrorType = SynthesisError;
fn add<CS: ConstraintSystem<F>>( fn add<CS: ConstraintSystem<F>>(

View File

@ -53,7 +53,7 @@ where
macro_rules! uint_cmp_impl { macro_rules! uint_cmp_impl {
($($gadget: ident),*) => ($( ($($gadget: ident),*) => ($(
/* Bitwise less than comparison of two unsigned integers */ /* Bitwise less than comparison of two unsigned integers */
impl<F: Field + PrimeField> EvaluateLtGadget<F> for $gadget { impl<F: PrimeField> EvaluateLtGadget<F> for $gadget {
fn less_than<CS: ConstraintSystem<F>>(&self, mut cs: CS, other: &Self) -> Result<Boolean, SynthesisError> { fn less_than<CS: ConstraintSystem<F>>(&self, mut cs: CS, other: &Self) -> Result<Boolean, SynthesisError> {
let mut result = Boolean::constant(true); let mut result = Boolean::constant(true);
@ -91,7 +91,7 @@ macro_rules! uint_cmp_impl {
} }
/* Bitwise comparison of two unsigned integers */ /* Bitwise comparison of two unsigned integers */
impl<F: Field + PrimeField> ComparatorGadget<F> for $gadget {} impl<F: PrimeField> ComparatorGadget<F> for $gadget {}
)*) )*)
} }

View File

@ -51,7 +51,7 @@ impl<F: Field> RippleCarryAdder<F> for Vec<Boolean> {
macro_rules! rpc_impl { macro_rules! rpc_impl {
($($gadget: ident)*) => ($( ($($gadget: ident)*) => ($(
impl<F: Field + PrimeField> RippleCarryAdder<F> for $gadget { impl<F: PrimeField> RippleCarryAdder<F> for $gadget {
fn add_bits<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Vec<Boolean>, SynthesisError> { fn add_bits<CS: ConstraintSystem<F>>(&self, cs: CS, other: &Self) -> Result<Vec<Boolean>, SynthesisError> {
self.bits.add_bits(cs, &other.bits) self.bits.add_bits(cs, &other.bits)
} }