Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
witness_constant.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
9
10namespace acir_format {
11
12using namespace bb;
13using namespace bb::stdlib;
14
32template <typename Builder, typename FF>
34 const WitnessOrConstant<FF>& input_y,
35 const WitnessOrConstant<FF>& input_infinite,
36 bool has_valid_witness_assignments,
37 const WitnessOrConstant<FF>& predicate,
39{
42 auto point_x = to_field_ct(input_x, builder);
43 auto point_y = to_field_ct(input_y, builder);
44 auto infinite = bool_ct(to_field_ct(input_infinite, builder));
45
46 BB_ASSERT_EQ(input_x.is_constant, input_y.is_constant, "to_grumpkin_point: Inconsistent constancy of coordinates");
47 bool constant_coordinates = input_x.is_constant && input_y.is_constant;
48
49 // In a witness is not provided, or the relevant predicate is constant false, we ensure the coordinates correspond
50 // to a valid point to avoid erroneous failures during circuit construction. We only do this if the coordinates are
51 // non-constant since otherwise no variable indices exist.
52 bool constant_false_predicate = predicate.is_constant && predicate.value == FF(0);
53 if ((!has_valid_witness_assignments || constant_false_predicate) && !constant_coordinates) {
55 builder.set_variable(input_x.index, one.x);
56 builder.set_variable(input_y.index, one.y);
57 }
58
59 // If the predicate is a non-constant witness, conditionally replace coordinates with a valid point.
60 // Note: this must be done before constructing the cycle_group to avoid triggering on_curve assertions
61 if (!predicate.is_constant) {
62 bool_ct predicate_witness = bool_ct::from_witness_index_unsafe(&builder, predicate.index);
63 auto generator = bb::grumpkin::g1::affine_one;
64 point_x = field_ct::conditional_assign(predicate_witness, point_x, generator.x).normalize();
65 point_y = field_ct::conditional_assign(predicate_witness, point_y, generator.y).normalize();
66 bool_ct generator_is_infinity = bool_ct(&builder, generator.is_point_at_infinity());
67 infinite = bool_ct::conditional_assign(predicate_witness, infinite, generator_is_infinity).normalize();
68 }
69
70 cycle_group<Builder> input_point(point_x, point_y, infinite);
71 return input_point;
72}
73
75 const WitnessOrConstant<fr>& input_y,
76 const WitnessOrConstant<fr>& input_infinite,
77 bool has_valid_witness_assignments,
78 const WitnessOrConstant<fr>& predicate,
81 const WitnessOrConstant<fr>& input_y,
82 const WitnessOrConstant<fr>& input_infinite,
83 bool has_valid_witness_assignments,
84 const WitnessOrConstant<fr>& predicate,
86
87} // namespace acir_format
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:88
static constexpr affine_element affine_one
Definition group.hpp:48
Implements boolean logic in-circuit.
Definition bool.hpp:59
bool_t normalize() const
A bool_t element is normalized if witness_inverted == false. For a given *this, output its normalized...
Definition bool.cpp:505
static bool_t conditional_assign(const bool_t< Builder > &predicate, const bool_t &lhs, const bool_t &rhs)
Implements the ternary operator - if predicate == true then return lhs, else return rhs.
Definition bool.cpp:456
static bool_t from_witness_index_unsafe(Builder *ctx, uint32_t witness_index)
Create a bool_t from a witness index that is known to contain a constrained bool value.
Definition bool.cpp:96
cycle_group represents a group Element of the proving system's embedded curve, i.e....
static field_t conditional_assign(const bool_t< Builder > &predicate, const field_t &lhs, const field_t &rhs)
If predicate == true then return lhs, else return rhs.
Definition field.cpp:886
field_t normalize() const
Return a new element, where the in-circuit witness contains the actual represented value (multiplicat...
Definition field.cpp:637
AluTraceBuilder builder
Definition alu.test.cpp:123
stdlib::bool_t< Builder > bool_ct
bb::stdlib::field_t< Builder > to_field_ct(const WitnessOrConstant< FF > &input, Builder &builder)
bb::stdlib::cycle_group< Builder > to_grumpkin_point(const WitnessOrConstant< FF > &input_x, const WitnessOrConstant< FF > &input_y, const WitnessOrConstant< FF > &input_infinite, bool has_valid_witness_assignments, const WitnessOrConstant< FF > &predicate, Builder &builder)
Convert inputs representing a Grumpkin point into a cycle_group element.
Entry point for Barretenberg command-line interface.
typename Flavor::FF FF