1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
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_should_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_should_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_should_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_should_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, DynGasFactorBitwise)
300 TestTraceContainer
trace({
302 { C::execution_sel, 1 },
303 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
ValueTag::U16) },
304 { C::execution_sel_gas_bitwise, 1 },
311 check_interaction<ExecutionTraceBuilder, lookup_execution_dyn_l2_factor_bitwise_settings>(
trace);
313 trace.
set(C::execution_dynamic_l2_gas_factor, 0, 100);
315 (check_interaction<tracegen::ExecutionTraceBuilder, lookup_execution_dyn_l2_factor_bitwise_settings>(
trace)),
316 "Failed.*EXECUTION_DYN_L2_FACTOR_BITWISE. Could not find tuple in destination.");
319TEST(GasConstrainingTest, DynGasFactorToRadix)
324 uint32_t num_limbs = 20;
326 TestTraceContainer
trace(
328 { C::execution_sel, 1 },
329 { C::execution_register_1_, radix },
330 { C::execution_register_2_, num_limbs },
331 { C::execution_sel_should_check_gas, 1 },
333 { C::execution_sel_gas_to_radix, 1 },
335 { C::execution_two_five_six, 256 },
336 { C::execution_sel_radix_gt_256, 0 },
337 { C::execution_sel_lookup_num_p_limbs, 1 },
338 { C::execution_num_p_limbs, num_p_limbs },
339 { C::execution_sel_use_num_limbs, num_limbs > num_p_limbs ? 1 : 0 },
340 { C::execution_dynamic_l2_gas_factor, num_limbs > num_p_limbs ? num_limbs : num_p_limbs },
343 { C::gt_input_a, radix },
344 { C::gt_input_b, 256 },
350 { C::gt_input_a, num_limbs },
351 { C::gt_input_b, num_p_limbs },
352 { C::gt_res, num_limbs > num_p_limbs ? 1 : 0 },
364 trace.
set(C::execution_dynamic_l2_gas_factor, 0, 100);
366 ".*subrelation DYN_L2_FACTOR_TO_RADIX_BE failed.*");
369TEST(GasConstrainingTest, DynGasFactorInvalidRadix)
373 uint32_t radix = 1000;
374 uint32_t num_limbs = 20;
375 uint32_t num_p_limbs = 32;
376 TestTraceContainer
trace(
378 { C::execution_sel, 1 },
379 { C::execution_register_1_, radix },
380 { C::execution_register_2_, num_limbs },
381 { C::execution_sel_should_check_gas, 1 },
383 { C::execution_sel_gas_to_radix, 1 },
385 { C::execution_two_five_six, 256 },
386 { C::execution_sel_radix_gt_256, radix > 256 ? 1 : 0 },
387 { C::execution_sel_lookup_num_p_limbs, radix <= 256 ? 1 : 0 },
388 { C::execution_num_p_limbs, num_p_limbs },
389 { C::execution_sel_use_num_limbs, num_limbs > num_p_limbs ? 1 : 0 },
390 { C::execution_dynamic_l2_gas_factor, num_limbs > num_p_limbs ? num_limbs : num_p_limbs },
393 { C::gt_input_a, radix },
394 { C::gt_input_b, 256 },
395 { C::gt_res, radix > 256 ? 1 : 0 },
400 { C::gt_input_a, num_limbs },
401 { C::gt_input_b, num_p_limbs },
402 { C::gt_res, num_limbs > num_p_limbs ? 1 : 0 },
412 check_relation<execution>(
trace,
#define AVM_DYN_GAS_ID_TORADIX
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_to_radix_safe_limbs(TraceContainer &trace)
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
void process_tag_parameters(TraceContainer &trace)
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
TestTraceContainer empty_trace()
size_t get_p_limbs_per_radix_size(size_t 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
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
uint8_t get_tag_bytes(ValueTag tag)
NiceMock< MockExecution > execution