Skip to main content

ConstraintSystem

Struct ConstraintSystem 

Source
pub struct ConstraintSystem<F: Field> {
    pub assignments: Assignments<F>,
    pub cache_map: Rc<RefCell<BTreeMap<TypeId, Box<dyn Any>>>>,
    /* private fields */
}
Expand description

A GR1CS ConstraintSystem. Enforces constraints of the form

L_i(⟨M_{i,1}, z⟩ , ⟨M_{i,2}, z⟩ , ..., ⟨M_{i,t_i}, z⟩) = 0

More Information: https://eprint.iacr.org/2024/1245

Fields§

§assignments: Assignments<F>

Assignments to the input, witness, and lc variables. This is empty if self.mode == SynthesisMode::Setup.

§cache_map: Rc<RefCell<BTreeMap<TypeId, Box<dyn Any>>>>

Map for gadgets to cache computation results.

Implementations§

Source§

impl<F: Field> ConstraintSystem<F>

Source

pub fn new() -> Self

Create a new and empty ConstraintSystem<F>. Note that by default, the constraint system is registered with the R1CS predicate.

Source

pub fn new_ref() -> ConstraintSystemRef<F>

Create a new ConstraintSystemRef<F>.

Source

pub fn get_all_predicates_num_constraints(&self) -> IndexMap<Label, usize>

Returns a mapping from predicate label to number of constraints for that predicate

Source

pub fn get_predicate_num_constraints( &self, predicate_label: &str, ) -> Option<usize>

Returns the number of constraints for a given predicate

Source

pub fn get_all_predicate_arities(&self) -> IndexMap<Label, usize>

Returns a mapping from predicate label to arity for that predicate

Source

pub fn get_predicate_arity(&self, predicate_label: &str) -> Option<usize>

Returns the type of the predicate with the given label

Source

pub fn get_all_predicate_types(&self) -> BTreeMap<Label, Predicate<F>>

Returns a mapping from predicate labels to their types

Source

pub fn get_predicate_type(&self, predicate_label: &str) -> Option<Predicate<F>>

Returns the type of the predicate with the given label

Source

pub fn instance_assignment(&self) -> Result<&[F]>

Returns the assignment to the public input variables of the constraint

Source

pub fn witness_assignment(&self) -> Result<&[F]>

Returns the assignment to the private input variables of the constraint

Source

pub fn num_constraints(&self) -> usize

Returns the number of constraints which is the sum of the number of constraints in each predicate.

Source

pub fn num_instance_variables(&self) -> usize

Returns the number of instance variables.

Source

pub fn num_witness_variables(&self) -> usize

Returns the number of witness variables.

Source

pub fn num_variables(&self) -> usize

Returns the number of witness variables.

Source

pub fn num_predicates(&self) -> usize

Returns the number of predicates in the constraint system

Source

pub fn enforce_constraint( &mut self, predicate_label: &str, lcs: impl IntoIterator<Item = Box<dyn FnOnce() -> LinearCombination<F>>, IntoIter: ExactSizeIterator>, ) -> Result<()>

Enforce a constraint in the constraint system. It takes a predicate name and enforces a vector of linear combinations of the length of the arity of the predicate enforces the constraint.

Source

pub fn enforce_constraint_arity_2( &mut self, predicate_label: &str, a: impl FnOnce() -> LinearCombination<F>, b: impl FnOnce() -> LinearCombination<F>, ) -> Result<()>

Enforce a constraint for a predicate with arity 2.

Source

pub fn enforce_constraint_arity_3( &mut self, predicate_label: &str, a: impl FnOnce() -> LinearCombination<F>, b: impl FnOnce() -> LinearCombination<F>, c: impl FnOnce() -> LinearCombination<F>, ) -> Result<()>

Enforce a constraint for a predicate with arity 3.

Source

pub fn enforce_constraint_arity_4( &mut self, predicate_label: &str, a: impl FnOnce() -> LinearCombination<F>, b: impl FnOnce() -> LinearCombination<F>, c: impl FnOnce() -> LinearCombination<F>, d: impl FnOnce() -> LinearCombination<F>, ) -> Result<()>

Enforce a constraint for a predicate with arity 4.

Source

pub fn enforce_constraint_arity_5( &mut self, predicate_label: &str, a: impl FnOnce() -> LinearCombination<F>, b: impl FnOnce() -> LinearCombination<F>, c: impl FnOnce() -> LinearCombination<F>, d: impl FnOnce() -> LinearCombination<F>, e: impl FnOnce() -> LinearCombination<F>, ) -> Result<()>

Enforce a constraint for a predicate with arity 5.

Source

pub fn enforce_r1cs_constraint( &mut self, a: impl FnOnce() -> LinearCombination<F>, b: impl FnOnce() -> LinearCombination<F>, c: impl FnOnce() -> LinearCombination<F>, ) -> Result<()>

Enforce a constraint in the constraint system. It takes a predicate name and enforces a vector of linear combinations of the length of the arity of the predicate enforces the constraint.

Source

pub fn enforce_sr1cs_constraint( &mut self, a: impl FnOnce() -> LinearCombination<F>, b: impl FnOnce() -> LinearCombination<F>, ) -> Result<()>

Enforce a constraint in the constraint system. It takes a predicate name and enforces a vector of linear combinations of the length of the arity of the predicate enforces the constraint.

Source

pub fn new_lc( &mut self, lc: impl FnOnce() -> LinearCombination<F>, ) -> Result<Variable>

Adds a new linear combination to the constraint system.

Source

pub fn set_mode(&mut self, mode: SynthesisMode)

Set self.mode to mode.

Source

pub fn is_in_setup_mode(&self) -> bool

Check whether self.mode == SynthesisMode::Setup. Returns true if

  1. There is an underlying ConstraintSystem, and
  2. It is in setup mode.
Source

pub fn optimization_goal(&self) -> OptimizationGoal

Check whether this constraint system aims to optimize weight, number of constraints, or neither.

Source

pub fn set_optimization_goal(&mut self, goal: OptimizationGoal)

Specify whether this constraint system should aim to optimize weight, number of constraints, or neither.

Source

pub fn should_construct_matrices(&self) -> bool

Check whether or not self will construct matrices.

Source

pub fn should_generate_lc_assignments(&self) -> bool

Check whether or not self will construct matrices.

Source

pub fn new_input_variable<Func>(&mut self, f: Func) -> Result<Variable>
where Func: FnOnce() -> Result<F>,

Obtain a variable representing a new public instance input.

Source

pub fn new_witness_variable<Func>(&mut self, f: Func) -> Result<Variable>
where Func: FnOnce() -> Result<F>,

Obtain a variable representing a new private witness input.

Source

pub fn register_predicate( &mut self, predicate_label: &str, predicate: PredicateConstraintSystem<F>, ) -> Result<()>

Register a predicate in the constraint system with a given label.

Source

pub fn remove_predicate(&mut self, predicate_label: &str)

Remove the predicate with the given label from the constraint system.

Source

pub fn has_predicate(&self, predicate_label: &str) -> bool

check if there is a predicate with the given label

Source

pub fn assigned_value(&self, v: Variable) -> Option<F>

Obtain the assignment corresponding to the Variable v.

Source

pub fn is_satisfied(&self) -> Result<bool>

If self is satisfied, outputs Ok(true). If self is unsatisfied, outputs Ok(false). If self.is_in_setup_mode() or if self == None, outputs Err(()).

Source

pub fn which_is_unsatisfied(&self) -> Result<Option<String>>

If self is satisfied, outputs Ok(None). If self is unsatisfied, outputs Some(s,i), where s is the label of the unsatisfied prediacate and i is the index of the first unsatisfied constraint in that predicate. If self.is_in_setup_mode() or self == None, outputs Err(()).

Source

pub fn finalize(&mut self)

Finalize the constraint system (either by outlining or inlining, if an optimization goal is set).

Source

pub fn inline_all_lcs(&mut self)

Naively inlines symbolic linear combinations into the linear combinations that use them.

Useful for standard pairing-based SNARKs where addition gates are cheap. For example, in the SNARKs such as [Groth16] and [Groth-Maller17], addition gates do not contribute to the size of the multi-scalar multiplication, which is the dominating cost.

Source

pub fn to_matrices(&self) -> Result<BTreeMap<Label, Vec<Matrix<F>>>>

Get the matrices corresponding to the predicates.and the corresponding set of matrices

Source

pub fn get_lc(&self, var: Variable) -> LinearCombination<F>

Get the linear combination corresponding to the given lc_index.

Source

pub fn perform_instance_outlining( &mut self, outliner: InstanceOutliner<F>, ) -> Result<()>

Outlines the instances in the constraint system.

This function creates a new witness variable for each instance variable and uses these witness variables in the constraints instead of instance variables. This technique is useful for verifier succinctness in some SNARKs like Garuda, Pari and PolyMath. After the function call, instances are only used in the C matrix of r1cs

Trait Implementations§

Source§

impl<F: Clone + Field> Clone for ConstraintSystem<F>

Source§

fn clone(&self) -> ConstraintSystem<F>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<F: Debug + Field> Debug for ConstraintSystem<F>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<F: Field> Default for ConstraintSystem<F>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<F> Freeze for ConstraintSystem<F>

§

impl<F> !RefUnwindSafe for ConstraintSystem<F>

§

impl<F> !Send for ConstraintSystem<F>

§

impl<F> !Sync for ConstraintSystem<F>

§

impl<F> Unpin for ConstraintSystem<F>
where F: Unpin,

§

impl<F> UnsafeUnpin for ConstraintSystem<F>

§

impl<F> !UnwindSafe for ConstraintSystem<F>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more