1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
28using simulation::EmitUnencryptedLogWriteEvent;
29using simulation::TrackedSideEffects;
30using testing::PublicInputsBuilder;
31using tracegen::EmitUnencryptedLogTraceBuilder;
32using tracegen::PublicInputsTraceBuilder;
33using tracegen::TestTraceContainer;
41 memory_values.reserve(fields.size());
42 for (
const FF&
field : fields) {
43 memory_values.push_back(MemoryValue::from<FF>(
field));
48TEST(EmitUnencryptedLogConstrainingTest, EmptyTrace)
53TEST(EmitUnencryptedLogConstrainingTest, Positive)
57 const std::vector<FF> log_fields = { 4, 5 };
58 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
59 TrackedSideEffects side_effect_states = { .public_logs = {} };
60 TrackedSideEffects side_effect_states_after = { .public_logs = PublicLogs{ { { log_fields,
address } } } };
62 EmitUnencryptedLogWriteEvent
event = {
66 .log_address = log_address,
68 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
69 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
71 .values = to_memory_values(log_fields),
72 .error_memory_out_of_bounds =
false,
73 .error_too_many_log_fields =
false,
74 .error_tag_mismatch =
false,
77 TestTraceContainer
trace({
78 { { C::precomputed_first_row, 1 } },
81 EmitUnencryptedLogTraceBuilder trace_builder;
82 trace_builder.process({
event },
trace);
84 check_relation<emit_unencrypted_log>(trace);
87TEST(EmitUnencryptedLogConstrainingTest, ErrorMemoryOutOfBounds)
91 uint32_t log_size = 2;
92 TrackedSideEffects side_effect_states = { .public_logs = PublicLogs{ { { { 4 },
address } } } };
93 const TrackedSideEffects& side_effect_states_after = side_effect_states;
95 EmitUnencryptedLogWriteEvent
event = {
99 .log_address = log_address,
100 .log_size = log_size,
101 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
102 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
105 .error_memory_out_of_bounds =
true,
106 .error_too_many_log_fields =
false,
107 .error_tag_mismatch =
false,
110 TestTraceContainer
trace({
111 { { C::precomputed_first_row, 1 } },
114 EmitUnencryptedLogTraceBuilder trace_builder;
115 trace_builder.process({
event },
trace);
117 check_relation<emit_unencrypted_log>(trace);
120TEST(EmitUnencryptedLogConstrainingTest, ErrorTooManyLogFields)
124 const std::vector<FF> log_fields = { 4, 5 };
125 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
127 TrackedSideEffects side_effect_states = {
130 const TrackedSideEffects& side_effect_states_after = side_effect_states;
132 EmitUnencryptedLogWriteEvent
event = {
136 .log_address = log_address,
137 .log_size = log_size,
138 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
139 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
141 .values = to_memory_values(log_fields),
142 .error_memory_out_of_bounds =
false,
143 .error_too_many_log_fields =
true,
144 .error_tag_mismatch =
false,
147 TestTraceContainer
trace({
148 { { C::precomputed_first_row, 1 } },
151 EmitUnencryptedLogTraceBuilder trace_builder;
152 trace_builder.process({
event },
trace);
154 check_relation<emit_unencrypted_log>(trace);
157TEST(EmitUnencryptedLogConstrainingTest, ErrorTagMismatch)
162 uint32_t log_size =
static_cast<uint32_t
>(log_values.size());
163 TrackedSideEffects side_effect_states = { .public_logs = {} };
165 const TrackedSideEffects& side_effect_states_after = side_effect_states;
167 EmitUnencryptedLogWriteEvent
event = {
171 .log_address = log_address,
172 .log_size = log_size,
173 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
174 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
176 .values = log_values,
177 .error_memory_out_of_bounds =
false,
178 .error_too_many_log_fields =
false,
179 .error_tag_mismatch =
true,
182 TestTraceContainer
trace({
183 { { C::precomputed_first_row, 1 } },
186 EmitUnencryptedLogTraceBuilder trace_builder;
187 trace_builder.process({
event },
trace);
189 check_relation<emit_unencrypted_log>(trace);
192TEST(EmitUnencryptedLogConstrainingTest, ErrorStatic)
196 const std::vector<FF> log_fields = { 4, 5 };
197 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
198 TrackedSideEffects side_effect_states = { .public_logs = PublicLogs{ { { { 4 },
address } } } };
199 const TrackedSideEffects& side_effect_states_after = side_effect_states;
201 EmitUnencryptedLogWriteEvent
event = {
205 .log_address = log_address,
206 .log_size = log_size,
207 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
208 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
210 .values = to_memory_values(log_fields),
211 .error_memory_out_of_bounds =
false,
212 .error_too_many_log_fields =
false,
213 .error_tag_mismatch =
false,
216 TestTraceContainer
trace({
217 { { C::precomputed_first_row, 1 } },
220 EmitUnencryptedLogTraceBuilder trace_builder;
221 trace_builder.process({
event },
trace);
224TEST(EmitUnencryptedLogConstrainingTest, Interactions)
228 const std::vector<FF> log_fields = { 4, 5 };
229 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
230 TrackedSideEffects side_effect_states = { .public_logs = {} };
231 TrackedSideEffects side_effect_states_after = { .public_logs = PublicLogs{ { { log_fields,
address } } } };
232 AvmAccumulatedData accumulated_data = {};
233 accumulated_data.public_logs.add_log({
234 .fields = {
FF(4),
FF(5) },
237 auto public_inputs = PublicInputsBuilder().set_accumulated_data(accumulated_data).build();
241 EmitUnencryptedLogWriteEvent
event = {
245 .log_address = log_address,
246 .log_size = log_size,
247 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
248 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
251 .error_memory_out_of_bounds =
false,
252 .error_too_many_log_fields =
false,
253 .error_tag_mismatch =
false,
256 TestTraceContainer
trace = TestTraceContainer({
259 { C::precomputed_first_row, 1 },
262 { C::gt_input_a, side_effect_states_after.get_num_unencrypted_log_fields() },
268 { C::execution_sel, 1 },
269 { C::execution_sel_exec_dispatch_emit_unencrypted_log, 1 },
270 { C::execution_context_id, 57 },
271 { C::execution_rop_1_, log_address },
272 { C::execution_register_0_, log_size },
273 { C::execution_contract_address,
address },
274 { C::execution_prev_num_unencrypted_log_fields, side_effect_states.get_num_unencrypted_log_fields() },
275 { C::execution_num_unencrypted_log_fields, side_effect_states_after.get_num_unencrypted_log_fields() },
276 { C::execution_is_static,
false },
277 { C::execution_sel_opcode_error, 0 },
278 { C::execution_discard, 0 },
281 { C::gt_input_a, log_address + log_size - 1 },
288 for (uint32_t i = 0; i <
inputs.size(); ++i) {
290 trace.
set(C::memory_address, i + 1, log_address + i);
292 trace.
set(C::memory_tag, i + 1,
static_cast<uint32_t
>(
inputs[i].get_tag()));
296 trace.
set(C::memory_space_id, i + 1, 57);
306 EmitUnencryptedLogTraceBuilder trace_builder;
307 trace_builder.process({
event },
trace);
309 check_relation<emit_unencrypted_log>(trace);
310 check_all_interactions<EmitUnencryptedLogTraceBuilder>(trace);
313TEST(EmitUnencryptedLogConstrainingTest, NegativeStartAfterLatch)
315 TestTraceContainer
trace = TestTraceContainer({ {
316 { C::precomputed_first_row, 1 },
319 { C::emit_unencrypted_log_sel, 1 },
320 { C::emit_unencrypted_log_start, 1 },
321 { C::emit_unencrypted_log_end, 1 },
324 { C::emit_unencrypted_log_sel, 1 },
325 { C::emit_unencrypted_log_start, 1 },
330 trace.
set(C::emit_unencrypted_log_end, 1, 0);
333 "START_AFTER_LATCH");
335 trace.
set(C::emit_unencrypted_log_end, 1, 1);
336 trace.
set(C::precomputed_first_row, 0, 0);
339 "START_AFTER_LATCH");
342TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnStart)
344 TestTraceContainer
trace = TestTraceContainer({ {
345 { C::emit_unencrypted_log_sel, 1 },
346 { C::emit_unencrypted_log_start, 1 },
351 trace.
set(C::emit_unencrypted_log_sel, 0, 0);
354 "SELECTOR_ON_START");
357TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorConsistency)
359 TestTraceContainer
trace = TestTraceContainer({ {
360 { C::precomputed_first_row, 1 },
363 { C::emit_unencrypted_log_sel, 1 },
364 { C::emit_unencrypted_log_start, 1 },
365 { C::emit_unencrypted_log_end, 1 },
368 { C::emit_unencrypted_log_sel, 0 },
373 trace.
set(C::emit_unencrypted_log_end, 1, 0);
377 "SELECTOR_CONSISTENCY");
380TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnEnd)
382 TestTraceContainer
trace = TestTraceContainer({ {
383 { C::emit_unencrypted_log_sel, 1 },
384 { C::emit_unencrypted_log_end, 1 },
389 trace.
set(C::emit_unencrypted_log_sel, 0, 0);
395TEST(EmitUnencryptedLogConstrainingTest, NegativeRemainingRowsDecrement)
397 TestTraceContainer
trace = TestTraceContainer({ {
398 { C::emit_unencrypted_log_sel, 1 },
399 { C::emit_unencrypted_log_remaining_rows, 1 },
402 { C::emit_unencrypted_log_sel, 1 },
403 { C::emit_unencrypted_log_remaining_rows, 0 },
404 { C::emit_unencrypted_log_end, 1 },
409 trace.
set(C::emit_unencrypted_log_remaining_rows, 1, 1);
413 "REMAINING_ROWS_DECREMENT");
416TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorOutOfBoundsConsistency)
418 TestTraceContainer
trace = TestTraceContainer({ {
419 { C::emit_unencrypted_log_sel, 1 },
420 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
423 { C::emit_unencrypted_log_sel, 1 },
424 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
425 { C::emit_unencrypted_log_end, 1 },
430 trace.
set(C::emit_unencrypted_log_error_out_of_bounds, 1, 0);
434 "ERROR_OUT_OF_BOUNDS_CONSISTENCY");
437TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorTagMismatchConsistency)
439 TestTraceContainer
trace = TestTraceContainer({ {
440 { C::emit_unencrypted_log_sel, 1 },
441 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
444 { C::emit_unencrypted_log_sel, 1 },
445 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
446 { C::emit_unencrypted_log_end, 1 },
451 trace.
set(C::emit_unencrypted_log_error_tag_mismatch, 1, 0);
455 "ERROR_TAG_MISMATCH_CONSISTENCY");
458TEST(EmitUnencryptedLogConstrainingTest, NegativeWrongTagCheck)
460 TestTraceContainer
trace = TestTraceContainer({ {
461 { C::emit_unencrypted_log_sel, 1 },
462 { C::emit_unencrypted_log_seen_wrong_tag, 0 },
465 { C::emit_unencrypted_log_sel, 1 },
466 { C::emit_unencrypted_log_seen_wrong_tag, 1 },
467 { C::emit_unencrypted_log_correct_tag, 0 },
468 { C::emit_unencrypted_log_end, 1 },
473 trace.
set(C::emit_unencrypted_log_seen_wrong_tag, 1, 0);
479TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorShouldWriteToPublicInputsConsistency)
481 TestTraceContainer
trace =
482 TestTraceContainer({ {
483 { C::emit_unencrypted_log_sel, 1 },
484 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
487 { C::emit_unencrypted_log_sel, 1 },
488 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
489 { C::emit_unencrypted_log_end, 1 },
494 trace.
set(C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1, 0);
498 "SEL_SHOULD_WRITE_TO_PUBLIC_INPUTS_CONSISTENCY");
501TEST(EmitUnencryptedLogConstrainingTest, NegativeLogOffsetIncrement)
503 TestTraceContainer
trace = TestTraceContainer({ {
504 { C::emit_unencrypted_log_sel, 1 },
505 { C::emit_unencrypted_log_is_write_memory_value, 1 },
506 { C::emit_unencrypted_log_log_address, 10 },
509 { C::emit_unencrypted_log_sel, 1 },
510 { C::emit_unencrypted_log_is_write_memory_value, 1 },
511 { C::emit_unencrypted_log_log_address, 11 },
512 { C::emit_unencrypted_log_end, 1 },
517 trace.
set(C::emit_unencrypted_log_log_address, 1, 9);
521 "LOG_ADDRESS_INCREMENT");
524TEST(EmitUnencryptedLogConstrainingTest, NegativeExecutionClkConsistency)
526 TestTraceContainer
trace = TestTraceContainer({ {
527 { C::emit_unencrypted_log_sel, 1 },
528 { C::emit_unencrypted_log_execution_clk, 1 },
531 { C::emit_unencrypted_log_sel, 1 },
532 { C::emit_unencrypted_log_execution_clk, 1 },
533 { C::emit_unencrypted_log_end, 1 },
538 trace.
set(C::emit_unencrypted_log_execution_clk, 1, 0);
542 "EXEC_CLK_CONSISTENCY");
545TEST(EmitUnencryptedLogConstrainingTest, NegativeSpaceIdConsistency)
547 TestTraceContainer
trace = TestTraceContainer({ {
548 { C::emit_unencrypted_log_sel, 1 },
549 { C::emit_unencrypted_log_space_id, 17 },
552 { C::emit_unencrypted_log_sel, 1 },
553 { C::emit_unencrypted_log_space_id, 17 },
554 { C::emit_unencrypted_log_end, 1 },
559 trace.
set(C::emit_unencrypted_log_space_id, 1, 18);
563 "SPACE_ID_CONSISTENCY");
566TEST(EmitUnencryptedLogConstrainingTest, NegativeContractAddressConsistency)
568 TestTraceContainer
trace = TestTraceContainer({ {
569 { C::emit_unencrypted_log_sel, 1 },
570 { C::emit_unencrypted_log_contract_address, 42 },
573 { C::emit_unencrypted_log_sel, 1 },
574 { C::emit_unencrypted_log_contract_address, 42 },
575 { C::emit_unencrypted_log_end, 1 },
580 trace.
set(C::emit_unencrypted_log_contract_address, 1, 43);
584 "CONTRACT_ADDRESS_CONSISTENCY");
#define FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH
#define AVM_HIGHEST_MEM_ADDRESS
static constexpr size_t SR_SPACE_ID_CONSISTENCY
static constexpr size_t SR_SELECTOR_ON_END
static constexpr size_t SR_START_AFTER_LATCH
static constexpr size_t SR_LOG_ADDRESS_INCREMENT
static constexpr size_t SR_SEL_SHOULD_WRITE_TO_PUBLIC_INPUTS_CONSISTENCY
static constexpr size_t SR_ERROR_TAG_MISMATCH_CONSISTENCY
static constexpr size_t SR_SELECTOR_ON_START
static constexpr size_t SR_WRONG_TAG_CHECK
static constexpr size_t SR_REMAINING_ROWS_DECREMENT
static constexpr size_t SR_ERROR_OUT_OF_BOUNDS_CONSISTENCY
static constexpr size_t SR_EXEC_CLK_CONSISTENCY
static constexpr size_t SR_SELECTOR_CONSISTENCY
static constexpr size_t SR_CONTRACT_ADDRESS_CONSISTENCY
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
std::variant< EmitUnencryptedLogWriteEvent, CheckPointEventType > EmitUnencryptedLogEvent
TestTraceContainer empty_trace()
std::vector< FF > random_fields(size_t n)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
tracegen::PublicInputsTraceBuilder public_inputs_builder