Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
arithmetic_constraints.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Federico], commit: 2094fd1467dd9a94803b2c5007cf60ac357aa7d2 }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
8
9namespace acir_format {
10
11template <typename Builder> void set_zero_idx(const Builder& builder, QuadConstraint& mul_quad)
12{
13 using FF = Builder::FF;
14
15 auto replace_and_check_zero_scaling = [&](uint32_t& index, const FF& scaling) {
16 if (index == bb::stdlib::IS_CONSTANT) {
17 index = builder.zero_idx();
18 BB_ASSERT_EQ(scaling, FF(0), "mul_quad_ gate with IS_CONSTANT witness index has non-zero scaling");
19 }
20 };
21
22 BB_ASSERT_NEQ(mul_quad.a,
23 bb::stdlib::IS_CONSTANT,
24 "mul_quad_ gate cannot have IS_CONSTANT for witness a. An error here probably means a conversion "
25 "issue in acir_to_constraint_buf.");
26 replace_and_check_zero_scaling(mul_quad.b, mul_quad.b_scaling);
27 replace_and_check_zero_scaling(mul_quad.c, mul_quad.c_scaling);
28 replace_and_check_zero_scaling(mul_quad.d, mul_quad.d_scaling);
29}
30
31template <typename Builder>
32void check_mul_add_gate(Builder& builder, const QuadConstraint& mul_quad, const typename Builder::FF next_wire_w4)
33{
34 using FF = Builder::FF;
35
36 FF result = mul_quad.const_scaling + next_wire_w4;
37 result += builder.get_variable(mul_quad.a) * builder.get_variable(mul_quad.b) * mul_quad.mul_scaling;
38 result += builder.get_variable(mul_quad.a) * mul_quad.a_scaling;
39 result += builder.get_variable(mul_quad.b) * mul_quad.b_scaling;
40 result += builder.get_variable(mul_quad.c) * mul_quad.c_scaling;
41 result += builder.get_variable(mul_quad.d) * mul_quad.d_scaling;
42
43 if (result != FF::zero() && !builder.failed() && !builder.is_write_vk_mode()) {
44 builder.failure("mul_add_gate");
45 }
46}
47
48template <typename Builder> void create_quad_constraint(Builder& builder, QuadConstraint& mul_quad)
49{
50 // Replace IS_CONSTANT indices with zero indices
51 set_zero_idx(builder, mul_quad);
52 // Check if the gate is valid
53 check_mul_add_gate(builder, mul_quad);
54 // Create gate
55 builder.create_big_mul_add_gate(mul_quad);
56}
57
58template <typename Builder> void create_big_quad_constraint(Builder& builder, BigQuadConstraint& big_constraint)
59{
60 using FF = typename Builder::FF;
61
62 // The index/value of the 4-th witness in the next gate (not used in the first gate)
63 // It is result of the expression calculated on the current gate
64 uint32_t next_w4_wire_idx = 0;
65 FF next_w4_wire_value = FF::zero();
66
67 for (size_t j = 0; j < big_constraint.size() - 1; ++j) {
68 // Replace IS_CONSTANT indices with zero indices
69 set_zero_idx(builder, big_constraint[j]);
70 // Create the mul_add gate
71 builder.create_big_mul_add_gate(big_constraint[j], /*include_next_gate_w_4*/ true);
72 // Update the index/value of the 4-th wire
73 next_w4_wire_value = builder.get_variable(big_constraint[j].a) * builder.get_variable(big_constraint[j].b) *
74 big_constraint[j].mul_scaling +
75 builder.get_variable(big_constraint[j].a) * big_constraint[j].a_scaling +
76 builder.get_variable(big_constraint[j].b) * big_constraint[j].b_scaling +
77 builder.get_variable(big_constraint[j].c) * big_constraint[j].c_scaling +
78 builder.get_variable(big_constraint[j].d) * big_constraint[j].d_scaling +
79 big_constraint[j].const_scaling;
80 next_w4_wire_value = -next_w4_wire_value;
81 next_w4_wire_idx = builder.add_variable(next_w4_wire_value);
82 // Check if the gate is valid
83 check_mul_add_gate(builder, big_constraint[j], next_w4_wire_value);
84 // Set the 4-th wire of the next gate
85 big_constraint[j + 1].d = next_w4_wire_idx;
86 big_constraint[j + 1].d_scaling = fr(-1);
87 }
88 // Replace IS_CONSTANT indices with zero indices
89 set_zero_idx(builder, big_constraint.back());
90 // Create final gate
91 builder.create_big_mul_add_gate(big_constraint.back(), /*include_next_gate_w_4*/ false);
92 // Check if the gate is valid
93 check_mul_add_gate(builder, big_constraint.back());
94}
95
97
99
101 const QuadConstraint&,
102 const typename UltraCircuitBuilder::FF);
103
105 const QuadConstraint&,
106 const typename MegaCircuitBuilder::FF);
107
109
111
113 BigQuadConstraint& big_constraint);
114
116 BigQuadConstraint& big_constraint);
117
118} // namespace acir_format
#define BB_ASSERT_NEQ(actual, expected,...)
Definition assert.hpp:108
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:93
bb::field< bb::Bn254FrParams > FF
Definition field.cpp:22
Constraint representing a polynomial of degree 1 or 2 that does not fit into a standard UltraHonk ari...
typename ExecutionTrace::FF FF
AluTraceBuilder builder
Definition alu.test.cpp:124
FF a
FF b
void create_big_quad_constraint(Builder &builder, BigQuadConstraint &big_constraint)
void set_zero_idx(const Builder &builder, QuadConstraint &mul_quad)
Replace indices which are set to IS_CONSTANT with the zero index of the builder.
template void set_zero_idx< UltraCircuitBuilder >(const UltraCircuitBuilder &, QuadConstraint &)
template void set_zero_idx< MegaCircuitBuilder >(const MegaCircuitBuilder &, QuadConstraint &)
template void create_quad_constraint< UltraCircuitBuilder >(UltraCircuitBuilder &builder, QuadConstraint &constraint)
template void create_big_quad_constraint< UltraCircuitBuilder >(UltraCircuitBuilder &builder, BigQuadConstraint &big_constraint)
template void check_mul_add_gate< MegaCircuitBuilder >(MegaCircuitBuilder &, const QuadConstraint &, const typename MegaCircuitBuilder::FF)
template void create_big_quad_constraint< MegaCircuitBuilder >(MegaCircuitBuilder &builder, BigQuadConstraint &big_constraint)
template void create_quad_constraint< MegaCircuitBuilder >(MegaCircuitBuilder &builder, QuadConstraint &constraint)
void check_mul_add_gate(Builder &builder, const QuadConstraint &mul_quad, const typename Builder::FF next_wire_w4)
Check if a mul add gate is valid.
void create_quad_constraint(Builder &builder, QuadConstraint &mul_quad)
Create a simple width-4 Ultra arithmetic gate constraint representing the equation.
template void check_mul_add_gate< UltraCircuitBuilder >(UltraCircuitBuilder &, const QuadConstraint &, const typename UltraCircuitBuilder::FF)
field< Bn254FrParams > fr
Definition fr.hpp:174