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(
34 input.points[i], input.points[i + 1], input.points[i + 2], has_valid_witness_assignments, builder);
35
36 // Reconstruct the scalar from the low and high limbs
37 field_ct scalar_low_as_field = to_field_ct(input.scalars[2 * (i / 3)], builder);
38 field_ct scalar_high_as_field = to_field_ct(input.scalars[2 * (i / 3) + 1], builder);
39 cycle_scalar_ct scalar(scalar_low_as_field, scalar_high_as_field);
40
41 // Add the point and scalar to the vectors
42 points.push_back(input_point);
43 scalars.push_back(scalar);
44 }
45 // Call batch_mul to multiply the points and scalars and sum the results
46 auto output_point = cycle_group_ct::batch_mul(points, scalars).get_standard_form();
47
48 // Add the constraints and handle constant values
49 if (output_point.is_point_at_infinity().is_constant()) {
50 builder.fix_witness(input.out_point_is_infinite, output_point.is_point_at_infinity().get_value());
51 } else {
52 builder.assert_equal(output_point.is_point_at_infinity().witness_index, input.out_point_is_infinite);
53 }
54 if (output_point.x.is_constant()) {
55 builder.fix_witness(input.out_point_x, output_point.x.get_value());
56 } else {
57 builder.assert_equal(output_point.x.get_witness_index(), input.out_point_x);
58 }
59 if (output_point.y.is_constant()) {
60 builder.fix_witness(input.out_point_y, output_point.y.get_value());
61 } else {
62 builder.assert_equal(output_point.y.get_witness_index(), input.out_point_y);
63 }
64}
65
67 const MultiScalarMul& input,
68 bool has_valid_witness_assignments);
70 const MultiScalarMul& input,
71 bool has_valid_witness_assignments);
72
73} // namespace acir_format
cycle_group represents a group Element of the proving system's embedded curve i.e....
cycle_scalar represents a member of the cycle curve SCALAR FIELD. This is NOT the native circuit fiel...
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, Builder &builder)
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
std::vector< WitnessOrConstant< bb::fr > > points