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: 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
8
9namespace acir_format {
10
11using namespace bb;
12
13template <typename Builder> void set_zero_idx(const Builder& builder, mul_quad_<typename Builder::FF>& mul_quad)
14{
15 using FF = Builder::FF;
16
17 auto replace_and_check_zero_scaling = [&](uint32_t& index, const FF& scaling) {
18 if (index == bb::stdlib::IS_CONSTANT) {
19 index = builder.zero_idx();
20 BB_ASSERT_EQ(scaling, FF(0), "mul_quad_ gate with IS_CONSTANT witness index has non-zero scaling");
21 }
22 };
23
24 replace_and_check_zero_scaling(mul_quad.b, mul_quad.b_scaling);
25 replace_and_check_zero_scaling(mul_quad.c, mul_quad.c_scaling);
26 replace_and_check_zero_scaling(mul_quad.d, mul_quad.d_scaling);
27}
28
29template <typename Builder>
31 const mul_quad_<typename Builder::FF>& mul_quad,
32 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
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>
60{
61 using FF = typename Builder::FF;
62
63 // The index/value of the 4-th witness in the next gate (not used in the first gate)
64 // It is result of the expression calculated on the current gate
65 uint32_t next_w4_wire_idx = 0;
66 FF next_w4_wire_value = FF::zero();
67
68 for (size_t j = 0; j < big_constraint.size() - 1; ++j) {
69 // Replace IS_CONSTANT indices with zero indices
70 set_zero_idx(builder, big_constraint[j]);
71 // Create the mul_add gate
72 builder.create_big_mul_add_gate(big_constraint[j], /*include_next_gate_w_4*/ true);
73 // Update the index/value of the 4-th wire
74 next_w4_wire_value = builder.get_variable(big_constraint[j].a) * builder.get_variable(big_constraint[j].b) *
75 big_constraint[j].mul_scaling +
76 builder.get_variable(big_constraint[j].a) * big_constraint[j].a_scaling +
77 builder.get_variable(big_constraint[j].b) * big_constraint[j].b_scaling +
78 builder.get_variable(big_constraint[j].c) * big_constraint[j].c_scaling +
79 builder.get_variable(big_constraint[j].d) * big_constraint[j].d_scaling +
80 big_constraint[j].const_scaling;
81 next_w4_wire_value = -next_w4_wire_value;
82 next_w4_wire_idx = builder.add_variable(next_w4_wire_value);
83 // Check if the gate is valid
84 check_mul_add_gate(builder, big_constraint[j], next_w4_wire_value);
85 // Set the 4-th wire of the next gate
86 big_constraint[j + 1].d = next_w4_wire_idx;
87 big_constraint[j + 1].d_scaling = fr(-1);
88 }
89 // Replace IS_CONSTANT indices with zero indices
90 set_zero_idx(builder, big_constraint.back());
91 // Create final gate
92 builder.create_big_mul_add_gate(big_constraint.back(), /*include_next_gate_w_4*/ false);
93 // Check if the gate is valid
94 check_mul_add_gate(builder, big_constraint.back());
95}
96
99
101
104 const typename UltraCircuitBuilder::FF);
105
108 const typename MegaCircuitBuilder::FF);
109
112
115
117 UltraCircuitBuilder& builder, std::vector<mul_quad_<UltraCircuitBuilder::FF>>& big_constraint);
118
120 MegaCircuitBuilder& builder, std::vector<mul_quad_<MegaCircuitBuilder::FF>>& big_constraint);
121
122} // namespace acir_format
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:77
bb::field< bb::Bn254FrParams > FF
Definition field.cpp:22
typename ExecutionTrace::FF FF
AluTraceBuilder builder
Definition alu.test.cpp:124
FF a
FF b
template void set_zero_idx< MegaCircuitBuilder >(const MegaCircuitBuilder &, mul_quad_< typename MegaCircuitBuilder::FF > &)
void create_quad_constraint(Builder &builder, bb::mul_quad_< typename Builder::FF > &mul_quad)
Create a simple width-4 Ultra arithmetic gate constraint representing the equation.
template void create_big_quad_constraint< UltraCircuitBuilder >(UltraCircuitBuilder &builder, std::vector< mul_quad_< UltraCircuitBuilder::FF > > &big_constraint)
template void create_quad_constraint< MegaCircuitBuilder >(MegaCircuitBuilder &builder, mul_quad_< MegaCircuitBuilder::FF > &constraint)
void set_zero_idx(const Builder &builder, mul_quad_< typename Builder::FF > &mul_quad)
Replace indices which are set to IS_CONSTANT with the zero index of the builder.
template void create_quad_constraint< UltraCircuitBuilder >(UltraCircuitBuilder &builder, mul_quad_< UltraCircuitBuilder::FF > &constraint)
void check_mul_add_gate(Builder &builder, const mul_quad_< typename Builder::FF > &mul_quad, const typename Builder::FF next_wire_w4)
Check if a mul add gate is valid.
template void create_big_quad_constraint< MegaCircuitBuilder >(MegaCircuitBuilder &builder, std::vector< mul_quad_< MegaCircuitBuilder::FF > > &big_constraint)
template void set_zero_idx< UltraCircuitBuilder >(const UltraCircuitBuilder &, mul_quad_< typename UltraCircuitBuilder::FF > &)
void create_big_quad_constraint(Builder &builder, std::vector< mul_quad_< typename Builder::FF > > &big_constraint)
template void check_mul_add_gate< MegaCircuitBuilder >(MegaCircuitBuilder &, const mul_quad_< typename MegaCircuitBuilder::FF > &, const typename MegaCircuitBuilder::FF)
template void check_mul_add_gate< UltraCircuitBuilder >(UltraCircuitBuilder &, const mul_quad_< typename UltraCircuitBuilder::FF > &, const typename UltraCircuitBuilder::FF)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
field< Bn254FrParams > fr
Definition fr.hpp:174