Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
multi_scalar_mul.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
14
15namespace acir_format {
16
17using namespace bb;
18
19template <typename Builder>
21 const MultiScalarMul& input,
22 bool has_valid_witness_assignments)
23{
24 using cycle_group_ct = stdlib::cycle_group<Builder>;
25 using cycle_scalar_ct = typename stdlib::cycle_group<Builder>::cycle_scalar;
27
30
31 for (size_t i = 0; i < input.points.size(); i += 3) {
32 // Instantiate the input point/variable base as `cycle_group_ct`
33 cycle_group_ct input_point = to_grumpkin_point(input.points[i],
34 input.points[i + 1],
35 input.points[i + 2],
36 has_valid_witness_assignments,
37 input.predicate,
38 builder);
39 // Reconstruct the scalar from the low and high limbs
40 field_ct scalar_low_as_field = to_field_ct(input.scalars[2 * (i / 3)], builder);
41 field_ct scalar_high_as_field = to_field_ct(input.scalars[2 * (i / 3) + 1], builder);
42 cycle_scalar_ct scalar(scalar_low_as_field, scalar_high_as_field);
43
44 // Avoid mixing constant/witness coordinates because of issue
45 // https://github.com/AztecProtocol/aztec-packages/issues/17514
46 if (input_point.x.is_constant() != input_point.y.is_constant()) {
47 if (input_point.x.is_constant()) {
48 input_point.x.convert_constant_to_fixed_witness(&builder);
49 } else if (input_point.y.is_constant()) {
50 input_point.y.convert_constant_to_fixed_witness(&builder);
51 }
52 }
53 // Add the point and scalar to the vectors
54 points.push_back(input_point);
55 scalars.push_back(scalar);
56 }
57 // Call batch_mul to multiply the points and scalars and sum the results
58 auto output_point = cycle_group_ct::batch_mul(points, scalars).get_standard_form();
59
60 // Add the constraints and handle constant values
61 if (output_point.is_point_at_infinity().is_constant()) {
62 builder.fix_witness(input.out_point_is_infinite, output_point.is_point_at_infinity().get_value());
63 } else {
64 builder.assert_equal(output_point.is_point_at_infinity().get_normalized_witness_index(),
66 }
67 if (output_point.x.is_constant()) {
68 builder.fix_witness(input.out_point_x, output_point.x.get_value());
69 } else {
70 builder.assert_equal(output_point.x.get_witness_index(), input.out_point_x);
71 }
72 if (output_point.y.is_constant()) {
73 builder.fix_witness(input.out_point_y, output_point.y.get_value());
74 } else {
75 builder.assert_equal(output_point.y.get_witness_index(), input.out_point_y);
76 }
77}
78
80 const MultiScalarMul& input,
81 bool has_valid_witness_assignments);
83 const MultiScalarMul& input,
84 bool has_valid_witness_assignments);
85
86} // namespace acir_format
cycle_group represents a group Element of the proving system's embedded curve, i.e....
Represents a member of the Grumpkin curve scalar field (i.e. BN254 base field).
AluTraceBuilder builder
Definition alu.test.cpp:123
template void create_multi_scalar_mul_constraint< MegaCircuitBuilder >(MegaCircuitBuilder &builder, const MultiScalarMul &input, bool has_valid_witness_assignments)
template void create_multi_scalar_mul_constraint< UltraCircuitBuilder >(UltraCircuitBuilder &builder, const MultiScalarMul &input, bool has_valid_witness_assignments)
void create_multi_scalar_mul_constraint(Builder &builder, const MultiScalarMul &input, bool has_valid_witness_assignments)
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.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< WitnessOrConstant< bb::fr > > scalars
WitnessOrConstant< bb::fr > predicate
std::vector< WitnessOrConstant< bb::fr > > points