Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
sha256.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
4#include <cstdint>
5
23// Temporary imports, see comment in test.
29
30namespace bb::avm2::constraining {
31namespace {
32
33// todo(ilyas): add negative tests
34
35using ::testing::Return;
36using ::testing::StrictMock;
37
38using simulation::Bitwise;
39using simulation::BitwiseEvent;
40using simulation::EventEmitter;
41using simulation::FakeBitwise;
42using simulation::FakeGreaterThan;
43using simulation::FieldGreaterThan;
44using simulation::FieldGreaterThanEvent;
45using simulation::GreaterThan;
46using simulation::GreaterThanEvent;
47using simulation::MemoryStore;
48using simulation::MockExecutionIdManager;
49using simulation::RangeCheck;
50using simulation::RangeCheckEvent;
51using simulation::Sha256;
52using simulation::Sha256CompressionEvent;
53
54using tracegen::BitwiseTraceBuilder;
55using tracegen::GreaterThanTraceBuilder;
56using tracegen::PrecomputedTraceBuilder;
57using tracegen::Sha256TraceBuilder;
58using tracegen::TestTraceContainer;
59
61using C = Column;
63using sha256_mem = bb::avm2::sha256_mem<FF>;
64
65TEST(Sha256ConstrainingTest, EmptyRow)
66{
67 check_relation<sha256>(testing::empty_trace());
68 check_relation<sha256_mem>(testing::empty_trace());
69}
70
71// This test imports a bunch of external code since hand-generating the sha256 trace is a bit laborious atm.
72// The test is a bit of a placeholder for now.
73// TOOD: Replace this with a hardcoded test vector and write a negative test
74TEST(Sha256ConstrainingTest, Basic)
75{
77 StrictMock<MockExecutionIdManager> execution_id_manager;
78 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
79 FakeGreaterThan gt;
80 FakeBitwise bitwise;
81
82 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
83 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
84
85 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
86 MemoryAddress state_addr = 0;
87 for (uint32_t i = 0; i < 8; ++i) {
88 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
89 }
90
91 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
92 MemoryAddress input_addr = 8;
93 for (uint32_t i = 0; i < 16; ++i) {
94 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
95 }
96 MemoryAddress output_addr = 25;
97
98 // We do two compression operations just to ensure the "after-latch" relations are correct
99 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
100 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
101 TestTraceContainer trace;
102 trace.set(C::precomputed_first_row, 0, 1);
103 Sha256TraceBuilder builder;
104 const auto sha256_event_container = sha256_event_emitter.dump_events();
105 builder.process(sha256_event_container, trace);
106
107 check_relation<sha256>(trace);
108}
109
110TEST(Sha256ConstrainingTest, Interaction)
111{
113 StrictMock<MockExecutionIdManager> execution_id_manager;
114 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
115 EventEmitter<BitwiseEvent> bitwise_event_emitter;
116 EventEmitter<GreaterThanEvent> gt_event_emitter;
117 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
118 EventEmitter<RangeCheckEvent> range_check_event_emitter;
119
121 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
122 GreaterThan gt(field_gt, range_check, gt_event_emitter);
123
125
126 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
127 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
128
129 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
130 MemoryAddress state_addr = 0;
131 for (uint32_t i = 0; i < 8; ++i) {
132 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
133 }
134
135 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
136 MemoryAddress input_addr = 8;
137 for (uint32_t i = 0; i < 16; ++i) {
138 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
139 }
140 MemoryAddress output_addr = 25;
141
142 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
143
144 TestTraceContainer trace;
145 Sha256TraceBuilder builder;
146 PrecomputedTraceBuilder precomputed_builder;
147 // Build just enough clk rows for the lookup
148 precomputed_builder.process_misc(trace, 65);
149 precomputed_builder.process_sha256_round_constants(trace);
150
151 BitwiseTraceBuilder bitwise_builder;
152 bitwise_builder.process(bitwise_event_emitter.dump_events(), trace);
153
154 GreaterThanTraceBuilder gt_builder;
155 gt_builder.process(gt_event_emitter.dump_events(), trace);
156
157 builder.process(sha256_event_emitter.get_events(), trace);
158
159 // Check bitwise and round constant lookups
160 check_interaction<Sha256TraceBuilder,
212
213 check_relation<sha256>(trace);
214}
215
219
220TEST(Sha256MemoryConstrainingTest, Basic)
221{
223 StrictMock<MockExecutionIdManager> execution_id_manager;
224 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
225
226 EventEmitter<RangeCheckEvent> range_check_event_emitter;
227 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
228 EventEmitter<GreaterThanEvent> gt_event_emitter;
229
231 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
232 GreaterThan gt(field_gt, range_check, gt_event_emitter);
233 FakeBitwise bitwise;
234
235 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
236 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
237
238 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
239 MemoryAddress state_addr = 0;
240 for (uint32_t i = 0; i < 8; ++i) {
241 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
242 }
243
244 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
245 MemoryAddress input_addr = 8;
246 for (uint32_t i = 0; i < 16; ++i) {
247 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
248 }
249 MemoryAddress output_addr = 25;
250
251 // We do two compression operations just to ensure the "after-latch" relations are correct
252 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
253 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
254 TestTraceContainer trace;
255 trace.set(C::precomputed_first_row, 0, 1);
256
257 Sha256TraceBuilder builder;
258 const auto sha256_event_container = sha256_event_emitter.dump_events();
259 builder.process(sha256_event_container, trace);
260 GreaterThanTraceBuilder gt_builder;
261 gt_builder.process(gt_event_emitter.dump_events(), trace);
262
263 check_relation<sha256_mem>(trace);
264 check_relation<sha256>(trace);
265 check_interaction<Sha256TraceBuilder,
269}
270
271TEST(Sha256MemoryConstrainingTest, SimpleOutOfRangeMemoryAddresses)
272{
274 StrictMock<MockExecutionIdManager> execution_id_manager;
275 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
276
277 EventEmitter<RangeCheckEvent> range_check_event_emitter;
278 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
279 EventEmitter<GreaterThanEvent> gt_event_emitter;
280
282 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
283 GreaterThan gt(field_gt, range_check, gt_event_emitter);
284 FakeBitwise bitwise;
285
286 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
287 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
288
289 MemoryAddress state_addr = AVM_HIGHEST_MEM_ADDRESS - 6; // This will be out of range
290 MemoryAddress input_addr = 8;
291 MemoryAddress output_addr = 25;
292
293 EXPECT_THROW_WITH_MESSAGE(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
294 ".*Memory address out of range.*");
295 TestTraceContainer trace;
296 trace.set(C::precomputed_first_row, 0, 1);
297
298 Sha256TraceBuilder builder;
299 const auto sha256_event_container = sha256_event_emitter.dump_events();
300 builder.process(sha256_event_container, trace);
301 GreaterThanTraceBuilder gt_builder;
302 gt_builder.process(gt_event_emitter.dump_events(), trace);
303
304 check_relation<sha256_mem>(trace);
305 check_relation<sha256>(trace);
306 check_interaction<Sha256TraceBuilder,
310}
311
312TEST(Sha256MemoryConstrainingTest, MultiOutOfRangeMemoryAddresses)
313{
315 StrictMock<MockExecutionIdManager> execution_id_manager;
316 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
317
318 EventEmitter<RangeCheckEvent> range_check_event_emitter;
319 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
320 EventEmitter<GreaterThanEvent> gt_event_emitter;
321
323 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
324 GreaterThan gt(field_gt, range_check, gt_event_emitter);
325 FakeBitwise bitwise;
326
327 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
328 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
329
330 MemoryAddress state_addr = AVM_HIGHEST_MEM_ADDRESS - 6; // This will be out of range
331 MemoryAddress input_addr = AVM_HIGHEST_MEM_ADDRESS - 2; // This will be out of range
332 MemoryAddress output_addr = AVM_HIGHEST_MEM_ADDRESS - 20; // This will be out of range
333
334 EXPECT_THROW_WITH_MESSAGE(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
335 ".*Memory address out of range.*");
336 TestTraceContainer trace;
337 trace.set(C::precomputed_first_row, 0, 1);
338
339 Sha256TraceBuilder builder;
340 const auto sha256_event_container = sha256_event_emitter.dump_events();
341 builder.process(sha256_event_container, trace);
342 GreaterThanTraceBuilder gt_builder;
343 gt_builder.process(gt_event_emitter.dump_events(), trace);
344
345 check_relation<sha256_mem>(trace);
346 check_relation<sha256>(trace);
347 check_interaction<Sha256TraceBuilder,
351}
352
353TEST(Sha256MemoryConstrainingTest, InvalidStateTagErr)
354{
356 StrictMock<MockExecutionIdManager> execution_id_manager;
357 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
358
359 EventEmitter<RangeCheckEvent> range_check_event_emitter;
360 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
361 EventEmitter<GreaterThanEvent> gt_event_emitter;
362
364 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
365 GreaterThan gt(field_gt, range_check, gt_event_emitter);
366 FakeBitwise bitwise;
367
368 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
369 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
370
371 std::array<uint32_t, 7> state = { 0, 1, 2, 3, 4, 5, 6 };
372 MemoryAddress state_addr = 0;
373 for (uint32_t i = 0; i < 7; ++i) {
374 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
375 }
376 // Add an invalid tag
377 mem.set(state_addr + 7, MemoryValue::from<uint64_t>(7));
378
379 MemoryAddress input_addr = 8;
380 MemoryAddress output_addr = 25;
381
382 EXPECT_THROW_WITH_MESSAGE(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
383 ".*Invalid tag for sha256 state values.*");
384 TestTraceContainer trace;
385 trace.set(C::precomputed_first_row, 0, 1);
386
387 Sha256TraceBuilder builder;
388 const auto sha256_event_container = sha256_event_emitter.dump_events();
389 builder.process(sha256_event_container, trace);
390 GreaterThanTraceBuilder gt_builder;
391 gt_builder.process(gt_event_emitter.dump_events(), trace);
392
393 check_relation<sha256_mem>(trace);
394 check_relation<sha256>(trace);
395 check_interaction<Sha256TraceBuilder,
399}
400
401TEST(Sha256MemoryConstrainingTest, InvalidInputTagErr)
402{
404 StrictMock<MockExecutionIdManager> execution_id_manager;
405 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
406
407 EventEmitter<RangeCheckEvent> range_check_event_emitter;
408 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
409 EventEmitter<GreaterThanEvent> gt_event_emitter;
410
412 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
413 GreaterThan gt(field_gt, range_check, gt_event_emitter);
414 FakeBitwise bitwise;
415
416 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
417 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
418
419 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
420 MemoryAddress state_addr = 0;
421 for (uint32_t i = 0; i < 8; ++i) {
422 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
423 }
424
425 std::array<uint32_t, 14> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
426 MemoryAddress input_addr = 8;
427 for (uint32_t i = 0; i < 14; ++i) {
428 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
429 }
430 mem.set(input_addr + 14, MemoryValue::from<uint64_t>(14)); // Add an invalid tag
431 mem.set(input_addr + 15, MemoryValue::from<uint64_t>(15)); // Add an invalid tag
432 MemoryAddress output_addr = 25;
433
434 EXPECT_THROW_WITH_MESSAGE(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
435 ".*Invalid tag for sha256 input values.*");
436 TestTraceContainer trace;
437 trace.set(C::precomputed_first_row, 0, 1);
438
439 Sha256TraceBuilder builder;
440 const auto sha256_event_container = sha256_event_emitter.dump_events();
441 builder.process(sha256_event_container, trace);
442 GreaterThanTraceBuilder gt_builder;
443 gt_builder.process(gt_event_emitter.dump_events(), trace);
444 if (getenv("AVM_DEBUG") != nullptr) {
445 InteractiveDebugger debugger(trace);
446 debugger.run();
447 }
448
449 check_relation<sha256_mem>(trace);
450 check_relation<sha256>(trace);
451 check_interaction<Sha256TraceBuilder,
455}
456
457TEST(Sha256MemoryConstrainingTest, PropagateError)
458{
460 StrictMock<MockExecutionIdManager> execution_id_manager;
461 EXPECT_CALL(execution_id_manager, get_execution_id()).WillOnce(Return(0));
462
463 EventEmitter<RangeCheckEvent> range_check_event_emitter;
464 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
465 EventEmitter<GreaterThanEvent> gt_event_emitter;
466 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
467
469 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
470 GreaterThan gt(field_gt, range_check, gt_event_emitter);
471 FakeBitwise bitwise;
472
473 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
474
475 MemoryAddress state_addr = 0;
476 MemoryAddress input_addr = 8;
477 MemoryAddress output_addr = 25;
478
479 // Set up execution trace
480 TestTraceContainer trace({
481 {
482 { C::precomputed_first_row, 1 },
483 // First invocation fails
484 { C::execution_sel, 1 },
485 { C::execution_context_id, mem.get_space_id() },
486 { C::execution_sel_execute_sha256_compression, 1 },
487 { C::execution_rop_0_, output_addr },
488 { C::execution_rop_1_, state_addr },
489 { C::execution_rop_2_, input_addr },
490 { C::execution_sel_opcode_error, 1 },
491 },
492 });
493 // Add the state values to memory and the memory trace
494 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
495 for (uint32_t i = 0; i < state.size(); ++i) {
496 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
497 trace.set(i,
498 { {
499 { C::memory_sel, 1 },
500 { C::memory_space_id, mem.get_space_id() },
501 { C::memory_address, state_addr + i },
502 { C::memory_value, state[i] },
503 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
504 } });
505 }
506
507 // Add the input values to memory and the memory trace
508 std::array<uint32_t, 13> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
509 for (uint32_t i = 0; i < input.size(); ++i) {
510 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
511 trace.set(i + state.size(),
512 { {
513 { C::memory_sel, 1 },
514 { C::memory_space_id, mem.get_space_id() },
515 { C::memory_address, input_addr + i },
516 { C::memory_value, input[i] },
517 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
518 } });
519 }
520
521 // Add a 14th input that has an invalid tag
522 mem.set(input_addr + 13, MemoryValue::from<uint64_t>(13));
523 trace.set(state.size() + input.size(),
524 { {
525 { C::memory_sel, 1 },
526 { C::memory_space_id, mem.get_space_id() },
527 { C::memory_address, input_addr + 13 },
528 { C::memory_value, 13 },
529 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U64) }, // Invalid tag
530 } });
531
532 EXPECT_THROW(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
533 std::runtime_error); // This will be out of range and throw an error
534
535 Sha256TraceBuilder builder;
536 const auto sha256_event_container = sha256_event_emitter.dump_events();
537 builder.process(sha256_event_container, trace);
538
539 GreaterThanTraceBuilder gt_builder;
540 gt_builder.process(gt_event_emitter.dump_events(), trace);
541
542 PrecomputedTraceBuilder precomputed_builder;
543 precomputed_builder.process_misc(trace, 65); // Enough for round constants
544 precomputed_builder.process_sha256_round_constants(trace);
545
546 if (getenv("AVM_DEBUG") != nullptr) {
547 InteractiveDebugger debugger(trace);
548 debugger.run();
549 }
550
551 check_relation<sha256_mem>(trace);
552 check_relation<sha256>(trace);
553 check_all_interactions<Sha256TraceBuilder>(trace);
554}
555
556TEST(Sha256MemoryConstrainingTest, Complex)
557{
559 StrictMock<MockExecutionIdManager> execution_id_manager;
560 EXPECT_CALL(execution_id_manager, get_execution_id()).WillOnce(Return(0)).WillOnce(Return(1));
561
562 EventEmitter<RangeCheckEvent> range_check_event_emitter;
563 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
564 EventEmitter<GreaterThanEvent> gt_event_emitter;
565 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
566 EventEmitter<BitwiseEvent> bitwise_event_emitter;
567
569 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
570 GreaterThan gt(field_gt, range_check, gt_event_emitter);
572
573 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
574
575 MemoryAddress state_addr = 0;
576 MemoryAddress input_addr = 8;
577 MemoryAddress output_addr = 25;
578
579 // Set up execution trace
580 TestTraceContainer trace({
581 {
582 { C::precomputed_first_row, 1 },
583 // First invocation fails
584 { C::execution_sel, 1 },
585 { C::execution_context_id, mem.get_space_id() },
586 { C::execution_sel_execute_sha256_compression, 1 },
587 { C::execution_rop_0_, AVM_HIGHEST_MEM_ADDRESS - 1 },
588 { C::execution_rop_1_, state_addr },
589 { C::execution_rop_2_, input_addr },
590 { C::execution_sel_opcode_error, 1 },
591 },
592 {
593 // Second invocation passes
594 { C::execution_sel, 1 },
595 { C::execution_context_id, mem.get_space_id() },
596 { C::execution_sel_execute_sha256_compression, 1 },
597 { C::execution_rop_0_, output_addr },
598 { C::execution_rop_1_, state_addr },
599 { C::execution_rop_2_, input_addr },
600 },
601 });
602 // Add the state values to memory and the memory trace
603 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
604 for (uint32_t i = 0; i < state.size(); ++i) {
605 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
606 trace.set(i,
607 { {
608 { C::memory_sel, 1 },
609 { C::memory_clk, 1 },
610 { C::memory_space_id, mem.get_space_id() },
611 { C::memory_address, state_addr + i },
612 { C::memory_value, state[i] },
613 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
614 } });
615 }
616
617 // Add the input values to memory and the memory trace
618 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
619 for (uint32_t i = 0; i < input.size(); ++i) {
620 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
621 trace.set(i + state.size(),
622 { {
623 { C::memory_sel, 1 },
624 { C::memory_clk, 1 },
625 { C::memory_space_id, mem.get_space_id() },
626 { C::memory_address, input_addr + i },
627 { C::memory_value, input[i] },
628 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
629 } });
630 }
631
632 // Compute the expected output and set it in memory
633 std::array<uint32_t, 8> expected_output = simulation::sha256_block(state, input);
634 for (uint32_t i = 0; i < expected_output.size(); ++i) {
635 mem.set(output_addr + i, MemoryValue::from<uint32_t>(expected_output[i]));
636 trace.set(i + state.size() + input.size(),
637 { {
638 { C::memory_sel, 1 },
639 { C::memory_clk, 1 },
640 { C::memory_space_id, mem.get_space_id() },
641 { C::memory_address, output_addr + i },
642 { C::memory_value, expected_output[i] },
643 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
644 { C::memory_rw, 1 }, // Write operations
645 } });
646 }
647
648 EXPECT_THROW(sha256_gadget.compression(mem, state_addr, input_addr, AVM_HIGHEST_MEM_ADDRESS - 1),
649 std::runtime_error); // This will be out of range and throw an error
650 sha256_gadget.compression(mem, state_addr, input_addr, output_addr); // This will succeed
651
652 Sha256TraceBuilder builder;
653 const auto sha256_event_container = sha256_event_emitter.dump_events();
654 builder.process(sha256_event_container, trace);
655
656 GreaterThanTraceBuilder gt_builder;
657 gt_builder.process(gt_event_emitter.dump_events(), trace);
658
659 PrecomputedTraceBuilder precomputed_builder;
660 precomputed_builder.process_misc(trace, 65); // Enough for round constants
661 precomputed_builder.process_sha256_round_constants(trace);
662
663 BitwiseTraceBuilder bitwise_builder;
664 bitwise_builder.process(bitwise_event_emitter.dump_events(), trace);
665
666 if (getenv("AVM_DEBUG") != nullptr) {
667 InteractiveDebugger debugger(trace);
668 debugger.run();
669 }
670
671 check_relation<sha256_mem>(trace);
672 check_relation<sha256>(trace);
673 check_all_interactions<Sha256TraceBuilder>(trace);
674}
675
676} // namespace
677} // namespace bb::avm2::constraining
#define AVM_HIGHEST_MEM_ADDRESS
uint32_t get_space_id() const override
Definition memory.hpp:99
void set(MemoryAddress index, MemoryValue value) override
Definition memory.hpp:98
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
Definition alu.test.cpp:119
AluTraceBuilder builder
Definition alu.test.cpp:123
GreaterThanTraceBuilder gt_builder
Definition alu.test.cpp:122
EventEmitter< GreaterThanEvent > gt_event_emitter
ExecutionIdManager execution_id_manager
MemoryStore mem
EventEmitter< RangeCheckEvent > range_check_event_emitter
RangeCheck range_check
GreaterThan gt
TestTraceContainer trace
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
Definition macros.hpp:7
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
Definition tx.test.cpp:508
std::array< uint32_t, 8 > sha256_block(const std::array< uint32_t, 8 > &h_init, const std::array< uint32_t, 16 > &input)
TestTraceContainer empty_trace()
Definition fixtures.cpp:153
lookup_settings< lookup_sha256_range_rhs_e_6_settings_ > lookup_sha256_range_rhs_e_6_settings
lookup_settings< lookup_sha256_range_comp_b_lhs_settings_ > lookup_sha256_range_comp_b_lhs_settings
lookup_settings< lookup_sha256_w_s_1_xor_1_settings_ > lookup_sha256_w_s_1_xor_1_settings
lookup_settings< lookup_sha256_range_comp_w_rhs_settings_ > lookup_sha256_range_comp_w_rhs_settings
lookup_settings< lookup_sha256_range_rhs_a_13_settings_ > lookup_sha256_range_rhs_a_13_settings
lookup_settings< lookup_sha256_range_rhs_e_11_settings_ > lookup_sha256_range_rhs_e_11_settings
lookup_settings< lookup_sha256_range_rhs_a_22_settings_ > lookup_sha256_range_rhs_a_22_settings
lookup_settings< lookup_sha256_range_comp_h_rhs_settings_ > lookup_sha256_range_comp_h_rhs_settings
lookup_settings< lookup_sha256_mem_check_input_addr_in_range_settings_ > lookup_sha256_mem_check_input_addr_in_range_settings
lookup_settings< lookup_sha256_maj_xor_0_settings_ > lookup_sha256_maj_xor_0_settings
lookup_settings< lookup_sha256_s_1_xor_0_settings_ > lookup_sha256_s_1_xor_0_settings
lookup_settings< lookup_sha256_w_s_0_xor_0_settings_ > lookup_sha256_w_s_0_xor_0_settings
lookup_settings< lookup_sha256_range_rhs_w_18_settings_ > lookup_sha256_range_rhs_w_18_settings
lookup_settings< lookup_sha256_w_s_1_xor_0_settings_ > lookup_sha256_w_s_1_xor_0_settings
lookup_settings< lookup_sha256_range_comp_w_lhs_settings_ > lookup_sha256_range_comp_w_lhs_settings
lookup_settings< lookup_sha256_s_1_xor_1_settings_ > lookup_sha256_s_1_xor_1_settings
lookup_settings< lookup_sha256_range_comp_b_rhs_settings_ > lookup_sha256_range_comp_b_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_10_settings_ > lookup_sha256_range_rhs_w_10_settings
lookup_settings< lookup_sha256_ch_xor_settings_ > lookup_sha256_ch_xor_settings
lookup_settings< lookup_sha256_range_comp_f_lhs_settings_ > lookup_sha256_range_comp_f_lhs_settings
lookup_settings< lookup_sha256_range_comp_c_rhs_settings_ > lookup_sha256_range_comp_c_rhs_settings
lookup_settings< lookup_sha256_range_comp_next_e_lhs_settings_ > lookup_sha256_range_comp_next_e_lhs_settings
lookup_settings< lookup_sha256_maj_and_0_settings_ > lookup_sha256_maj_and_0_settings
lookup_settings< lookup_sha256_range_comp_c_lhs_settings_ > lookup_sha256_range_comp_c_lhs_settings
lookup_settings< lookup_sha256_ch_and_0_settings_ > lookup_sha256_ch_and_0_settings
lookup_settings< lookup_sha256_maj_and_2_settings_ > lookup_sha256_maj_and_2_settings
lookup_settings< lookup_sha256_range_rhs_w_3_settings_ > lookup_sha256_range_rhs_w_3_settings
lookup_settings< lookup_sha256_round_constant_settings_ > lookup_sha256_round_constant_settings
lookup_settings< lookup_sha256_mem_check_state_addr_in_range_settings_ > lookup_sha256_mem_check_state_addr_in_range_settings
lookup_settings< lookup_sha256_range_comp_h_lhs_settings_ > lookup_sha256_range_comp_h_lhs_settings
lookup_settings< lookup_sha256_range_rhs_e_25_settings_ > lookup_sha256_range_rhs_e_25_settings
lookup_settings< lookup_sha256_range_comp_next_e_rhs_settings_ > lookup_sha256_range_comp_next_e_rhs_settings
lookup_settings< lookup_sha256_maj_xor_1_settings_ > lookup_sha256_maj_xor_1_settings
lookup_settings< lookup_sha256_range_comp_f_rhs_settings_ > lookup_sha256_range_comp_f_rhs_settings
lookup_settings< lookup_sha256_range_comp_next_a_lhs_settings_ > lookup_sha256_range_comp_next_a_lhs_settings
lookup_settings< lookup_sha256_s_0_xor_0_settings_ > lookup_sha256_s_0_xor_0_settings
lookup_settings< lookup_sha256_range_comp_g_lhs_settings_ > lookup_sha256_range_comp_g_lhs_settings
lookup_settings< lookup_sha256_w_s_0_xor_1_settings_ > lookup_sha256_w_s_0_xor_1_settings
lookup_settings< lookup_sha256_range_rhs_a_2_settings_ > lookup_sha256_range_rhs_a_2_settings
lookup_settings< lookup_sha256_range_comp_g_rhs_settings_ > lookup_sha256_range_comp_g_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_17_settings_ > lookup_sha256_range_rhs_w_17_settings
lookup_settings< lookup_sha256_s_0_xor_1_settings_ > lookup_sha256_s_0_xor_1_settings
lookup_settings< lookup_sha256_range_rhs_w_7_settings_ > lookup_sha256_range_rhs_w_7_settings
lookup_settings< lookup_sha256_range_comp_e_lhs_settings_ > lookup_sha256_range_comp_e_lhs_settings
lookup_settings< lookup_sha256_ch_and_1_settings_ > lookup_sha256_ch_and_1_settings
lookup_settings< lookup_sha256_maj_and_1_settings_ > lookup_sha256_maj_and_1_settings
lookup_settings< lookup_sha256_range_comp_a_lhs_settings_ > lookup_sha256_range_comp_a_lhs_settings
lookup_settings< lookup_sha256_mem_check_output_addr_in_range_settings_ > lookup_sha256_mem_check_output_addr_in_range_settings
lookup_settings< lookup_sha256_range_comp_next_a_rhs_settings_ > lookup_sha256_range_comp_next_a_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_19_settings_ > lookup_sha256_range_rhs_w_19_settings
lookup_settings< lookup_sha256_range_comp_d_rhs_settings_ > lookup_sha256_range_comp_d_rhs_settings
lookup_settings< lookup_sha256_range_comp_d_lhs_settings_ > lookup_sha256_range_comp_d_lhs_settings
uint32_t MemoryAddress
lookup_settings< lookup_sha256_range_comp_a_rhs_settings_ > lookup_sha256_range_comp_a_rhs_settings
lookup_settings< lookup_sha256_range_comp_e_rhs_settings_ > lookup_sha256_range_comp_e_rhs_settings
Sha256Hash sha256(const ByteContainer &input)
Definition sha256.cpp:142
typename Flavor::FF FF
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Bitwise bitwise
NoopEventEmitter< BitwiseEvent > bitwise_event_emitter
NiceMock< MockFieldGreaterThan > field_gt