1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
27using simulation::EmitUnencryptedLogWriteEvent;
28using testing::PublicInputsBuilder;
29using tracegen::EmitUnencryptedLogTraceBuilder;
30using tracegen::PublicInputsTraceBuilder;
31using tracegen::TestTraceContainer;
39 values.push_back(MemoryValue::from<FF>(
FF(0)));
44TEST(EmitUnencryptedLogConstrainingTest, EmptyTrace)
49TEST(EmitUnencryptedLogConstrainingTest, Positive)
53 uint32_t log_size = 2;
54 SideEffectStates side_effect_states = { .numUnencryptedLogs = 0 };
55 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
57 EmitUnencryptedLogWriteEvent
event = {
59 .contract_address = address,
61 .log_address = log_address,
63 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
64 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
66 .values = pad_values({ MemoryValue::from<FF>(
FF(4)), MemoryValue::from<FF>(
FF(5)) }),
67 .error_too_large =
false,
68 .error_memory_out_of_bounds =
false,
69 .error_too_many_logs =
false,
70 .error_tag_mismatch =
false,
74 { .precomputed_first_row = 1 },
77 EmitUnencryptedLogTraceBuilder trace_builder;
78 trace_builder.process({
event },
trace);
80 check_relation<emit_unencrypted_log>(
trace);
83TEST(EmitUnencryptedLogConstrainingTest, ErrorTooLarge)
88 SideEffectStates side_effect_states = { .numUnencryptedLogs = 1 };
89 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
91 EmitUnencryptedLogWriteEvent
event = {
93 .contract_address = address,
95 .log_address = log_address,
97 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
98 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
100 .values = pad_values({ MemoryValue::from<FF>(
FF(4)), MemoryValue::from<FF>(
FF(5)) }),
101 .error_too_large =
true,
102 .error_memory_out_of_bounds =
false,
103 .error_too_many_logs =
false,
104 .error_tag_mismatch =
false,
108 { .precomputed_first_row = 1 },
111 EmitUnencryptedLogTraceBuilder trace_builder;
112 trace_builder.process({
event },
trace);
114 check_relation<emit_unencrypted_log>(
trace);
117TEST(EmitUnencryptedLogConstrainingTest, ErrorMemoryOutOfBounds)
121 uint32_t log_size = 2;
122 SideEffectStates side_effect_states = { .numUnencryptedLogs = 1 };
123 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
125 EmitUnencryptedLogWriteEvent
event = {
127 .contract_address = address,
129 .log_address = log_address,
130 .log_size = log_size,
131 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
132 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
134 .values = pad_values({}),
135 .error_too_large =
false,
136 .error_memory_out_of_bounds =
true,
137 .error_too_many_logs =
false,
138 .error_tag_mismatch =
false,
142 { .precomputed_first_row = 1 },
145 EmitUnencryptedLogTraceBuilder trace_builder;
146 trace_builder.process({
event },
trace);
148 check_relation<emit_unencrypted_log>(
trace);
151TEST(EmitUnencryptedLogConstrainingTest, ErrorTooManyLogs)
155 uint32_t log_size = 2;
159 EmitUnencryptedLogWriteEvent
event = {
161 .contract_address = address,
163 .log_address = log_address,
164 .log_size = log_size,
165 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
166 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
168 .values = pad_values({ MemoryValue::from<FF>(
FF(4)), MemoryValue::from<FF>(
FF(5)) }),
169 .error_too_large =
false,
170 .error_memory_out_of_bounds =
false,
171 .error_too_many_logs =
true,
172 .error_tag_mismatch =
false,
176 { .precomputed_first_row = 1 },
179 EmitUnencryptedLogTraceBuilder trace_builder;
180 trace_builder.process({
event },
trace);
182 check_relation<emit_unencrypted_log>(
trace);
185TEST(EmitUnencryptedLogConstrainingTest, ErrorTagMismatch)
189 uint32_t log_size = 2;
190 SideEffectStates side_effect_states = { .numUnencryptedLogs = 1 };
191 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
193 EmitUnencryptedLogWriteEvent
event = {
195 .contract_address = address,
197 .log_address = log_address,
198 .log_size = log_size,
199 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
200 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
202 .values = pad_values({ MemoryValue::from<uint32_t>(4), MemoryValue::from<FF>(
FF(5)) }),
203 .error_too_large =
false,
204 .error_memory_out_of_bounds =
false,
205 .error_too_many_logs =
false,
206 .error_tag_mismatch =
true,
210 { .precomputed_first_row = 1 },
213 EmitUnencryptedLogTraceBuilder trace_builder;
214 trace_builder.process({
event },
trace);
216 check_relation<emit_unencrypted_log>(
trace);
219TEST(EmitUnencryptedLogConstrainingTest, ErrorStatic)
223 uint32_t log_size = 2;
224 SideEffectStates side_effect_states = { .numUnencryptedLogs = 1 };
225 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
227 EmitUnencryptedLogWriteEvent
event = {
229 .contract_address = address,
231 .log_address = log_address,
232 .log_size = log_size,
233 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
234 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
236 .values = pad_values({ MemoryValue::from<FF>(
FF(4)), MemoryValue::from<FF>(
FF(5)) }),
237 .error_too_large =
false,
238 .error_memory_out_of_bounds =
false,
239 .error_too_many_logs =
false,
240 .error_tag_mismatch =
false,
244 { .precomputed_first_row = 1 },
247 EmitUnencryptedLogTraceBuilder trace_builder;
248 trace_builder.process({
event },
trace);
251TEST(EmitUnencryptedLogConstrainingTest, Interactions)
255 uint32_t log_size = 2;
256 SideEffectStates side_effect_states = { .numUnencryptedLogs = 0 };
257 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
258 AvmAccumulatedData accumulated_data = {};
259 accumulated_data.publicLogs[0] = {
260 .contractAddress = address,
262 .emittedLength = log_size,
264 AvmAccumulatedDataArrayLengths array_lengths = { .publicLogs = 1 };
265 auto public_inputs = PublicInputsBuilder()
266 .set_accumulated_data(accumulated_data)
267 .set_accumulated_data_array_lengths(array_lengths)
271 MemoryValue::from<FF>(
FF(4)),
272 MemoryValue::from<FF>(
FF(5)),
275 EmitUnencryptedLogWriteEvent
event = {
277 .contract_address = address,
279 .log_address = log_address,
280 .log_size = log_size,
281 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
282 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
284 .values = pad_values(inputs),
285 .error_too_large =
false,
286 .error_memory_out_of_bounds =
false,
287 .error_too_many_logs =
false,
288 .error_tag_mismatch =
false,
291 TestTraceContainer
trace = TestTraceContainer({
294 { C::precomputed_first_row, 1 },
297 { C::gt_input_a, log_size },
303 { C::execution_sel, 1 },
304 { C::execution_sel_execute_emit_unencrypted_log, 1 },
305 { C::execution_context_id, 57 },
306 { C::execution_rop_0_, log_address },
307 { C::execution_register_1_, log_size },
308 { C::execution_contract_address, address },
309 { C::execution_prev_num_unencrypted_logs, side_effect_states.numUnencryptedLogs },
310 { C::execution_num_unencrypted_logs, next_side_effect_states.numUnencryptedLogs },
311 { C::execution_is_static,
false },
312 { C::execution_sel_opcode_error, 0 },
313 { C::execution_discard, 0 },
316 { C::gt_input_a, log_address + log_size - 1 },
323 for (uint32_t i = 0; i < inputs.size(); ++i) {
325 trace.
set(C::memory_address, i + 1, log_address + i);
326 trace.
set(C::memory_value, i + 1, inputs[i].as_ff());
327 trace.
set(C::memory_tag, i + 1,
static_cast<uint32_t
>(inputs[i].get_tag()));
331 trace.
set(C::memory_space_id, i + 1, 57);
334 PublicInputsTraceBuilder public_inputs_builder;
335 public_inputs_builder.process_public_inputs(
trace, public_inputs);
336 public_inputs_builder.process_public_inputs_aux_precomputed(
trace);
341 EmitUnencryptedLogTraceBuilder trace_builder;
342 trace_builder.process({
event },
trace);
344 check_relation<emit_unencrypted_log>(
trace);
345 check_all_interactions<EmitUnencryptedLogTraceBuilder>(
trace);
348TEST(EmitUnencryptedLogConstrainingTest, NegativeStartAfterLatch)
350 TestTraceContainer
trace = TestTraceContainer({ {
351 { C::precomputed_first_row, 1 },
354 { C::emit_unencrypted_log_sel, 1 },
355 { C::emit_unencrypted_log_start, 1 },
356 { C::emit_unencrypted_log_end, 1 },
359 { C::emit_unencrypted_log_sel, 1 },
360 { C::emit_unencrypted_log_start, 1 },
365 trace.
set(C::emit_unencrypted_log_end, 1, 0);
368 "START_AFTER_LATCH");
370 trace.
set(C::emit_unencrypted_log_end, 1, 1);
371 trace.
set(C::precomputed_first_row, 0, 0);
374 "START_AFTER_LATCH");
377TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnStart)
379 TestTraceContainer
trace = TestTraceContainer({ {
380 { C::emit_unencrypted_log_sel, 1 },
381 { C::emit_unencrypted_log_start, 1 },
386 trace.
set(C::emit_unencrypted_log_sel, 0, 0);
389 "SELECTOR_ON_START");
392TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorConsistency)
394 TestTraceContainer
trace = TestTraceContainer({ {
395 { C::precomputed_first_row, 1 },
398 { C::emit_unencrypted_log_sel, 1 },
399 { C::emit_unencrypted_log_start, 1 },
400 { C::emit_unencrypted_log_end, 1 },
403 { C::emit_unencrypted_log_sel, 0 },
408 trace.
set(C::emit_unencrypted_log_end, 1, 0);
412 "SELECTOR_CONSISTENCY");
415TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnEnd)
417 TestTraceContainer
trace = TestTraceContainer({ {
418 { C::emit_unencrypted_log_sel, 1 },
419 { C::emit_unencrypted_log_end, 1 },
424 trace.
set(C::emit_unencrypted_log_sel, 0, 0);
430TEST(EmitUnencryptedLogConstrainingTest, NegativeRemainingRowsDecrement)
432 TestTraceContainer
trace = TestTraceContainer({ {
433 { C::emit_unencrypted_log_sel, 1 },
434 { C::emit_unencrypted_log_remaining_rows, 1 },
437 { C::emit_unencrypted_log_sel, 1 },
438 { C::emit_unencrypted_log_remaining_rows, 0 },
439 { C::emit_unencrypted_log_end, 1 },
444 trace.
set(C::emit_unencrypted_log_remaining_rows, 1, 1);
448 "REMAINING_ROWS_DECREMENT");
451TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorOutOfBoundsConsistency)
453 TestTraceContainer
trace = TestTraceContainer({ {
454 { C::emit_unencrypted_log_sel, 1 },
455 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
458 { C::emit_unencrypted_log_sel, 1 },
459 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
460 { C::emit_unencrypted_log_end, 1 },
465 trace.
set(C::emit_unencrypted_log_error_out_of_bounds, 1, 0);
469 "ERROR_OUT_OF_BOUNDS_CONSISTENCY");
472TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorTagMismatchConsistency)
474 TestTraceContainer
trace = TestTraceContainer({ {
475 { C::emit_unencrypted_log_sel, 1 },
476 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
479 { C::emit_unencrypted_log_sel, 1 },
480 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
481 { C::emit_unencrypted_log_end, 1 },
486 trace.
set(C::emit_unencrypted_log_error_tag_mismatch, 1, 0);
490 "ERROR_TAG_MISMATCH_CONSISTENCY");
493TEST(EmitUnencryptedLogConstrainingTest, NegativeWrongTagCheck)
495 TestTraceContainer
trace = TestTraceContainer({ {
496 { C::emit_unencrypted_log_sel, 1 },
497 { C::emit_unencrypted_log_seen_wrong_tag, 0 },
500 { C::emit_unencrypted_log_sel, 1 },
501 { C::emit_unencrypted_log_seen_wrong_tag, 1 },
502 { C::emit_unencrypted_log_correct_tag, 0 },
503 { C::emit_unencrypted_log_end, 1 },
508 trace.
set(C::emit_unencrypted_log_seen_wrong_tag, 1, 0);
514TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorShouldWriteToPublicInputsConsistency)
516 TestTraceContainer
trace =
517 TestTraceContainer({ {
518 { C::emit_unencrypted_log_sel, 1 },
519 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
522 { C::emit_unencrypted_log_sel, 1 },
523 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
524 { C::emit_unencrypted_log_end, 1 },
529 trace.
set(C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1, 0);
533 "SEL_SHOULD_WRITE_TO_PUBLIC_INPUTS_CONSISTENCY");
536TEST(EmitUnencryptedLogConstrainingTest, NegativeRemainingLogSizeDecrement)
538 TestTraceContainer
trace = TestTraceContainer({ {
539 { C::emit_unencrypted_log_sel, 1 },
540 { C::emit_unencrypted_log_remaining_log_size, 1 },
543 { C::emit_unencrypted_log_sel, 1 },
544 { C::emit_unencrypted_log_remaining_log_size, 0 },
545 { C::emit_unencrypted_log_end, 1 },
550 trace.
set(C::emit_unencrypted_log_remaining_log_size, 1, 1);
554 "REMAINING_LOG_SIZE_DECREMENT");
557TEST(EmitUnencryptedLogConstrainingTest, NegativeLogOffsetIncrement)
559 TestTraceContainer
trace = TestTraceContainer({ {
560 { C::emit_unencrypted_log_sel, 1 },
561 { C::emit_unencrypted_log_log_address, 10 },
564 { C::emit_unencrypted_log_sel, 1 },
565 { C::emit_unencrypted_log_log_address, 11 },
566 { C::emit_unencrypted_log_end, 1 },
571 trace.
set(C::emit_unencrypted_log_log_address, 1, 9);
575 "LOG_ADDRESS_INCREMENT");
578TEST(EmitUnencryptedLogConstrainingTest, NegativeExecutionClkConsistency)
580 TestTraceContainer
trace = TestTraceContainer({ {
581 { C::emit_unencrypted_log_sel, 1 },
582 { C::emit_unencrypted_log_execution_clk, 1 },
585 { C::emit_unencrypted_log_sel, 1 },
586 { C::emit_unencrypted_log_execution_clk, 1 },
587 { C::emit_unencrypted_log_end, 1 },
592 trace.
set(C::emit_unencrypted_log_execution_clk, 1, 0);
596 "EXEC_CLK_CONSISTENCY");
599TEST(EmitUnencryptedLogConstrainingTest, NegativeSpaceIdConsistency)
601 TestTraceContainer
trace = TestTraceContainer({ {
602 { C::emit_unencrypted_log_sel, 1 },
603 { C::emit_unencrypted_log_space_id, 17 },
606 { C::emit_unencrypted_log_sel, 1 },
607 { C::emit_unencrypted_log_space_id, 17 },
608 { C::emit_unencrypted_log_end, 1 },
613 trace.
set(C::emit_unencrypted_log_space_id, 1, 18);
617 "SPACE_ID_CONSISTENCY");
620TEST(EmitUnencryptedLogConstrainingTest, NegativeContractAddressConsistency)
622 TestTraceContainer
trace = TestTraceContainer({ {
623 { C::emit_unencrypted_log_sel, 1 },
624 { C::emit_unencrypted_log_contract_address, 42 },
627 { C::emit_unencrypted_log_sel, 1 },
628 { C::emit_unencrypted_log_contract_address, 42 },
629 { C::emit_unencrypted_log_end, 1 },
634 trace.
set(C::emit_unencrypted_log_contract_address, 1, 43);
638 "CONTRACT_ADDRESS_CONSISTENCY");
641TEST(EmitUnencryptedLogConstrainingTest, NegativeLogSizeConsistency)
643 TestTraceContainer
trace = TestTraceContainer({ {
644 { C::emit_unencrypted_log_sel, 1 },
645 { C::emit_unencrypted_log_log_size, 1 },
648 { C::emit_unencrypted_log_sel, 1 },
649 { C::emit_unencrypted_log_log_size, 1 },
650 { C::emit_unencrypted_log_end, 1 },
655 trace.
set(C::emit_unencrypted_log_log_size, 1, 2);
659 "LOG_SIZE_CONSISTENCY");
#define MAX_PUBLIC_LOGS_PER_TX
#define AVM_HIGHEST_MEM_ADDRESS
#define PUBLIC_LOG_SIZE_IN_FIELDS
static constexpr size_t SR_SPACE_ID_CONSISTENCY
static constexpr size_t SR_REMAINING_LOG_SIZE_DECREMENT
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_LOG_SIZE_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
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)
PrecomputedTraceBuilder precomputed_builder
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
std::variant< EmitUnencryptedLogWriteEvent, CheckPointEventType > EmitUnencryptedLogEvent
TestTraceContainer empty_trace()
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept