Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ec_operations.test.cpp
Go to the documentation of this file.
1#include "ec_operations.hpp"
2#include "acir_format.hpp"
5
8
9#include <gtest/gtest.h>
10#include <vector>
11
13
15
16class EcOperations : public ::testing::Test {
17 protected:
19};
20
21size_t generate_ec_add_constraint(EcAdd& ec_add_constraint, WitnessVector& witness_values)
22{
23 using cycle_group_ct = bb::stdlib::cycle_group<Builder>;
24 witness_values.push_back(0);
26 cycle_group_ct input_point(g1);
27 // Doubling
28 cycle_group_ct result = input_point.dbl();
29 // add: x,y,x2,y2
30 witness_values.push_back(g1.x);
31 witness_values.push_back(g1.y);
32 witness_values.push_back(g1.x);
33 witness_values.push_back(g1.y);
34 witness_values.push_back(result.x.get_value());
35 witness_values.push_back(result.y.get_value());
36 witness_values.push_back(fr(0));
37 witness_values.push_back(fr(0));
38 witness_values.push_back(fr(1)); // predicate
39 ec_add_constraint = EcAdd{
42 .input1_infinite = WitnessOrConstant<bb::fr>::from_index(7),
45 .input2_infinite = WitnessOrConstant<bb::fr>::from_index(7),
47 .result_x = 5,
48 .result_y = 6,
49 .result_infinite = 8,
50 };
51 return witness_values.size();
52}
53
54TEST_F(EcOperations, TestECOperations)
55{
56 EcAdd ec_add_constraint;
57
58 WitnessVector witness_values;
59 size_t num_variables = generate_ec_add_constraint(ec_add_constraint, witness_values);
60
61 AcirFormat constraint_system{
62 .varnum = static_cast<uint32_t>(num_variables + 1),
63 .num_acir_opcodes = 1,
64 .public_inputs = {},
65 .ec_add_constraints = { ec_add_constraint },
66 .original_opcode_indices = create_empty_original_opcode_indices(),
67 };
68 mock_opcode_indices(constraint_system);
69
70 AcirProgram program{ constraint_system, witness_values };
71 auto builder = create_circuit(program);
72
73 EXPECT_TRUE(CircuitChecker::check(builder));
74}
75
76TEST_F(EcOperations, TestECPredicate)
77{
78 EcAdd ec_add_constraint;
79
80 WitnessVector witness_values;
81 size_t num_variables = generate_ec_add_constraint(ec_add_constraint, witness_values);
82 witness_values[2] = fr(0); // Bad value
83 witness_values[9] = fr(0); // Set the predicate to false
84 AcirFormat constraint_system{
85 .varnum = static_cast<uint32_t>(num_variables + 1),
86 .num_acir_opcodes = 1,
87 .public_inputs = {},
88 .ec_add_constraints = { ec_add_constraint },
89 .original_opcode_indices = create_empty_original_opcode_indices(),
90 };
91 mock_opcode_indices(constraint_system);
92
93 AcirProgram program{ constraint_system, witness_values };
94 auto builder = create_circuit(program);
95
96 EXPECT_TRUE(CircuitChecker::check(builder));
97}
98
99size_t generate_msm_constraint(MultiScalarMul& msm_constraint, WitnessVector& witness_values)
100{
101 witness_values.emplace_back(fr(0));
102
103 witness_values = {
104 // dummy
105 fr(0),
106 // g1: x,y,infinite
107 fr(1),
108 fr("0x0000000000000002cf135e7506a45d632d270d45f1181294833fc48d823f272c"),
109 fr(0),
110 // low, high scalars
111 fr(1),
112 fr(0),
113 // result
114 fr("0x06ce1b0827aafa85ddeb49cdaa36306d19a74caa311e13d46d8bc688cdbffffe"),
115 fr("0x1c122f81a3a14964909ede0ba2a6855fc93faf6fa1a788bf467be7e7a43f80ac"),
116 fr(0),
117 // predicate
118 fr(1),
119 };
120 msm_constraint = MultiScalarMul{
122 .index = 1,
123 .value = fr(0),
124 .is_constant = false,
125 },
127 .index = 2,
128 .value = fr(0),
129 .is_constant = false,
130 },
132 .index = 3,
133 .value = fr(0),
134 .is_constant = false,
135 },
137 .index = 1,
138 .value = fr(0),
139 .is_constant = false,
140 },
142 .index = 2,
143 .value = fr(0),
144 .is_constant = false,
145 },
147 .index = 3,
148 .value = fr(0),
149 .is_constant = false,
150 } },
151 .scalars = { WitnessOrConstant<fr>{
152 .index = 4,
153 .value = fr(0),
154 .is_constant = false,
155 },
157 .index = 5,
158 .value = fr(0),
159 .is_constant = false,
160 },
162 .index = 4,
163 .value = fr(0),
164 .is_constant = false,
165 },
167 .index = 5,
168 .value = fr(0),
169 .is_constant = false,
170 } },
171 .predicate =
173 .index = 9,
174 .value = fr(1),
175 .is_constant = false,
176 },
177 .out_point_x = 6,
178 .out_point_y = 7,
179 .out_point_is_infinite = 8,
180 };
181 return witness_values.size();
182}
183TEST_F(EcOperations, TestECMultiScalarMul)
184{
185 MultiScalarMul msm_constrain;
186 WitnessVector witness_values;
187 generate_msm_constraint(msm_constrain, witness_values);
188 auto res_x = fr("0x06ce1b0827aafa85ddeb49cdaa36306d19a74caa311e13d46d8bc688cdbffffe");
189 auto assert_equal = poly_triple{
190 .a = 6,
191 .b = 0,
192 .c = 0,
193 .q_m = 0,
194 .q_l = fr::neg_one(),
195 .q_r = 0,
196 .q_o = 0,
197 .q_c = res_x,
198 };
199
200 size_t num_variables = witness_values.size();
201 AcirFormat constraint_system{
202 .varnum = static_cast<uint32_t>(num_variables + 1),
203 .num_acir_opcodes = 1,
204 .public_inputs = {},
205 .multi_scalar_mul_constraints = { msm_constrain },
206 .poly_triple_constraints = { assert_equal },
207 .original_opcode_indices = create_empty_original_opcode_indices(),
208 };
209 mock_opcode_indices(constraint_system);
210
211 AcirProgram program{ constraint_system, witness_values };
212 auto builder = create_circuit(program);
213
214 EXPECT_TRUE(CircuitChecker::check(builder));
215}
216
217TEST_F(EcOperations, TestECMsmPredicate)
218{
219 MultiScalarMul msm_constrain;
220 WitnessVector witness_values;
221 generate_msm_constraint(msm_constrain, witness_values);
222 witness_values[2] = fr(0); // bad value
223 witness_values[9] = fr(0); // false predicate
224 auto res_x = fr("0x06ce1b0827aafa85ddeb49cdaa36306d19a74caa311e13d46d8bc688cdbffffe");
225 auto assert_equal = poly_triple{
226 .a = 6,
227 .b = 0,
228 .c = 0,
229 .q_m = 0,
230 .q_l = fr::neg_one(),
231 .q_r = 0,
232 .q_o = 0,
233 .q_c = res_x,
234 };
235
236 size_t num_variables = witness_values.size();
237 AcirFormat constraint_system{
238 .varnum = static_cast<uint32_t>(num_variables + 1),
239 .num_acir_opcodes = 1,
240 .public_inputs = {},
241 .multi_scalar_mul_constraints = { msm_constrain },
242 .poly_triple_constraints = { assert_equal },
243 .original_opcode_indices = create_empty_original_opcode_indices(),
244 };
245 mock_opcode_indices(constraint_system);
246
247 AcirProgram program{ constraint_system, witness_values };
248 auto builder = create_circuit(program);
249
250 EXPECT_TRUE(CircuitChecker::check(builder));
251}
252} // namespace acir_format::tests
acir_format::AcirFormatOriginalOpcodeIndices create_empty_original_opcode_indices()
void mock_opcode_indices(acir_format::AcirFormat &constraint_system)
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
Definition group.hpp:36
static constexpr affine_element affine_one
Definition group.hpp:48
cycle_group represents a group Element of the proving system's embedded curve, i.e....
AluTraceBuilder builder
Definition alu.test.cpp:123
size_t generate_ec_add_constraint(EcAdd &ec_add_constraint, WitnessVector &witness_values)
field< Bn254FrParams > fr
size_t generate_msm_constraint(MultiScalarMul &msm_constraint, WitnessVector &witness_values)
UltraCircuitBuilder create_circuit(AcirProgram &program, const ProgramMetadata &metadata)
Specialization for creating an Ultra circuit from an acir program.
bb::SlabVector< bb::fr > WitnessVector
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:188
WitnessOrConstant< bb::fr > input1_x
std::vector< WitnessOrConstant< bb::fr > > points
static WitnessOrConstant from_index(uint32_t index)
static constexpr field neg_one()