Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ec_operations.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Completed, auditors: [Federico], date: 2025-11-03 }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#include "ec_operations.hpp"
13
14namespace acir_format {
15
38template <typename Builder> void create_ec_add_constraint(Builder& builder, const EcAdd& input)
39{
40 using cycle_group_ct = bb::stdlib::cycle_group<Builder>;
42 using bool_ct = bb::stdlib::bool_t<Builder>;
43
44 // Step 1.
45 bool_ct predicate = bool_ct(to_field_ct(input.predicate, builder));
46
47 field_ct input_result_x = field_ct::from_witness_index(&builder, input.result_x);
48 field_ct input_result_y = field_ct::from_witness_index(&builder, input.result_y);
49 bool_ct input_result_infinite = bool_ct(field_ct::from_witness_index(&builder, input.result_infinite));
50
51 if (builder.is_write_vk_mode()) {
52 builder.set_variable(input_result_x.get_witness_index(), bb::grumpkin::g1::affine_one.x);
53 builder.set_variable(input_result_y.get_witness_index(), bb::grumpkin::g1::affine_one.y);
54 builder.set_variable(input_result_infinite.get_witness_index(), bb::fr(0));
55 }
56
57 cycle_group_ct input1_point =
58 to_grumpkin_point(input.input1_x, input.input1_y, input.input1_infinite, predicate, builder);
59 cycle_group_ct input2_point =
60 to_grumpkin_point(input.input2_x, input.input2_y, input.input2_infinite, predicate, builder);
61 // Note that input_result is computed by Noir and passed to bb via ACIR. Hence, it is always a valid point on
62 // Grumpkin.
63 cycle_group_ct input_result(input_result_x, input_result_y, input_result_infinite, /*assert_on_curve=*/false);
64
65 // Step 2.
66 cycle_group_ct result = input1_point + input2_point;
67
68 // The assert_equal method standardizes both points before comparing, so if either of them is the point at
69 // infinity, the coordinates will be assigned to be (0,0). This is OK as long as Noir developers do not use the
70 // coordinates of a point at infinity (otherwise input_result might be the point at infinity different from (0,
71 // 0, true), and the fact that assert_equal passes doesn't imply anything for the original coordinates of
72 // input_result).
73 cycle_group_ct to_be_asserted_equal = cycle_group_ct::conditional_assign(predicate, input_result, result);
74 result.assert_equal(to_be_asserted_equal);
75}
76
79
80} // namespace acir_format
static constexpr affine_element affine_one
Definition group.hpp:48
Implements boolean logic in-circuit.
Definition bool.hpp:59
cycle_group represents a group Element of the proving system's embedded curve, i.e....
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:62
uint32_t get_witness_index() const
Get the witness index of the current field element.
Definition field.hpp:506
AluTraceBuilder builder
Definition alu.test.cpp:124
template void create_ec_add_constraint< bb::UltraCircuitBuilder >(bb::UltraCircuitBuilder &builder, const EcAdd &input)
template void create_ec_add_constraint< bb::MegaCircuitBuilder >(bb::MegaCircuitBuilder &builder, const EcAdd &input)
bb::stdlib::cycle_group< Builder > to_grumpkin_point(const WitnessOrConstant< typename Builder::FF > &input_x, const WitnessOrConstant< typename Builder::FF > &input_y, const WitnessOrConstant< typename Builder::FF > &input_infinite, const bb::stdlib::bool_t< Builder > &predicate, Builder &builder)
Convert inputs representing a Grumpkin point into a cycle_group element.
void create_ec_add_constraint(Builder &builder, const EcAdd &input)
Create constraints for addition of two points on the Grumpkin curve.
bb::stdlib::field_t< Builder > to_field_ct(const WitnessOrConstant< typename Builder::FF > &input, Builder &builder)
Constraints for addition of two points on the Grumpkin curve.
WitnessOrConstant< bb::fr > input1_y
WitnessOrConstant< bb::fr > input1_infinite
WitnessOrConstant< bb::fr > input2_y
WitnessOrConstant< bb::fr > input2_infinite
WitnessOrConstant< bb::fr > input1_x
WitnessOrConstant< bb::fr > input2_x
WitnessOrConstant< bb::fr > predicate