Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
emit_unencrypted_log.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
4#include <cstdint>
5
22
23namespace bb::avm2::constraining {
24namespace {
25
27using simulation::EmitUnencryptedLogWriteEvent;
28using testing::PublicInputsBuilder;
29using tracegen::EmitUnencryptedLogTraceBuilder;
30using tracegen::PublicInputsTraceBuilder;
31using tracegen::TestTraceContainer;
33using C = Column;
34using emit_unencrypted_log = bb::avm2::emit_unencrypted_log<FF>;
35
37{
38 while (values.size() < PUBLIC_LOG_SIZE_IN_FIELDS) {
39 values.push_back(MemoryValue::from<FF>(FF(0)));
40 }
41 return values;
42}
43
44TEST(EmitUnencryptedLogConstrainingTest, EmptyTrace)
45{
46 check_relation<emit_unencrypted_log>(testing::empty_trace());
47}
48
49TEST(EmitUnencryptedLogConstrainingTest, Positive)
50{
51 AztecAddress address = 0xdeadbeef;
52 MemoryAddress log_address = 27;
53 uint32_t log_size = 2;
54 SideEffectStates side_effect_states = { .numUnencryptedLogs = 0 };
55 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
56
57 EmitUnencryptedLogWriteEvent event = {
58 .execution_clk = 1,
59 .contract_address = address,
60 .space_id = 57,
61 .log_address = log_address,
62 .log_size = log_size,
63 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
64 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
65 .is_static = false,
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,
71 };
72
73 TestTraceContainer trace = TestTraceContainer::from_rows({
74 { .precomputed_first_row = 1 },
75 });
76
77 EmitUnencryptedLogTraceBuilder trace_builder;
78 trace_builder.process({ event }, trace);
79
80 check_relation<emit_unencrypted_log>(trace);
81}
82
83TEST(EmitUnencryptedLogConstrainingTest, ErrorTooLarge)
84{
85 AztecAddress address = 0xdeadbeef;
86 MemoryAddress log_address = 27;
87 uint32_t log_size = PUBLIC_LOG_SIZE_IN_FIELDS + 1;
88 SideEffectStates side_effect_states = { .numUnencryptedLogs = 1 };
89 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
90
91 EmitUnencryptedLogWriteEvent event = {
92 .execution_clk = 1,
93 .contract_address = address,
94 .space_id = 57,
95 .log_address = log_address,
96 .log_size = log_size,
97 .prev_num_unencrypted_logs = side_effect_states.numUnencryptedLogs,
98 .next_num_unencrypted_logs = next_side_effect_states.numUnencryptedLogs,
99 .is_static = false,
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,
105 };
106
107 TestTraceContainer trace = TestTraceContainer::from_rows({
108 { .precomputed_first_row = 1 },
109 });
110
111 EmitUnencryptedLogTraceBuilder trace_builder;
112 trace_builder.process({ event }, trace);
113
114 check_relation<emit_unencrypted_log>(trace);
115}
116
117TEST(EmitUnencryptedLogConstrainingTest, ErrorMemoryOutOfBounds)
118{
119 AztecAddress address = 0xdeadbeef;
121 uint32_t log_size = 2;
122 SideEffectStates side_effect_states = { .numUnencryptedLogs = 1 };
123 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
124
125 EmitUnencryptedLogWriteEvent event = {
126 .execution_clk = 1,
127 .contract_address = address,
128 .space_id = 57,
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,
133 .is_static = false,
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,
139 };
140
141 TestTraceContainer trace = TestTraceContainer::from_rows({
142 { .precomputed_first_row = 1 },
143 });
144
145 EmitUnencryptedLogTraceBuilder trace_builder;
146 trace_builder.process({ event }, trace);
147
148 check_relation<emit_unencrypted_log>(trace);
149}
150
151TEST(EmitUnencryptedLogConstrainingTest, ErrorTooManyLogs)
152{
153 AztecAddress address = 0xdeadbeef;
154 MemoryAddress log_address = 27;
155 uint32_t log_size = 2;
156 SideEffectStates side_effect_states = { .numUnencryptedLogs = MAX_PUBLIC_LOGS_PER_TX };
157 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = MAX_PUBLIC_LOGS_PER_TX };
158
159 EmitUnencryptedLogWriteEvent event = {
160 .execution_clk = 1,
161 .contract_address = address,
162 .space_id = 57,
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,
167 .is_static = false,
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,
173 };
174
175 TestTraceContainer trace = TestTraceContainer::from_rows({
176 { .precomputed_first_row = 1 },
177 });
178
179 EmitUnencryptedLogTraceBuilder trace_builder;
180 trace_builder.process({ event }, trace);
181
182 check_relation<emit_unencrypted_log>(trace);
183}
184
185TEST(EmitUnencryptedLogConstrainingTest, ErrorTagMismatch)
186{
187 AztecAddress address = 0xdeadbeef;
188 MemoryAddress log_address = 27;
189 uint32_t log_size = 2;
190 SideEffectStates side_effect_states = { .numUnencryptedLogs = 1 };
191 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
192
193 EmitUnencryptedLogWriteEvent event = {
194 .execution_clk = 1,
195 .contract_address = address,
196 .space_id = 57,
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,
201 .is_static = false,
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,
207 };
208
209 TestTraceContainer trace = TestTraceContainer::from_rows({
210 { .precomputed_first_row = 1 },
211 });
212
213 EmitUnencryptedLogTraceBuilder trace_builder;
214 trace_builder.process({ event }, trace);
215
216 check_relation<emit_unencrypted_log>(trace);
217}
218
219TEST(EmitUnencryptedLogConstrainingTest, ErrorStatic)
220{
221 AztecAddress address = 0xdeadbeef;
222 MemoryAddress log_address = 27;
223 uint32_t log_size = 2;
224 SideEffectStates side_effect_states = { .numUnencryptedLogs = 1 };
225 SideEffectStates next_side_effect_states = { .numUnencryptedLogs = 1 };
226
227 EmitUnencryptedLogWriteEvent event = {
228 .execution_clk = 1,
229 .contract_address = address,
230 .space_id = 57,
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,
235 .is_static = true,
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,
241 };
242
243 TestTraceContainer trace = TestTraceContainer::from_rows({
244 { .precomputed_first_row = 1 },
245 });
246
247 EmitUnencryptedLogTraceBuilder trace_builder;
248 trace_builder.process({ event }, trace);
249}
250
251TEST(EmitUnencryptedLogConstrainingTest, Interactions)
252{
253 AztecAddress address = 0xdeadbeef;
254 MemoryAddress log_address = 27;
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,
261 .fields = { 4, 5 },
262 .emittedLength = log_size,
263 };
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)
268 .build();
269
270 std::vector<MemoryValue> inputs = {
271 MemoryValue::from<FF>(FF(4)),
272 MemoryValue::from<FF>(FF(5)),
273 };
274
275 EmitUnencryptedLogWriteEvent event = {
276 .execution_clk = 1,
277 .contract_address = address,
278 .space_id = 57,
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,
283 .is_static = false,
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,
289 };
290
291 TestTraceContainer trace = TestTraceContainer({
292 // Row 0
293 {
294 { C::precomputed_first_row, 1 },
295 // GT - check log size
296 { C::gt_sel, 1 },
297 { C::gt_input_a, log_size },
298 { C::gt_input_b, PUBLIC_LOG_SIZE_IN_FIELDS },
299 { C::gt_res, 0 },
300 },
301 {
302 // Execution
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 },
314 // GT - check memory out of bounds
315 { C::gt_sel, 1 },
316 { C::gt_input_a, log_address + log_size - 1 },
317 { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS },
318 { C::gt_res, 0 },
319 },
320 });
321
322 // Set up memory trace
323 for (uint32_t i = 0; i < inputs.size(); ++i) {
324 // Set memory reads
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()));
328 trace.set(C::memory_sel, i + 1, 1);
329 trace.set(C::memory_clk, i + 1, 1);
330 trace.set(C::memory_rw, i + 1, 0);
331 trace.set(C::memory_space_id, i + 1, 57);
332 }
333
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);
337
338 tracegen::PrecomputedTraceBuilder precomputed_builder;
340
341 EmitUnencryptedLogTraceBuilder trace_builder;
342 trace_builder.process({ event }, trace);
343
344 check_relation<emit_unencrypted_log>(trace);
345 check_all_interactions<EmitUnencryptedLogTraceBuilder>(trace);
346}
347
348TEST(EmitUnencryptedLogConstrainingTest, NegativeStartAfterLatch)
349{
350 TestTraceContainer trace = TestTraceContainer({ {
351 { C::precomputed_first_row, 1 },
352 },
353 {
354 { C::emit_unencrypted_log_sel, 1 },
355 { C::emit_unencrypted_log_start, 1 },
356 { C::emit_unencrypted_log_end, 1 },
357 },
358 {
359 { C::emit_unencrypted_log_sel, 1 },
360 { C::emit_unencrypted_log_start, 1 },
361 } });
362
363 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_START_AFTER_LATCH);
364
365 trace.set(C::emit_unencrypted_log_end, 1, 0);
366
368 "START_AFTER_LATCH");
369
370 trace.set(C::emit_unencrypted_log_end, 1, 1);
371 trace.set(C::precomputed_first_row, 0, 0);
372
374 "START_AFTER_LATCH");
375}
376
377TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnStart)
378{
379 TestTraceContainer trace = TestTraceContainer({ {
380 { C::emit_unencrypted_log_sel, 1 },
381 { C::emit_unencrypted_log_start, 1 },
382 } });
383
384 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_ON_START);
385
386 trace.set(C::emit_unencrypted_log_sel, 0, 0);
387
389 "SELECTOR_ON_START");
390}
391
392TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorConsistency)
393{
394 TestTraceContainer trace = TestTraceContainer({ {
395 { C::precomputed_first_row, 1 },
396 },
397 {
398 { C::emit_unencrypted_log_sel, 1 },
399 { C::emit_unencrypted_log_start, 1 },
400 { C::emit_unencrypted_log_end, 1 },
401 },
402 {
403 { C::emit_unencrypted_log_sel, 0 },
404 } });
405
406 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_CONSISTENCY);
407
408 trace.set(C::emit_unencrypted_log_end, 1, 0);
409
411 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_CONSISTENCY),
412 "SELECTOR_CONSISTENCY");
413}
414
415TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnEnd)
416{
417 TestTraceContainer trace = TestTraceContainer({ {
418 { C::emit_unencrypted_log_sel, 1 },
419 { C::emit_unencrypted_log_end, 1 },
420 } });
421
422 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_ON_END);
423
424 trace.set(C::emit_unencrypted_log_sel, 0, 0);
425
426 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_ON_END),
427 "SELECTOR_ON_END");
428}
429
430TEST(EmitUnencryptedLogConstrainingTest, NegativeRemainingRowsDecrement)
431{
432 TestTraceContainer trace = TestTraceContainer({ {
433 { C::emit_unencrypted_log_sel, 1 },
434 { C::emit_unencrypted_log_remaining_rows, 1 },
435 },
436 {
437 { C::emit_unencrypted_log_sel, 1 },
438 { C::emit_unencrypted_log_remaining_rows, 0 },
439 { C::emit_unencrypted_log_end, 1 },
440 } });
441
442 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_REMAINING_ROWS_DECREMENT);
443
444 trace.set(C::emit_unencrypted_log_remaining_rows, 1, 1);
445
447 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_REMAINING_ROWS_DECREMENT),
448 "REMAINING_ROWS_DECREMENT");
449}
450
451TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorOutOfBoundsConsistency)
452{
453 TestTraceContainer trace = TestTraceContainer({ {
454 { C::emit_unencrypted_log_sel, 1 },
455 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
456 },
457 {
458 { C::emit_unencrypted_log_sel, 1 },
459 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
460 { C::emit_unencrypted_log_end, 1 },
461 } });
462
463 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_ERROR_OUT_OF_BOUNDS_CONSISTENCY);
464
465 trace.set(C::emit_unencrypted_log_error_out_of_bounds, 1, 0);
466
468 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_ERROR_OUT_OF_BOUNDS_CONSISTENCY),
469 "ERROR_OUT_OF_BOUNDS_CONSISTENCY");
470}
471
472TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorTagMismatchConsistency)
473{
474 TestTraceContainer trace = TestTraceContainer({ {
475 { C::emit_unencrypted_log_sel, 1 },
476 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
477 },
478 {
479 { C::emit_unencrypted_log_sel, 1 },
480 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
481 { C::emit_unencrypted_log_end, 1 },
482 } });
483
484 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_ERROR_TAG_MISMATCH_CONSISTENCY);
485
486 trace.set(C::emit_unencrypted_log_error_tag_mismatch, 1, 0);
487
489 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_ERROR_TAG_MISMATCH_CONSISTENCY),
490 "ERROR_TAG_MISMATCH_CONSISTENCY");
491}
492
493TEST(EmitUnencryptedLogConstrainingTest, NegativeWrongTagCheck)
494{
495 TestTraceContainer trace = TestTraceContainer({ {
496 { C::emit_unencrypted_log_sel, 1 },
497 { C::emit_unencrypted_log_seen_wrong_tag, 0 },
498 },
499 {
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 },
504 } });
505
506 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_WRONG_TAG_CHECK);
507
508 trace.set(C::emit_unencrypted_log_seen_wrong_tag, 1, 0);
509
510 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_WRONG_TAG_CHECK),
511 "WRONG_TAG_CHECK");
512}
513
514TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorShouldWriteToPublicInputsConsistency)
515{
516 TestTraceContainer trace =
517 TestTraceContainer({ {
518 { C::emit_unencrypted_log_sel, 1 },
519 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
520 },
521 {
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 },
525 } });
526
528
529 trace.set(C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1, 0);
530
531 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(
533 "SEL_SHOULD_WRITE_TO_PUBLIC_INPUTS_CONSISTENCY");
534}
535
536TEST(EmitUnencryptedLogConstrainingTest, NegativeRemainingLogSizeDecrement)
537{
538 TestTraceContainer trace = TestTraceContainer({ {
539 { C::emit_unencrypted_log_sel, 1 },
540 { C::emit_unencrypted_log_remaining_log_size, 1 },
541 },
542 {
543 { C::emit_unencrypted_log_sel, 1 },
544 { C::emit_unencrypted_log_remaining_log_size, 0 },
545 { C::emit_unencrypted_log_end, 1 },
546 } });
547
548 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_REMAINING_LOG_SIZE_DECREMENT);
549
550 trace.set(C::emit_unencrypted_log_remaining_log_size, 1, 1);
551
553 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_REMAINING_LOG_SIZE_DECREMENT),
554 "REMAINING_LOG_SIZE_DECREMENT");
555}
556
557TEST(EmitUnencryptedLogConstrainingTest, NegativeLogOffsetIncrement)
558{
559 TestTraceContainer trace = TestTraceContainer({ {
560 { C::emit_unencrypted_log_sel, 1 },
561 { C::emit_unencrypted_log_log_address, 10 },
562 },
563 {
564 { C::emit_unencrypted_log_sel, 1 },
565 { C::emit_unencrypted_log_log_address, 11 },
566 { C::emit_unencrypted_log_end, 1 },
567 } });
568
569 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_LOG_ADDRESS_INCREMENT);
570
571 trace.set(C::emit_unencrypted_log_log_address, 1, 9);
572
574 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_LOG_ADDRESS_INCREMENT),
575 "LOG_ADDRESS_INCREMENT");
576}
577
578TEST(EmitUnencryptedLogConstrainingTest, NegativeExecutionClkConsistency)
579{
580 TestTraceContainer trace = TestTraceContainer({ {
581 { C::emit_unencrypted_log_sel, 1 },
582 { C::emit_unencrypted_log_execution_clk, 1 },
583 },
584 {
585 { C::emit_unencrypted_log_sel, 1 },
586 { C::emit_unencrypted_log_execution_clk, 1 },
587 { C::emit_unencrypted_log_end, 1 },
588 } });
589
590 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_EXEC_CLK_CONSISTENCY);
591
592 trace.set(C::emit_unencrypted_log_execution_clk, 1, 0);
593
595 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_EXEC_CLK_CONSISTENCY),
596 "EXEC_CLK_CONSISTENCY");
597}
598
599TEST(EmitUnencryptedLogConstrainingTest, NegativeSpaceIdConsistency)
600{
601 TestTraceContainer trace = TestTraceContainer({ {
602 { C::emit_unencrypted_log_sel, 1 },
603 { C::emit_unencrypted_log_space_id, 17 },
604 },
605 {
606 { C::emit_unencrypted_log_sel, 1 },
607 { C::emit_unencrypted_log_space_id, 17 },
608 { C::emit_unencrypted_log_end, 1 },
609 } });
610
611 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SPACE_ID_CONSISTENCY);
612
613 trace.set(C::emit_unencrypted_log_space_id, 1, 18);
614
616 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SPACE_ID_CONSISTENCY),
617 "SPACE_ID_CONSISTENCY");
618}
619
620TEST(EmitUnencryptedLogConstrainingTest, NegativeContractAddressConsistency)
621{
622 TestTraceContainer trace = TestTraceContainer({ {
623 { C::emit_unencrypted_log_sel, 1 },
624 { C::emit_unencrypted_log_contract_address, 42 },
625 },
626 {
627 { C::emit_unencrypted_log_sel, 1 },
628 { C::emit_unencrypted_log_contract_address, 42 },
629 { C::emit_unencrypted_log_end, 1 },
630 } });
631
632 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_CONTRACT_ADDRESS_CONSISTENCY);
633
634 trace.set(C::emit_unencrypted_log_contract_address, 1, 43);
635
637 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_CONTRACT_ADDRESS_CONSISTENCY),
638 "CONTRACT_ADDRESS_CONSISTENCY");
639}
640
641TEST(EmitUnencryptedLogConstrainingTest, NegativeLogSizeConsistency)
642{
643 TestTraceContainer trace = TestTraceContainer({ {
644 { C::emit_unencrypted_log_sel, 1 },
645 { C::emit_unencrypted_log_log_size, 1 },
646 },
647 {
648 { C::emit_unencrypted_log_sel, 1 },
649 { C::emit_unencrypted_log_log_size, 1 },
650 { C::emit_unencrypted_log_end, 1 },
651 } });
652
653 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_LOG_SIZE_CONSISTENCY);
654
655 trace.set(C::emit_unencrypted_log_log_size, 1, 2);
656
658 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_LOG_SIZE_CONSISTENCY),
659 "LOG_SIZE_CONSISTENCY");
660}
661
662} // namespace
663
664} // namespace bb::avm2::constraining
#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)
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
Definition alu.test.cpp:119
TestTraceContainer trace
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
Definition macros.hpp:7
AvmFlavorSettings::FF FF
TEST(TxExecutionConstrainingTest, WriteTreeValue)
Definition tx.test.cpp:508
std::variant< EmitUnencryptedLogWriteEvent, CheckPointEventType > EmitUnencryptedLogEvent
TestTraceContainer empty_trace()
Definition fixtures.cpp:153
uint32_t MemoryAddress
typename Flavor::FF FF
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13