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: Complete, auditors: [Luke], commit: a48c205d6dcd4338f5b83b4fda18bff6015be07b}
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
14
15namespace acir_format {
16
17using namespace bb;
18
25
48template <typename Builder>
50{
51 using cycle_group_ct = stdlib::cycle_group<Builder>;
52
53 // Step 1: Reconstruct inputs (points, scalars, expected result)
54 MsmInputs input = reconstruct_msm_inputs(builder, constraint_input);
55
56 // Step 2: Compute result and connect it to the expected result reconstructed from inputs
57 auto result = cycle_group_ct::batch_mul(input.points, input.scalars);
58 cycle_group_ct to_be_asserted_equal = cycle_group_ct::conditional_assign(input.predicate, input.result, result);
59 result.assert_equal(to_be_asserted_equal);
60}
61
73template <typename Builder>
74static MsmInputs<Builder> reconstruct_msm_inputs(Builder& builder, const MultiScalarMul& input)
75{
76 using cycle_group_ct = stdlib::cycle_group<Builder>;
77 using cycle_scalar_ct = typename cycle_group_ct::cycle_scalar;
79 using bool_ct = stdlib::bool_t<Builder>;
80
81 bool_ct predicate = bool_ct(to_field_ct(input.predicate, builder));
82
83 // Reconstruct expected result
84 field_ct input_result_x = field_ct::from_witness_index(&builder, input.out_point_x);
85 field_ct input_result_y = field_ct::from_witness_index(&builder, input.out_point_y);
86
87 // If no valid witness assignments, set result to generator point to avoid errors during circuit construction
88 if (builder.is_write_vk_mode()) {
89 builder.set_variable(input_result_x.get_witness_index(), bb::grumpkin::g1::affine_one.x);
90 builder.set_variable(input_result_y.get_witness_index(), bb::grumpkin::g1::affine_one.y);
91 }
92
93 // Use public constructor which auto-detects infinity from (0,0) coordinates.
94 // Note that input_result is computed by Noir and passed to bb via ACIR. Hence, it is always a valid point on
95 // Grumpkin, so we don't need to assert on curve.
96 cycle_group_ct input_result(input_result_x, input_result_y, /*assert_on_curve=*/false);
97
98 // Reconstruct points and scalars
101
102 // Ensure that the number of points and scalars are consistent (3 field elements per point, 2 per scalar)
103 BB_ASSERT(input.points.size() * 2 == input.scalars.size() * 3, "MultiScalarMul input size mismatch");
104
105 for (size_t i = 0; i < input.points.size(); i += 3) {
106 cycle_group_ct input_point =
107 to_grumpkin_point(input.points[i], input.points[i + 1], input.points[i + 2], predicate, builder);
108
109 cycle_scalar_ct scalar =
110 to_grumpkin_scalar(input.scalars[2 * (i / 3)], input.scalars[2 * (i / 3) + 1], predicate, builder);
111
112 points.push_back(input_point);
113 scalars.push_back(scalar);
114 }
115
116 return { predicate, input_result, points, scalars };
117}
118
120 const MultiScalarMul& input);
122 const MultiScalarMul& input);
123
124} // namespace acir_format
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
static constexpr affine_element affine_one
Definition group.hpp:48
Implements boolean logic in-circuit.
Definition bool.hpp:60
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:67
uint32_t get_witness_index() const
Get the witness index of the current field element.
Definition field.hpp:518
AluTraceBuilder builder
Definition alu.test.cpp:124
template void create_multi_scalar_mul_constraint< UltraCircuitBuilder >(UltraCircuitBuilder &builder, const MultiScalarMul &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.
bb::stdlib::cycle_group< Builder >::cycle_scalar to_grumpkin_scalar(const WitnessOrConstant< typename Builder::FF > &scalar_lo, const WitnessOrConstant< typename Builder::FF > &scalar_hi, const bb::stdlib::bool_t< Builder > &predicate, Builder &builder)
Convert inputs representing a Grumpkin scalar into a cycle_scalar element.
template void create_multi_scalar_mul_constraint< MegaCircuitBuilder >(MegaCircuitBuilder &builder, const MultiScalarMul &input)
void create_multi_scalar_mul_constraint(Builder &builder, const MultiScalarMul &constraint_input)
Create constraints for multi-scalar multiplication on the Grumpkin curve.
bb::stdlib::field_t< Builder > to_field_ct(const WitnessOrConstant< typename Builder::FF > &input, Builder &builder)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
bb::stdlib::bool_t< Builder > predicate
std::vector< bb::stdlib::cycle_group< Builder > > points
bb::stdlib::cycle_group< Builder > result
std::vector< typename bb::stdlib::cycle_group< Builder >::cycle_scalar > scalars