60 FF scalar_lo = scalar_u256.
slice(0, 128);
61 FF scalar_hi = scalar_u256.
slice(128, 256);
65 constexpr bool scalars_are_constant =
69 auto construct_points = [&]() -> std::vector<WitnessOrConstant<FF>> {
70 if constexpr (points_are_constant) {
72 return { WitnessOrConstant<FF>::from_constant(point.
x),
73 WitnessOrConstant<FF>::from_constant(point.
y),
77 std::vector<uint32_t> point_indices = add_to_witness_and_track_indices(witness_values, point);
78 return { WitnessOrConstant<FF>::from_index(point_indices[0]),
79 WitnessOrConstant<FF>::from_index(point_indices[1]),
80 WitnessOrConstant<FF>::from_index(point_indices[2]) };
84 auto construct_scalars = [&]() -> std::vector<WitnessOrConstant<FF>> {
85 if constexpr (scalars_are_constant) {
87 return { WitnessOrConstant<FF>::from_constant(scalar_lo),
88 WitnessOrConstant<FF>::from_constant(scalar_hi) };
91 uint32_t scalar_lo_index =
static_cast<uint32_t
>(witness_values.size());
92 witness_values.emplace_back(scalar_lo);
93 uint32_t scalar_hi_index =
static_cast<uint32_t
>(witness_values.size());
94 witness_values.emplace_back(scalar_hi);
95 return { WitnessOrConstant<FF>::from_index(scalar_lo_index),
96 WitnessOrConstant<FF>::from_index(scalar_hi_index) };
100 auto point_fields = construct_points();
101 auto scalar_fields = construct_scalars();
104 std::vector<uint32_t> result_indices = add_to_witness_and_track_indices(witness_values, result);
105 uint32_t predicate_index =
static_cast<uint32_t
>(witness_values.size());
106 witness_values.emplace_back(
FF::one());
109 msm_constraint = MultiScalarMul{
110 .points = point_fields,
111 .scalars = scalar_fields,
112 .predicate = WitnessOrConstant<FF>::from_index(predicate_index),
113 .out_point_x = result_indices[0],
114 .out_point_y = result_indices[1],
115 .out_point_is_infinite = result_indices[2],
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();
153 return { constraint, witness_values };