1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
6#include "barretenberg/aztec/aztec_constants.hpp"
25using tracegen::ExecutionTraceBuilder;
26using tracegen::PrecomputedTraceBuilder;
27using tracegen::TestTraceContainer;
33TEST(GasConstrainingTest, EmptyRow)
38TEST(GasConstrainingTest, AllSubrelations)
40 uint32_t opcode_l2_gas = 100;
41 uint32_t addressing_gas = 50;
42 uint32_t base_da_gas = 3;
43 uint32_t dynamic_l2_gas = 10;
44 uint32_t dynamic_da_gas = 5;
45 uint32_t dynamic_l2_gas_factor = 2;
46 uint32_t dynamic_da_gas_factor = 1;
47 uint32_t l2_gas_limit = 1000;
48 uint32_t da_gas_limit = 800;
49 uint32_t prev_l2_gas_used = 500;
50 uint32_t prev_da_gas_used = 200;
51 uint64_t total_gas_l2 =
52 prev_l2_gas_used + opcode_l2_gas + addressing_gas + (dynamic_l2_gas * dynamic_l2_gas_factor);
53 uint64_t total_gas_da = prev_da_gas_used + base_da_gas + (dynamic_da_gas * dynamic_da_gas_factor);
55 TestTraceContainer
trace({ {
56 { C::execution_sel_check_gas, 1 },
58 { C::execution_opcode_gas, opcode_l2_gas },
59 { C::execution_addressing_gas, addressing_gas },
60 { C::execution_base_da_gas, base_da_gas },
61 { C::execution_dynamic_l2_gas, dynamic_l2_gas },
62 { C::execution_dynamic_da_gas, dynamic_da_gas },
64 { C::execution_l2_gas_limit, l2_gas_limit },
65 { C::execution_da_gas_limit, da_gas_limit },
66 { C::execution_prev_l2_gas_used, prev_l2_gas_used },
67 { C::execution_prev_da_gas_used, prev_da_gas_used },
68 { C::execution_dynamic_l2_gas_factor, dynamic_l2_gas_factor },
69 { C::execution_dynamic_da_gas_factor, dynamic_da_gas_factor },
71 { C::execution_total_gas_l2, total_gas_l2 },
72 { C::execution_total_gas_da, total_gas_da },
74 { C::execution_out_of_gas_l2, 0 },
75 { C::execution_out_of_gas_da, 0 },
76 { C::execution_sel_out_of_gas, 0 },
84 { C::gt_input_a, total_gas_l2 },
85 { C::gt_input_b, l2_gas_limit },
92 { C::gt_input_a, total_gas_da },
93 { C::gt_input_b, da_gas_limit },
97 check_relation<gas>(trace);
105 { C::execution_out_of_gas_l2, 0 },
106 { C::execution_out_of_gas_da, 0 },
107 { C::execution_sel_out_of_gas, 1 },
109 EXPECT_THROW(check_relation<gas>(trace), std::runtime_error);
112 { C::execution_out_of_gas_l2, 1 },
113 { C::execution_out_of_gas_da, 1 },
114 { C::execution_sel_out_of_gas, 1 },
117 "Failed.*LOOKUP_GAS_IS_OUT_OF_GAS_L2. Could not find tuple in destination.");
119 "Failed.*LOOKUP_GAS_IS_OUT_OF_GAS_DA. Could not find tuple in destination.");
122TEST(GasConstrainingTest, OutOfGasBase)
124 uint32_t opcode_l2_gas = 100;
125 uint32_t addressing_gas = 50;
126 uint32_t base_da_gas = 100;
127 uint32_t dynamic_l2_gas = 0;
128 uint32_t dynamic_da_gas = 0;
129 uint32_t dynamic_l2_gas_factor = 2;
130 uint32_t dynamic_da_gas_factor = 1;
131 uint32_t l2_gas_limit = 100;
132 uint32_t da_gas_limit = 80;
133 uint32_t prev_l2_gas_used = 0;
134 uint32_t prev_da_gas_used = 0;
135 uint64_t total_gas_l2 =
136 prev_l2_gas_used + opcode_l2_gas + addressing_gas + (dynamic_l2_gas * dynamic_l2_gas_factor);
137 uint64_t total_gas_da = prev_da_gas_used + base_da_gas + (dynamic_da_gas * dynamic_da_gas_factor);
139 TestTraceContainer
trace({ {
140 { C::execution_sel_check_gas, 1 },
142 { C::execution_opcode_gas, opcode_l2_gas },
143 { C::execution_addressing_gas, addressing_gas },
144 { C::execution_base_da_gas, base_da_gas },
145 { C::execution_dynamic_l2_gas, dynamic_l2_gas },
146 { C::execution_dynamic_da_gas, dynamic_da_gas },
148 { C::execution_l2_gas_limit, l2_gas_limit },
149 { C::execution_da_gas_limit, da_gas_limit },
150 { C::execution_prev_l2_gas_used, prev_l2_gas_used },
151 { C::execution_prev_da_gas_used, prev_da_gas_used },
152 { C::execution_dynamic_l2_gas_factor, dynamic_l2_gas_factor },
153 { C::execution_dynamic_da_gas_factor, dynamic_da_gas_factor },
155 { C::execution_total_gas_l2, total_gas_l2 },
156 { C::execution_total_gas_da, total_gas_da },
158 { C::execution_out_of_gas_l2, 1 },
159 { C::execution_out_of_gas_da, 1 },
160 { C::execution_sel_out_of_gas, 1 },
168 { C::gt_input_a, total_gas_l2 },
169 { C::gt_input_b, l2_gas_limit },
176 { C::gt_input_a, total_gas_da },
177 { C::gt_input_b, da_gas_limit },
181 check_relation<gas>(trace);
189 { C::execution_out_of_gas_l2, 0 },
190 { C::execution_out_of_gas_da, 0 },
191 { C::execution_sel_out_of_gas, 0 },
195 "Failed.*LOOKUP_GAS_IS_OUT_OF_GAS_L2. Could not find tuple in destination.");
197 "Failed.*LOOKUP_GAS_IS_OUT_OF_GAS_DA. Could not find tuple in destination.");
200TEST(GasConstrainingTest, OutOfGasDynamic)
202 uint32_t opcode_l2_gas = 1;
203 uint32_t addressing_gas = 0;
204 uint32_t base_da_gas = 3;
205 uint32_t dynamic_l2_gas = 10;
206 uint32_t dynamic_da_gas = 9;
207 uint32_t dynamic_l2_gas_factor = 10;
208 uint32_t dynamic_da_gas_factor = 10;
209 uint32_t l2_gas_limit = 100;
210 uint32_t da_gas_limit = 80;
211 uint32_t prev_l2_gas_used = 0;
212 uint32_t prev_da_gas_used = 0;
213 uint64_t total_gas_l2 =
214 prev_l2_gas_used + opcode_l2_gas + addressing_gas + (dynamic_l2_gas * dynamic_l2_gas_factor);
215 uint64_t total_gas_da = prev_da_gas_used + base_da_gas + (dynamic_da_gas * dynamic_da_gas_factor);
217 TestTraceContainer
trace({ {
218 { C::execution_sel_check_gas, 1 },
220 { C::execution_opcode_gas, opcode_l2_gas },
221 { C::execution_addressing_gas, addressing_gas },
222 { C::execution_base_da_gas, base_da_gas },
223 { C::execution_dynamic_l2_gas, dynamic_l2_gas },
224 { C::execution_dynamic_da_gas, dynamic_da_gas },
226 { C::execution_l2_gas_limit, l2_gas_limit },
227 { C::execution_da_gas_limit, da_gas_limit },
228 { C::execution_prev_l2_gas_used, prev_l2_gas_used },
229 { C::execution_prev_da_gas_used, prev_da_gas_used },
230 { C::execution_dynamic_l2_gas_factor, dynamic_l2_gas_factor },
231 { C::execution_dynamic_da_gas_factor, dynamic_da_gas_factor },
233 { C::execution_total_gas_l2, total_gas_l2 },
234 { C::execution_total_gas_da, total_gas_da },
236 { C::execution_out_of_gas_l2, 1 },
237 { C::execution_out_of_gas_da, 1 },
238 { C::execution_sel_out_of_gas, 1 },
246 { C::gt_input_a, total_gas_l2 },
247 { C::gt_input_b, l2_gas_limit },
254 { C::gt_input_a, total_gas_da },
255 { C::gt_input_b, da_gas_limit },
258 check_relation<gas>(trace);
266 { C::execution_out_of_gas_l2, 0 },
267 { C::execution_out_of_gas_da, 0 },
268 { C::execution_sel_out_of_gas, 0 },
271 "Failed.*LOOKUP_GAS_IS_OUT_OF_GAS_L2. Could not find tuple in destination.");
273 "Failed.*LOOKUP_GAS_IS_OUT_OF_GAS_DA. Could not find tuple in destination.");
276TEST(GasConstrainingTest, NoCheckNoOOG)
278 TestTraceContainer
trace({ {
279 { C::execution_sel_check_gas, 0 },
281 { C::execution_out_of_gas_l2, 0 },
282 { C::execution_out_of_gas_da, 0 },
283 { C::execution_sel_out_of_gas, 0 },
285 check_relation<gas>(trace);
290 { C::execution_out_of_gas_l2, 1 },
291 { C::execution_out_of_gas_da, 1 },
292 { C::execution_sel_out_of_gas, 1 },
294 EXPECT_THROW(check_relation<gas>(trace), std::runtime_error);
297TEST(GasConstrainingTest, DynGasFactorToRadix)
302 uint32_t num_limbs = 20;
304 TestTraceContainer
trace(
306 { C::execution_sel, 1 },
307 { C::execution_register_1_, radix },
308 { C::execution_register_2_, num_limbs },
309 { C::execution_sel_check_gas, 1 },
311 { C::execution_sel_gas_to_radix, 1 },
312 { C::execution_dyn_gas_id, AVM_DYN_GAS_ID_TORADIX },
313 { C::execution_two_five_six, 256 },
314 { C::execution_sel_radix_gt_256, 0 },
315 { C::execution_sel_lookup_num_p_limbs, 1 },
316 { C::execution_num_p_limbs, num_p_limbs },
317 { C::execution_sel_use_num_limbs, num_limbs > num_p_limbs ? 1 : 0 },
318 { C::execution_dynamic_l2_gas_factor, num_limbs > num_p_limbs ? num_limbs : num_p_limbs },
321 { C::gt_input_a, radix },
322 { C::gt_input_b, 256 },
328 { C::gt_input_a, num_limbs },
329 { C::gt_input_b, num_p_limbs },
330 { C::gt_res, num_limbs > num_p_limbs ? 1 : 0 },
342 trace.
set(C::execution_dynamic_l2_gas_factor, 0, 100);
347TEST(GasConstrainingTest, DynGasFactorInvalidRadix)
351 uint32_t radix = 1000;
352 uint32_t num_limbs = 20;
353 uint32_t num_p_limbs = 32;
354 TestTraceContainer
trace(
356 { C::execution_sel, 1 },
357 { C::execution_register_1_, radix },
358 { C::execution_register_2_, num_limbs },
359 { C::execution_sel_check_gas, 1 },
361 { C::execution_sel_gas_to_radix, 1 },
362 { C::execution_dyn_gas_id, AVM_DYN_GAS_ID_TORADIX },
363 { C::execution_two_five_six, 256 },
364 { C::execution_sel_radix_gt_256, radix > 256 ? 1 : 0 },
365 { C::execution_sel_lookup_num_p_limbs, radix <= 256 ? 1 : 0 },
366 { C::execution_num_p_limbs, num_p_limbs },
367 { C::execution_sel_use_num_limbs, num_limbs > num_p_limbs ? 1 : 0 },
368 { C::execution_dynamic_l2_gas_factor, num_limbs > num_p_limbs ? num_limbs : num_p_limbs },
371 { C::gt_input_a, radix },
372 { C::gt_input_b, 256 },
373 { C::gt_res, radix > 256 ? 1 : 0 },
378 { C::gt_input_a, num_limbs },
379 { C::gt_input_b, num_p_limbs },
380 { C::gt_res, num_limbs > num_p_limbs ? 1 : 0 },
390 check_relation<execution>(trace,
396TEST(GasConstrainingTest, DynGasFactorToRadixInvalidRadixLt2)
401 uint32_t num_limbs = 20;
403 TestTraceContainer
trace({ {
404 { C::execution_sel, 1 },
405 { C::execution_register_1_, radix },
406 { C::execution_register_2_, num_limbs },
407 { C::execution_sel_check_gas, 1 },
409 { C::execution_sel_gas_to_radix, 1 },
410 { C::execution_dyn_gas_id, AVM_DYN_GAS_ID_TORADIX },
411 { C::execution_two_five_six, 256 },
412 { C::execution_sel_radix_gt_256, 0 },
413 { C::execution_sel_lookup_num_p_limbs, 1 },
414 { C::execution_num_p_limbs, num_p_limbs },
415 { C::execution_sel_use_num_limbs, 1 },
416 { C::execution_dynamic_l2_gas_factor, num_limbs },
419 { C::gt_input_a, radix },
420 { C::gt_input_b, 256 },
426 { C::gt_input_a, num_limbs },
427 { C::gt_input_b, num_p_limbs },
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
static std::string get_subrelation_label(size_t index)
static constexpr size_t SR_DYN_L2_FACTOR_TO_RADIX_BE
static constexpr size_t SR_DYN_GAS_ID_DECOMPOSITION
static constexpr size_t SR_NUM_P_LIMBS_CEIL
void process_misc(TraceContainer &trace, const uint32_t num_rows=PRECOMPUTED_TRACE_SIZE)
Populate miscellaneous precomputed columns: first_row selector and idx (row index).
void process_to_radix_safe_limbs(TraceContainer &trace)
Populate the TORADIXBE safe-limbs table (one row per radix 0..255).
void set(Column col, uint32_t row, const FF &value, bool use_atomic_limbs=false)
PrecomputedTraceBuilder precomputed_builder
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
TestTraceContainer empty_trace()
size_t get_p_limbs_per_radix_size(size_t radix)
Gets the number of limbs that the modulus, p, decomposes into for a given radix.
lookup_settings< lookup_gas_is_out_of_gas_l2_settings_ > lookup_gas_is_out_of_gas_l2_settings
lookup_settings< lookup_gas_is_out_of_gas_da_settings_ > lookup_gas_is_out_of_gas_da_settings
lookup_settings< lookup_execution_get_p_limbs_settings_ > lookup_execution_get_p_limbs_settings
constexpr size_t NUM_RADIXES
lookup_settings< lookup_execution_check_radix_gt_256_settings_ > lookup_execution_check_radix_gt_256_settings
lookup_settings< lookup_execution_get_max_limbs_settings_ > lookup_execution_get_max_limbs_settings
NiceMock< MockExecution > execution