59 FF scalar_lo = scalar_u256.
slice(0, 128);
60 FF scalar_hi = scalar_u256.
slice(128, 256);
64 constexpr bool scalars_are_constant =
68 auto construct_points = [&]() -> std::vector<WitnessOrConstant<FF>> {
69 if constexpr (points_are_constant) {
71 return { WitnessOrConstant<FF>::from_constant(point.
x),
72 WitnessOrConstant<FF>::from_constant(point.
y),
76 std::vector<uint32_t> point_indices = add_to_witness_and_track_indices(witness_values, point);
77 return { WitnessOrConstant<FF>::from_index(point_indices[0]),
78 WitnessOrConstant<FF>::from_index(point_indices[1]),
79 WitnessOrConstant<FF>::from_index(point_indices[2]) };
83 auto construct_scalars = [&]() -> std::vector<WitnessOrConstant<FF>> {
84 if constexpr (scalars_are_constant) {
86 return { WitnessOrConstant<FF>::from_constant(scalar_lo),
87 WitnessOrConstant<FF>::from_constant(scalar_hi) };
90 uint32_t scalar_lo_index =
static_cast<uint32_t
>(witness_values.size());
91 witness_values.emplace_back(scalar_lo);
92 uint32_t scalar_hi_index =
static_cast<uint32_t
>(witness_values.size());
93 witness_values.emplace_back(scalar_hi);
94 return { WitnessOrConstant<FF>::from_index(scalar_lo_index),
95 WitnessOrConstant<FF>::from_index(scalar_hi_index) };
99 auto point_fields = construct_points();
100 auto scalar_fields = construct_scalars();
103 std::vector<uint32_t> result_indices = add_to_witness_and_track_indices(witness_values, result);
104 uint32_t predicate_index =
static_cast<uint32_t
>(witness_values.size());
105 witness_values.emplace_back(
FF::one());
108 msm_constraint = MultiScalarMul{
109 .points = point_fields,
110 .scalars = scalar_fields,
111 .predicate = WitnessOrConstant<FF>::from_index(predicate_index),
112 .out_point_x = result_indices[0],
113 .out_point_y = result_indices[1],
114 .out_point_is_infinite = result_indices[2],
119 WitnessVector& witness_values,
122 switch (invalid_witness_target) {
126 witness_values[constraint.points[0].index] +=
bb::fr(1);
128 constraint.points[0] = WitnessOrConstant<FF>::from_constant(constraint.points[0].value +
bb::fr(1));
135 witness_values[constraint.scalars[0].index] +=
bb::fr(1);
137 constraint.scalars[0] = WitnessOrConstant<FF>::from_constant(constraint.scalars[0].value +
bb::fr(1));
145 witness_values[constraint.out_point_is_infinite] =
FF::zero();