1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
23using tracegen::BytecodeTraceBuilder;
25using tracegen::TestTraceContainer;
31void init_trace(TestTraceContainer&
trace)
34 trace.
set(C::precomputed_first_row, 0, 1);
37TEST(BytecodeDecompositionConstrainingTest, EmptyRow)
42TEST(BytecodeDecompositionConstrainingTest, SingleBytecode)
44 TestTraceContainer
trace;
51 check_relation<bc_decomposition>(
trace);
54TEST(BytecodeDecompositionConstrainingTest, ShortSingleBytecode)
57 TestTraceContainer
trace;
64 check_relation<bc_decomposition>(
trace);
67TEST(BytecodeDecompositionConstrainingTest, MultipleBytecodes)
69 TestTraceContainer
trace;
78 check_relation<bc_decomposition>(
trace);
81TEST(BytecodeDecompositionConstrainingTest, MultipleBytecodesWithShortOnes)
83 TestTraceContainer
trace;
95 check_relation<bc_decomposition>(
trace);
98TEST(BytecodeDecompositionConstrainingTest, NegativeDeactivatedSel)
102 .bc_decomposition_bytes_rem_inv =
FF(33).invert(),
103 .bc_decomposition_bytes_remaining = 33,
104 .bc_decomposition_sel = 1,
107 .bc_decomposition_bytes_rem_inv =
FF(32).invert(),
108 .bc_decomposition_bytes_remaining = 32,
109 .bc_decomposition_sel = 1,
112 .bc_decomposition_bytes_rem_inv =
FF(31).invert(),
113 .bc_decomposition_bytes_remaining = 31,
114 .bc_decomposition_sel = 1,
119 trace.
set(C::bc_decomposition_sel, 2, 0);
122 "BC_DEC_SEL_BYTES_REM_NON_ZERO");
125TEST(BytecodeDecompositionConstrainingTest, NegativeDeactivateLastContract)
129 .bc_decomposition_bytes_rem_min_one_inv =
FF(2).invert(),
130 .bc_decomposition_bytes_remaining = 3,
131 .bc_decomposition_sel = 1,
134 .bc_decomposition_bytes_rem_min_one_inv = 1,
135 .bc_decomposition_bytes_remaining = 2,
136 .bc_decomposition_sel = 1,
139 .bc_decomposition_bytes_rem_min_one_inv = 0,
140 .bc_decomposition_bytes_remaining = 1,
141 .bc_decomposition_last_of_contract = 1,
142 .bc_decomposition_sel = 1,
147 trace.
set(C::bc_decomposition_last_of_contract, 2, 0);
150 "BC_DEC_LAST_CONTRACT_BYTES_REM_ONE");
153TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongInitializationFirstRow)
156 { .precomputed_first_row = 1 },
158 .bc_decomposition_pc = 0,
159 .bc_decomposition_sel = 1,
164 trace.
set(C::bc_decomposition_pc, 1, 7);
167 "BC_DEC_PC_ZERO_INITIALIZATION");
170TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongInitializationInside)
173 { .bc_decomposition_last_of_contract = 1 },
175 .bc_decomposition_pc = 0,
176 .bc_decomposition_sel = 1,
181 trace.
set(C::bc_decomposition_pc, 1, 32);
184 "BC_DEC_PC_ZERO_INITIALIZATION");
187TEST(BytecodeDecompositionConstrainingTest, NegativePcWrongIncrement)
191 .bc_decomposition_pc = 5,
192 .bc_decomposition_sel = 1,
195 .bc_decomposition_pc = 6,
196 .bc_decomposition_sel = 1,
199 .bc_decomposition_last_of_contract = 1,
200 .bc_decomposition_pc = 7,
201 .bc_decomposition_sel = 1,
206 trace.
set(C::bc_decomposition_pc, 2, 6);
208 "BC_DEC_PC_INCREMENT");
211TEST(BytecodeDecompositionConstrainingTest, NegativeBytesRemWrongDecrement)
215 .bc_decomposition_bytes_remaining = 5,
216 .bc_decomposition_sel = 1,
219 .bc_decomposition_bytes_remaining = 4,
220 .bc_decomposition_sel = 1,
223 .bc_decomposition_bytes_remaining = 3,
224 .bc_decomposition_last_of_contract = 1,
225 .bc_decomposition_sel = 1,
230 trace.
set(C::bc_decomposition_bytes_remaining, 0, 4);
233 "BC_DEC_BYTES_REMAINING_DECREMENT");
236TEST(BytecodeDecompositionConstrainingTest, NegativeMutateBytecodeId)
240 .bc_decomposition_id = 147,
241 .bc_decomposition_sel = 1,
244 .bc_decomposition_id = 147,
245 .bc_decomposition_sel = 1,
248 .bc_decomposition_id = 147,
249 .bc_decomposition_last_of_contract = 1,
250 .bc_decomposition_sel = 1,
255 trace.
set(C::bc_decomposition_id, 2, 77);
257 "BC_DEC_ID_CONSTANT");
261TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingInitialization)
265 .bc_decomposition_last_of_contract = 1,
266 .bc_decomposition_sel = 1,
267 .bc_decomposition_sel_windows_gt_remaining = 1,
273 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
276 "SEL_WINDOWS_GT_REMAINING_INIT");
280TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingPropagation)
284 .bc_decomposition_sel = 1,
285 .bc_decomposition_sel_windows_gt_remaining = 1,
288 .bc_decomposition_last_of_contract = 1,
289 .bc_decomposition_sel = 1,
290 .bc_decomposition_sel_windows_gt_remaining = 1,
296 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
299 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
302 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 1);
304 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 1, 0);
307 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
310 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 0);
315TEST(BytecodeDecompositionConstrainingTest, SelWindowsGtRemainingPropagationWithMutation)
319 .bc_decomposition_is_windows_eq_remaining = 1,
320 .bc_decomposition_sel = 1,
321 .bc_decomposition_sel_windows_gt_remaining = 0,
324 .bc_decomposition_sel = 1,
325 .bc_decomposition_sel_windows_gt_remaining = 1,
328 .bc_decomposition_last_of_contract = 1,
329 .bc_decomposition_sel = 1,
330 .bc_decomposition_sel_windows_gt_remaining = 1,
336 trace.
set(C::bc_decomposition_sel_windows_gt_remaining, 0, 1);
339 "SEL_WINDOWS_GT_REMAINING_PROPAGATION");
342TEST(BytecodeDecompositionConstrainingTest, NegativeWrongBytesToReadNoCorrection)
346 .bc_decomposition_bytes_remaining = 75,
348 .bc_decomposition_sel = 1,
353 trace.
set(C::bc_decomposition_bytes_to_read, 0, 75);
355 "SET_BYTES_TO_READ");
358TEST(BytecodeDecompositionConstrainingTest, NegativeWrongBytesToReadWithCorrection)
362 .bc_decomposition_bytes_remaining = 13,
363 .bc_decomposition_bytes_to_read = 13,
364 .bc_decomposition_sel = 1,
365 .bc_decomposition_sel_windows_gt_remaining = 1,
372 "SET_BYTES_TO_READ");
375TEST(BytecodeDecompositionConstrainingTest, NegativeWrongPacking)
377 TestTraceContainer
trace;
380 { C::bc_decomposition_sel_packed, 1 },
381 { C::bc_decomposition_bytes, 0x12 },
382 { C::bc_decomposition_bytes_pc_plus_1, 0x34 },
383 { C::bc_decomposition_bytes_pc_plus_2, 0x56 },
384 { C::bc_decomposition_bytes_pc_plus_3, 0x78 },
385 { C::bc_decomposition_bytes_pc_plus_4, 0x9A },
386 { C::bc_decomposition_bytes_pc_plus_5, 0xBC },
387 { C::bc_decomposition_bytes_pc_plus_6, 0xDE },
388 { C::bc_decomposition_bytes_pc_plus_7, 0xF0 },
389 { C::bc_decomposition_bytes_pc_plus_8, 0x12 },
390 { C::bc_decomposition_bytes_pc_plus_9, 0x34 },
391 { C::bc_decomposition_bytes_pc_plus_10, 0x56 },
392 { C::bc_decomposition_bytes_pc_plus_11, 0x78 },
393 { C::bc_decomposition_bytes_pc_plus_12, 0x9A },
394 { C::bc_decomposition_bytes_pc_plus_13, 0xBC },
395 { C::bc_decomposition_bytes_pc_plus_14, 0xDE },
396 { C::bc_decomposition_bytes_pc_plus_15, 0xF0 },
397 { C::bc_decomposition_bytes_pc_plus_16, 0x12 },
398 { C::bc_decomposition_bytes_pc_plus_17, 0x34 },
399 { C::bc_decomposition_bytes_pc_plus_18, 0x56 },
400 { C::bc_decomposition_bytes_pc_plus_19, 0x78 },
401 { C::bc_decomposition_bytes_pc_plus_20, 0x9A },
402 { C::bc_decomposition_bytes_pc_plus_21, 0xBC },
403 { C::bc_decomposition_bytes_pc_plus_22, 0xDE },
404 { C::bc_decomposition_bytes_pc_plus_23, 0xF0 },
405 { C::bc_decomposition_bytes_pc_plus_24, 0x12 },
406 { C::bc_decomposition_bytes_pc_plus_25, 0x34 },
407 { C::bc_decomposition_bytes_pc_plus_26, 0x56 },
408 { C::bc_decomposition_bytes_pc_plus_27, 0x78 },
409 { C::bc_decomposition_bytes_pc_plus_28, 0x9A },
410 { C::bc_decomposition_bytes_pc_plus_29, 0xBC },
411 { C::bc_decomposition_bytes_pc_plus_30, 0xDE },
412 { C::bc_decomposition_packed_field,
415 FF(
"0x00123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE") },
419 trace.
set(C::bc_decomposition_bytes_pc_plus_20, 0, 0);
421 "BC_DECOMPOSITION_REPACKING");
425TEST(BytecodeDecompositionConstrainingTest, NegativeSelPackedNotSel)
427 TestTraceContainer
trace;
430 { C::bc_decomposition_sel_packed, 1 },
431 { C::bc_decomposition_sel, 1 },
435 trace.
set(C::bc_decomposition_sel, 0, 0);
437 "SEL_TOGGLED_AT_PACKED");
static constexpr size_t SR_SEL_TOGGLED_AT_PACKED
static constexpr size_t SR_BC_DECOMPOSITION_REPACKING
static constexpr size_t SR_BC_DEC_LAST_CONTRACT_BYTES_REM_ONE
static constexpr size_t SR_SEL_WINDOWS_GT_REMAINING_PROPAGATION
static constexpr size_t SR_BC_DEC_PC_INCREMENT
static constexpr size_t SR_BC_DEC_SEL_BYTES_REM_NON_ZERO
static constexpr size_t SR_BC_DEC_PC_ZERO_INITIALIZATION
static constexpr size_t SR_SEL_WINDOWS_GT_REMAINING_INIT
static constexpr size_t SR_BC_DEC_ID_CONSTANT
static constexpr size_t SR_BC_DEC_BYTES_REMAINING_DECREMENT
static constexpr size_t SR_SET_BYTES_TO_READ
static TestTraceContainer from_rows(const std::vector< AvmFullRow > &rows)
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
ContractClass random_contract_class(size_t bytecode_size)
std::vector< uint8_t > random_bytes(size_t n)
TestTraceContainer empty_trace()
constexpr uint32_t DECOMPOSE_WINDOW_SIZE
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept