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
25
26namespace bb::avm2::constraining {
27namespace {
28
30using simulation::EmitUnencryptedLogWriteEvent;
31using simulation::TrackedSideEffects;
32using testing::PublicInputsBuilder;
33using tracegen::EmitUnencryptedLogTraceBuilder;
34using tracegen::PublicInputsTraceBuilder;
35using tracegen::TestTraceContainer;
37using C = Column;
38using emit_unencrypted_log = bb::avm2::emit_unencrypted_log<FF>;
39
40std::vector<MemoryValue> to_memory_values(const std::vector<FF>& fields)
41{
42 std::vector<MemoryValue> memory_values;
43 memory_values.reserve(fields.size());
44 for (const FF& field : fields) {
45 memory_values.push_back(MemoryValue::from<FF>(field));
46 }
47 return memory_values;
48}
49
50TEST(EmitUnencryptedLogConstrainingTest, EmptyTrace)
51{
52 check_relation<emit_unencrypted_log>(testing::empty_trace());
53}
54
55TEST(EmitUnencryptedLogConstrainingTest, Positive)
56{
57 AztecAddress address = 0xdeadbeef;
58 MemoryAddress log_address = 27;
59 const std::vector<FF> log_fields = { 4, 5 };
60 uint32_t log_size = static_cast<uint32_t>(log_fields.size());
61 TrackedSideEffects side_effect_states = { .public_logs = {} };
62 TrackedSideEffects side_effect_states_after = { .public_logs = PublicLogs{ { { log_fields, address } } } };
63
64 EmitUnencryptedLogWriteEvent event = {
65 .execution_clk = 1,
66 .contract_address = address,
67 .space_id = 57,
68 .log_address = log_address,
69 .log_size = log_size,
70 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
71 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
72 .is_static = false,
73 .values = to_memory_values(log_fields),
74 .error_memory_out_of_bounds = false,
75 .error_too_many_log_fields = false,
76 .error_tag_mismatch = false,
77 };
78
79 TestTraceContainer trace({
80 { { C::precomputed_first_row, 1 } },
81 });
82
83 EmitUnencryptedLogTraceBuilder trace_builder;
84 trace_builder.process({ event }, trace);
85
86 check_relation<emit_unencrypted_log>(trace);
87}
88
89TEST(EmitUnencryptedLogConstrainingTest, PositiveEmptyLog)
90{
91 // Test created to ensure we do not underflow/fail memory checks for logs with no fields (not including header)
92 AztecAddress address = 0xdeadbeef;
93 MemoryAddress log_address = 0;
94 const std::vector<FF> log_fields = {};
95 uint32_t log_size = static_cast<uint32_t>(log_fields.size());
96 TrackedSideEffects side_effect_states = { .public_logs = {} };
97 TrackedSideEffects side_effect_states_after = { .public_logs = PublicLogs{ { { log_fields, address } } } };
98
99 EmitUnencryptedLogWriteEvent event = {
100 .execution_clk = 1,
101 .contract_address = address,
102 .space_id = 57,
103 .log_address = log_address,
104 .log_size = log_size,
105 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
106 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
107 .is_static = false,
108 .values = to_memory_values(log_fields),
109 .error_memory_out_of_bounds = false,
110 .error_too_many_log_fields = false,
111 .error_tag_mismatch = false,
112 };
113
114 // As calculated in EmitUnencryptedLog::emit_unencrypted_log gadget:
115 uint64_t end_log_address_upper_bound = static_cast<uint64_t>(log_address) + static_cast<uint64_t>(log_size);
116
117 simulation::GreaterThanEvent gt_event = {
118 .a = end_log_address_upper_bound,
119 .b = AVM_MEMORY_SIZE,
120 .result = end_log_address_upper_bound > AVM_MEMORY_SIZE,
121 };
122
123 TestTraceContainer trace({
124 { { C::precomputed_first_row, 1 } },
125 });
126
127 EmitUnencryptedLogTraceBuilder trace_builder;
128 tracegen::GreaterThanTraceBuilder gt_builder;
129 gt_builder.process({ gt_event }, trace);
130 trace_builder.process({ event }, trace);
131
132 // Check tracegen fills the values correctly:
133 FF end_log_address_upper_bound_log_trace = trace.get(C::emit_unencrypted_log_end_log_address_upper_bound, 1);
134 FF end_log_address_upper_bound_gt_trace = trace.get(C::gt_input_a, 0);
135 EXPECT_EQ(end_log_address_upper_bound_log_trace, end_log_address_upper_bound_gt_trace);
136
137 check_relation<emit_unencrypted_log>(trace);
138 check_interaction<EmitUnencryptedLogTraceBuilder, lookup_emit_unencrypted_log_check_memory_out_of_bounds_settings>(
139 trace);
140}
141
142TEST(EmitUnencryptedLogConstrainingTest, ErrorMemoryOutOfBounds)
143{
144 AztecAddress address = 0xdeadbeef;
146 uint32_t log_size = 2;
147 TrackedSideEffects side_effect_states = { .public_logs = PublicLogs{ { { { 4 }, address } } } };
148 const TrackedSideEffects& side_effect_states_after = side_effect_states;
149
150 EmitUnencryptedLogWriteEvent event = {
151 .execution_clk = 1,
152 .contract_address = address,
153 .space_id = 57,
154 .log_address = log_address,
155 .log_size = log_size,
156 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
157 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
158 .is_static = false,
159 .values = {},
160 .error_memory_out_of_bounds = true,
161 .error_too_many_log_fields = false,
162 .error_tag_mismatch = false,
163 };
164
165 TestTraceContainer trace({
166 { { C::precomputed_first_row, 1 } },
167 });
168
169 EmitUnencryptedLogTraceBuilder trace_builder;
170 trace_builder.process({ event }, trace);
171
172 check_relation<emit_unencrypted_log>(trace);
173}
174
175TEST(EmitUnencryptedLogConstrainingTest, ErrorTooManyLogFields)
176{
177 AztecAddress address = 0xdeadbeef;
178 MemoryAddress log_address = 27;
179 const std::vector<FF> log_fields = { 4, 5 };
180 uint32_t log_size = static_cast<uint32_t>(log_fields.size());
181 // Minus three so header = 2 + log_size = 2 doesn't fit
182 TrackedSideEffects side_effect_states = {
183 .public_logs = PublicLogs{ { { testing::random_fields(FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH - 3), address } } }
184 };
185 const TrackedSideEffects& side_effect_states_after = side_effect_states;
186
187 EmitUnencryptedLogWriteEvent event = {
188 .execution_clk = 1,
189 .contract_address = address,
190 .space_id = 57,
191 .log_address = log_address,
192 .log_size = log_size,
193 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
194 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
195 .is_static = false,
196 .values = to_memory_values(log_fields),
197 .error_memory_out_of_bounds = false,
198 .error_too_many_log_fields = true,
199 .error_tag_mismatch = false,
200 };
201
202 TestTraceContainer trace({
203 { { C::precomputed_first_row, 1 } },
204 });
205
206 EmitUnencryptedLogTraceBuilder trace_builder;
207 trace_builder.process({ event }, trace);
208
209 check_relation<emit_unencrypted_log>(trace);
210}
211
212TEST(EmitUnencryptedLogConstrainingTest, ErrorTagMismatch)
213{
214 AztecAddress address = 0xdeadbeef;
215 MemoryAddress log_address = 27;
216 std::vector<MemoryValue> log_values = { MemoryValue::from<uint32_t>(4), MemoryValue::from<uint32_t>(5) };
217 uint32_t log_size = static_cast<uint32_t>(log_values.size());
218 TrackedSideEffects side_effect_states = { .public_logs = {} };
219 // No change to side effect states due to failure.
220 const TrackedSideEffects& side_effect_states_after = side_effect_states;
221
222 EmitUnencryptedLogWriteEvent event = {
223 .execution_clk = 1,
224 .contract_address = address,
225 .space_id = 57,
226 .log_address = log_address,
227 .log_size = log_size,
228 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
229 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
230 .is_static = false,
231 .values = log_values,
232 .error_memory_out_of_bounds = false,
233 .error_too_many_log_fields = false,
234 .error_tag_mismatch = true,
235 };
236
237 TestTraceContainer trace({
238 { { C::precomputed_first_row, 1 } },
239 });
240
241 EmitUnencryptedLogTraceBuilder trace_builder;
242 trace_builder.process({ event }, trace);
243
244 check_relation<emit_unencrypted_log>(trace);
245}
246
247TEST(EmitUnencryptedLogConstrainingTest, ErrorStatic)
248{
249 AztecAddress address = 0xdeadbeef;
250 MemoryAddress log_address = 27;
251 const std::vector<FF> log_fields = { 4, 5 };
252 uint32_t log_size = static_cast<uint32_t>(log_fields.size());
253 TrackedSideEffects side_effect_states = { .public_logs = PublicLogs{ { { { 4 }, address } } } };
254 const TrackedSideEffects& side_effect_states_after = side_effect_states;
255
256 EmitUnencryptedLogWriteEvent event = {
257 .execution_clk = 1,
258 .contract_address = address,
259 .space_id = 57,
260 .log_address = log_address,
261 .log_size = log_size,
262 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
263 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
264 .is_static = true,
265 .values = to_memory_values(log_fields),
266 .error_memory_out_of_bounds = false,
267 .error_too_many_log_fields = false,
268 .error_tag_mismatch = false,
269 };
270
271 TestTraceContainer trace({
272 { { C::precomputed_first_row, 1 } },
273 });
274
275 EmitUnencryptedLogTraceBuilder trace_builder;
276 trace_builder.process({ event }, trace);
277}
278
279TEST(EmitUnencryptedLogConstrainingTest, Interactions)
280{
281 AztecAddress address = 0xdeadbeef;
282 MemoryAddress log_address = 27;
283 const std::vector<FF> log_fields = { 4, 5 };
284 uint32_t log_size = static_cast<uint32_t>(log_fields.size());
285 TrackedSideEffects side_effect_states = { .public_logs = {} };
286 TrackedSideEffects side_effect_states_after = { .public_logs = PublicLogs{ { { log_fields, address } } } };
287 AvmAccumulatedData accumulated_data = {};
288 accumulated_data.public_logs.add_log({
289 .fields = { FF(4), FF(5) },
290 .contract_address = address,
291 });
292 auto public_inputs = PublicInputsBuilder().set_accumulated_data(accumulated_data).build();
293
294 std::vector<MemoryValue> inputs = to_memory_values(log_fields);
295
296 EmitUnencryptedLogWriteEvent event = {
297 .execution_clk = 1,
298 .contract_address = address,
299 .space_id = 57,
300 .log_address = log_address,
301 .log_size = log_size,
302 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
303 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
304 .is_static = false,
305 .values = inputs,
306 .error_memory_out_of_bounds = false,
307 .error_too_many_log_fields = false,
308 .error_tag_mismatch = false,
309 };
310
311 TestTraceContainer trace = TestTraceContainer({
312 // Row 0
313 {
314 { C::precomputed_first_row, 1 },
315 // GT - check log size
316 { C::gt_sel, 1 },
317 { C::gt_input_a, side_effect_states_after.get_num_unencrypted_log_fields() },
318 { C::gt_input_b, FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH },
319 { C::gt_res, 0 },
320 },
321 {
322 // Execution
323 { C::execution_sel, 1 },
324 { C::execution_sel_exec_dispatch_emit_unencrypted_log, 1 },
325 { C::execution_context_id, 57 },
326 { C::execution_rop_1_, log_address },
327 { C::execution_register_0_, log_size },
328 { C::execution_contract_address, address },
329 { C::execution_prev_num_unencrypted_log_fields, side_effect_states.get_num_unencrypted_log_fields() },
330 { C::execution_num_unencrypted_log_fields, side_effect_states_after.get_num_unencrypted_log_fields() },
331 { C::execution_is_static, false },
332 { C::execution_sel_opcode_error, 0 },
333 { C::execution_discard, 0 },
334 // GT - check memory out of bounds
335 { C::gt_sel, 1 },
336 { C::gt_input_a, log_address + log_size },
337 { C::gt_input_b, static_cast<uint64_t>(AVM_MEMORY_SIZE) },
338 { C::gt_res, 0 },
339 },
340 });
341
342 // Set up memory trace
343 for (uint32_t i = 0; i < inputs.size(); ++i) {
344 // Set memory reads
345 trace.set(C::memory_address, i + 1, log_address + i);
346 trace.set(C::memory_value, i + 1, inputs[i].as_ff());
347 trace.set(C::memory_tag, i + 1, static_cast<uint32_t>(inputs[i].get_tag()));
348 trace.set(C::memory_sel, i + 1, 1);
349 trace.set(C::memory_clk, i + 1, 1);
350 trace.set(C::memory_rw, i + 1, 0);
351 trace.set(C::memory_space_id, i + 1, 57);
352 }
353
354 PublicInputsTraceBuilder public_inputs_builder;
355 public_inputs_builder.process_public_inputs(trace, public_inputs);
356 public_inputs_builder.process_public_inputs_aux_precomputed(trace);
357
358 tracegen::PrecomputedTraceBuilder precomputed_builder;
360
361 EmitUnencryptedLogTraceBuilder trace_builder;
362 trace_builder.process({ event }, trace);
363
364 check_relation<emit_unencrypted_log>(trace);
365 check_all_interactions<EmitUnencryptedLogTraceBuilder>(trace);
366}
367
368TEST(EmitUnencryptedLogConstrainingTest, NegativeStartAfterLatch)
369{
370 TestTraceContainer trace = TestTraceContainer({ {
371 { C::precomputed_first_row, 1 },
372 },
373 {
374 { C::emit_unencrypted_log_sel, 1 },
375 { C::emit_unencrypted_log_start, 1 },
376 { C::emit_unencrypted_log_end, 1 },
377 },
378 {
379 { C::emit_unencrypted_log_sel, 1 },
380 { C::emit_unencrypted_log_start, 1 },
381 } });
382
383 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_START_AFTER_LATCH);
384
385 trace.set(C::emit_unencrypted_log_end, 1, 0);
386
387 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_START_AFTER_LATCH),
388 "START_AFTER_LATCH");
389
390 trace.set(C::emit_unencrypted_log_end, 1, 1);
391 trace.set(C::precomputed_first_row, 0, 0);
392
393 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_START_AFTER_LATCH),
394 "START_AFTER_LATCH");
395}
396
397TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnStart)
398{
399 TestTraceContainer trace = TestTraceContainer({ {
400 { C::emit_unencrypted_log_sel, 1 },
401 { C::emit_unencrypted_log_start, 1 },
402 } });
403
404 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_ON_START);
405
406 trace.set(C::emit_unencrypted_log_sel, 0, 0);
407
408 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_ON_START),
409 "SELECTOR_ON_START");
410}
411
412TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorConsistency)
413{
414 TestTraceContainer trace = TestTraceContainer({ {
415 { C::precomputed_first_row, 1 },
416 },
417 {
418 { C::emit_unencrypted_log_sel, 1 },
419 { C::emit_unencrypted_log_start, 1 },
420 { C::emit_unencrypted_log_end, 1 },
421 },
422 {
423 { C::emit_unencrypted_log_sel, 0 },
424 } });
425
426 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_CONSISTENCY);
427
428 trace.set(C::emit_unencrypted_log_end, 1, 0);
429
431 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_CONSISTENCY),
432 "SELECTOR_CONSISTENCY");
433}
434
435TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorOnEnd)
436{
437 TestTraceContainer trace = TestTraceContainer({ {
438 { C::emit_unencrypted_log_sel, 1 },
439 { C::emit_unencrypted_log_end, 1 },
440 } });
441
442 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_ON_END);
443
444 trace.set(C::emit_unencrypted_log_sel, 0, 0);
445
446 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SELECTOR_ON_END),
447 "SELECTOR_ON_END");
448}
449
450TEST(EmitUnencryptedLogConstrainingTest, NegativeRemainingRowsDecrement)
451{
452 TestTraceContainer trace = TestTraceContainer({ {
453 { C::emit_unencrypted_log_sel, 1 },
454 { C::emit_unencrypted_log_remaining_rows, 1 },
455 },
456 {
457 { C::emit_unencrypted_log_sel, 1 },
458 { C::emit_unencrypted_log_remaining_rows, 0 },
459 { C::emit_unencrypted_log_end, 1 },
460 } });
461
462 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_REMAINING_ROWS_DECREMENT);
463
464 trace.set(C::emit_unencrypted_log_remaining_rows, 1, 1);
465
467 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_REMAINING_ROWS_DECREMENT),
468 "REMAINING_ROWS_DECREMENT");
469}
470
471TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorOutOfBoundsConsistency)
472{
473 TestTraceContainer trace = TestTraceContainer({ {
474 { C::emit_unencrypted_log_sel, 1 },
475 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
476 },
477 {
478 { C::emit_unencrypted_log_sel, 1 },
479 { C::emit_unencrypted_log_error_out_of_bounds, 1 },
480 { C::emit_unencrypted_log_end, 1 },
481 } });
482
483 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_ERROR_OUT_OF_BOUNDS_CONSISTENCY);
484
485 trace.set(C::emit_unencrypted_log_error_out_of_bounds, 1, 0);
486
488 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_ERROR_OUT_OF_BOUNDS_CONSISTENCY),
489 "ERROR_OUT_OF_BOUNDS_CONSISTENCY");
490}
491
492TEST(EmitUnencryptedLogConstrainingTest, NegativeErrorTagMismatchConsistency)
493{
494 TestTraceContainer trace = TestTraceContainer({ {
495 { C::emit_unencrypted_log_sel, 1 },
496 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
497 },
498 {
499 { C::emit_unencrypted_log_sel, 1 },
500 { C::emit_unencrypted_log_error_tag_mismatch, 1 },
501 { C::emit_unencrypted_log_end, 1 },
502 } });
503
504 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_ERROR_TAG_MISMATCH_CONSISTENCY);
505
506 trace.set(C::emit_unencrypted_log_error_tag_mismatch, 1, 0);
507
509 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_ERROR_TAG_MISMATCH_CONSISTENCY),
510 "ERROR_TAG_MISMATCH_CONSISTENCY");
511}
512
513TEST(EmitUnencryptedLogConstrainingTest, NegativeWrongTagCheck)
514{
515 TestTraceContainer trace = TestTraceContainer({ {
516 { C::emit_unencrypted_log_sel, 1 },
517 { C::emit_unencrypted_log_seen_wrong_tag, 0 },
518 },
519 {
520 { C::emit_unencrypted_log_sel, 1 },
521 { C::emit_unencrypted_log_seen_wrong_tag, 1 },
522 { C::emit_unencrypted_log_correct_tag, 0 },
523 { C::emit_unencrypted_log_end, 1 },
524 } });
525
526 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_WRONG_TAG_CHECK);
527
528 trace.set(C::emit_unencrypted_log_seen_wrong_tag, 1, 0);
529
530 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_WRONG_TAG_CHECK),
531 "WRONG_TAG_CHECK");
532}
533
534TEST(EmitUnencryptedLogConstrainingTest, NegativeSelectorShouldWriteToPublicInputsConsistency)
535{
536 TestTraceContainer trace =
537 TestTraceContainer({ {
538 { C::emit_unencrypted_log_sel, 1 },
539 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
540 },
541 {
542 { C::emit_unencrypted_log_sel, 1 },
543 { C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1 },
544 { C::emit_unencrypted_log_end, 1 },
545 } });
546
547 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SEL_SHOULD_WRITE_TO_PUBLIC_INPUTS_CONSISTENCY);
548
549 trace.set(C::emit_unencrypted_log_sel_should_write_to_public_inputs, 1, 0);
550
551 EXPECT_THROW_WITH_MESSAGE(check_relation<emit_unencrypted_log>(
553 "SEL_SHOULD_WRITE_TO_PUBLIC_INPUTS_CONSISTENCY");
554}
555
556TEST(EmitUnencryptedLogConstrainingTest, NegativeLogOffsetIncrement)
557{
558 TestTraceContainer trace = TestTraceContainer({ {
559 { C::emit_unencrypted_log_sel, 1 },
560 { C::emit_unencrypted_log_is_write_memory_value, 1 },
561 { C::emit_unencrypted_log_log_address, 10 },
562 },
563 {
564 { C::emit_unencrypted_log_sel, 1 },
565 { C::emit_unencrypted_log_is_write_memory_value, 1 },
566 { C::emit_unencrypted_log_log_address, 11 },
567 { C::emit_unencrypted_log_end, 1 },
568 } });
569
570 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_LOG_ADDRESS_INCREMENT);
571
572 trace.set(C::emit_unencrypted_log_log_address, 1, 9);
573
575 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_LOG_ADDRESS_INCREMENT),
576 "LOG_ADDRESS_INCREMENT");
577}
578
579TEST(EmitUnencryptedLogConstrainingTest, NegativeExecutionClkConsistency)
580{
581 TestTraceContainer trace = TestTraceContainer({ {
582 { C::emit_unencrypted_log_sel, 1 },
583 { C::emit_unencrypted_log_execution_clk, 1 },
584 },
585 {
586 { C::emit_unencrypted_log_sel, 1 },
587 { C::emit_unencrypted_log_execution_clk, 1 },
588 { C::emit_unencrypted_log_end, 1 },
589 } });
590
591 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_EXEC_CLK_CONSISTENCY);
592
593 trace.set(C::emit_unencrypted_log_execution_clk, 1, 0);
594
596 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_EXEC_CLK_CONSISTENCY),
597 "EXEC_CLK_CONSISTENCY");
598}
599
600TEST(EmitUnencryptedLogConstrainingTest, NegativeSpaceIdConsistency)
601{
602 TestTraceContainer trace = TestTraceContainer({ {
603 { C::emit_unencrypted_log_sel, 1 },
604 { C::emit_unencrypted_log_space_id, 17 },
605 },
606 {
607 { C::emit_unencrypted_log_sel, 1 },
608 { C::emit_unencrypted_log_space_id, 17 },
609 { C::emit_unencrypted_log_end, 1 },
610 } });
611
612 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SPACE_ID_CONSISTENCY);
613
614 trace.set(C::emit_unencrypted_log_space_id, 1, 18);
615
617 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_SPACE_ID_CONSISTENCY),
618 "SPACE_ID_CONSISTENCY");
619}
620
621TEST(EmitUnencryptedLogConstrainingTest, NegativeContractAddressConsistency)
622{
623 TestTraceContainer trace = TestTraceContainer({ {
624 { C::emit_unencrypted_log_sel, 1 },
625 { C::emit_unencrypted_log_contract_address, 42 },
626 },
627 {
628 { C::emit_unencrypted_log_sel, 1 },
629 { C::emit_unencrypted_log_contract_address, 42 },
630 { C::emit_unencrypted_log_end, 1 },
631 } });
632
633 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_CONTRACT_ADDRESS_CONSISTENCY);
634
635 trace.set(C::emit_unencrypted_log_contract_address, 1, 43);
636
638 check_relation<emit_unencrypted_log>(trace, emit_unencrypted_log::SR_CONTRACT_ADDRESS_CONSISTENCY),
639 "CONTRACT_ADDRESS_CONSISTENCY");
640}
641
642} // namespace
643
644} // namespace bb::avm2::constraining
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
Definition assert.hpp:192
#define FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH
#define AVM_MEMORY_SIZE
#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(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
Definition gt_trace.cpp:11
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
const FF & get(Column col, uint32_t row) const
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
Definition alu.test.cpp:120
GreaterThanTraceBuilder gt_builder
Definition alu.test.cpp:123
TestTraceContainer trace
AvmProvingInputs inputs
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
std::variant< EmitUnencryptedLogWriteEvent, CheckPointEventType > EmitUnencryptedLogEvent
TestTraceContainer empty_trace()
Definition fixtures.cpp:153
std::vector< FF > random_fields(size_t n)
Definition fixtures.cpp:23
uint32_t MemoryAddress
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
tracegen::PublicInputsTraceBuilder public_inputs_builder
Definition tx.test.cpp:81