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
24// Temporary imports, see comment in test.
30
31namespace bb::avm2::constraining {
32namespace {
33
34// todo(ilyas): add negative tests
35
36using ::testing::Return;
37using ::testing::StrictMock;
38
39using simulation::Bitwise;
40using simulation::BitwiseEvent;
41using simulation::DeduplicatingEventEmitter;
42using simulation::EventEmitter;
43using simulation::FieldGreaterThan;
44using simulation::FieldGreaterThanEvent;
45using simulation::GreaterThan;
46using simulation::GreaterThanEvent;
47using simulation::MemoryStore;
48using simulation::MockExecutionIdManager;
49using simulation::PureBitwise;
50using simulation::PureGreaterThan;
51using simulation::RangeCheck;
52using simulation::RangeCheckEvent;
53using simulation::Sha256;
54using simulation::Sha256CompressionEvent;
55
56using tracegen::BitwiseTraceBuilder;
57using tracegen::GreaterThanTraceBuilder;
58using tracegen::PrecomputedTraceBuilder;
59using tracegen::Sha256TraceBuilder;
60using tracegen::TestTraceContainer;
61
63using C = Column;
65using sha256_mem = bb::avm2::sha256_mem<FF>;
66
67TEST(Sha256ConstrainingTest, EmptyRow)
68{
69 check_relation<sha256>(testing::empty_trace());
70 check_relation<sha256_mem>(testing::empty_trace());
71}
72
73// This test imports a bunch of external code since hand-generating the sha256 trace is a bit laborious atm.
74// The test is a bit of a placeholder for now.
75// TOOD: Replace this with a hardcoded test vector and write a negative test
76TEST(Sha256ConstrainingTest, Basic)
77{
79 StrictMock<MockExecutionIdManager> execution_id_manager;
80 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
81 PureGreaterThan gt;
82 PureBitwise bitwise;
83
84 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
85 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
86
87 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
88 MemoryAddress state_addr = 0;
89 for (uint32_t i = 0; i < 8; ++i) {
90 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
91 }
92
93 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
94 MemoryAddress input_addr = 8;
95 for (uint32_t i = 0; i < 16; ++i) {
96 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
97 }
98 MemoryAddress output_addr = 25;
99
100 // We do two compression operations just to ensure the "after-latch" relations are correct
101 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
102 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
103 TestTraceContainer trace;
104 trace.set(C::precomputed_first_row, 0, 1);
105 Sha256TraceBuilder builder;
106 const auto sha256_event_container = sha256_event_emitter.dump_events();
107 builder.process(sha256_event_container, trace);
108
109 check_relation<sha256>(trace);
110}
111
112TEST(Sha256ConstrainingTest, Interaction)
113{
115 StrictMock<MockExecutionIdManager> execution_id_manager;
116 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
117 EventEmitter<BitwiseEvent> bitwise_event_emitter;
118 EventEmitter<GreaterThanEvent> gt_event_emitter;
119 DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
120 EventEmitter<RangeCheckEvent> range_check_event_emitter;
121
123 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
124 GreaterThan gt(field_gt, range_check, gt_event_emitter);
125
127
128 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
129 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
130
131 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
132 MemoryAddress state_addr = 0;
133 for (uint32_t i = 0; i < 8; ++i) {
134 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
135 }
136
137 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
138 MemoryAddress input_addr = 8;
139 for (uint32_t i = 0; i < 16; ++i) {
140 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
141 }
142 MemoryAddress output_addr = 25;
143
144 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
145
146 TestTraceContainer trace;
147 Sha256TraceBuilder builder;
148 PrecomputedTraceBuilder precomputed_builder;
149 // Build just enough clk rows for the lookup
152
153 BitwiseTraceBuilder bitwise_builder;
154 bitwise_builder.process(bitwise_event_emitter.dump_events(), trace);
155
156 GreaterThanTraceBuilder gt_builder;
158
159 builder.process(sha256_event_emitter.get_events(), trace);
160
161 // Check bitwise and round constant lookups
162 check_interaction<Sha256TraceBuilder,
214
215 check_relation<sha256>(trace);
216}
217
221
222TEST(Sha256MemoryConstrainingTest, Basic)
223{
225 StrictMock<MockExecutionIdManager> execution_id_manager;
226 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
227
228 EventEmitter<RangeCheckEvent> range_check_event_emitter;
229 DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
230 EventEmitter<GreaterThanEvent> gt_event_emitter;
231
233 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
234 GreaterThan gt(field_gt, range_check, gt_event_emitter);
235 PureBitwise bitwise;
236
237 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
238 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
239
240 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
241 MemoryAddress state_addr = 0;
242 for (uint32_t i = 0; i < 8; ++i) {
243 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
244 }
245
246 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
247 MemoryAddress input_addr = 8;
248 for (uint32_t i = 0; i < 16; ++i) {
249 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
250 }
251 MemoryAddress output_addr = 25;
252
253 // We do two compression operations just to ensure the "after-latch" relations are correct
254 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
255 sha256_gadget.compression(mem, state_addr, input_addr, output_addr);
256 TestTraceContainer trace;
257 trace.set(C::precomputed_first_row, 0, 1);
258
259 Sha256TraceBuilder builder;
260 const auto sha256_event_container = sha256_event_emitter.dump_events();
261 builder.process(sha256_event_container, trace);
262 GreaterThanTraceBuilder gt_builder;
264
265 check_relation<sha256_mem>(trace);
266 check_relation<sha256>(trace);
267 check_interaction<Sha256TraceBuilder,
271}
272
273TEST(Sha256MemoryConstrainingTest, SimpleOutOfRangeMemoryAddresses)
274{
276 StrictMock<MockExecutionIdManager> execution_id_manager;
277 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
278
279 EventEmitter<RangeCheckEvent> range_check_event_emitter;
280 DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
281 EventEmitter<GreaterThanEvent> gt_event_emitter;
282
284 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
285 GreaterThan gt(field_gt, range_check, gt_event_emitter);
286 PureBitwise bitwise;
287
288 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
289 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
290
291 MemoryAddress state_addr = static_cast<MemoryAddress>(AVM_HIGHEST_MEM_ADDRESS - 6); // This will be out of range
292 MemoryAddress input_addr = 8;
293 MemoryAddress output_addr = 25;
294
295 EXPECT_THROW_WITH_MESSAGE(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
296 ".*Memory address out of range.*");
297 TestTraceContainer trace;
298 trace.set(C::precomputed_first_row, 0, 1);
299
300 Sha256TraceBuilder builder;
301 const auto sha256_event_container = sha256_event_emitter.dump_events();
302 builder.process(sha256_event_container, trace);
303 GreaterThanTraceBuilder gt_builder;
305
306 check_relation<sha256_mem>(trace);
307 check_relation<sha256>(trace);
308 check_interaction<Sha256TraceBuilder,
312}
313
314TEST(Sha256MemoryConstrainingTest, MultiOutOfRangeMemoryAddresses)
315{
317 StrictMock<MockExecutionIdManager> execution_id_manager;
318 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
319
320 EventEmitter<RangeCheckEvent> range_check_event_emitter;
321 DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
322 EventEmitter<GreaterThanEvent> gt_event_emitter;
323
325 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
326 GreaterThan gt(field_gt, range_check, gt_event_emitter);
327 PureBitwise bitwise;
328
329 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
330 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
331
332 MemoryAddress state_addr = static_cast<MemoryAddress>(AVM_HIGHEST_MEM_ADDRESS - 6); // This will be out of range
333 MemoryAddress input_addr = static_cast<MemoryAddress>(AVM_HIGHEST_MEM_ADDRESS - 2); // This will be out of range
334 MemoryAddress output_addr = static_cast<MemoryAddress>(AVM_HIGHEST_MEM_ADDRESS - 20); // This will be out of range
335
336 EXPECT_THROW_WITH_MESSAGE(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
337 ".*Memory address out of range.*");
338 TestTraceContainer trace;
339 trace.set(C::precomputed_first_row, 0, 1);
340
341 Sha256TraceBuilder builder;
342 const auto sha256_event_container = sha256_event_emitter.dump_events();
343 builder.process(sha256_event_container, trace);
344 GreaterThanTraceBuilder gt_builder;
346
347 check_relation<sha256_mem>(trace);
348 check_relation<sha256>(trace);
349 check_interaction<Sha256TraceBuilder,
353}
354
355TEST(Sha256MemoryConstrainingTest, InvalidStateTagErr)
356{
358 StrictMock<MockExecutionIdManager> execution_id_manager;
359 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
360
361 EventEmitter<RangeCheckEvent> range_check_event_emitter;
362 DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
363 EventEmitter<GreaterThanEvent> gt_event_emitter;
364
366 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
367 GreaterThan gt(field_gt, range_check, gt_event_emitter);
368 PureBitwise bitwise;
369
370 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
371 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
372
373 std::array<uint32_t, 7> state = { 0, 1, 2, 3, 4, 5, 6 };
374 MemoryAddress state_addr = 0;
375 for (uint32_t i = 0; i < 7; ++i) {
376 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
377 }
378 // Add an invalid tag
379 mem.set(state_addr + 7, MemoryValue::from<uint64_t>(7));
380
381 MemoryAddress input_addr = 8;
382 MemoryAddress output_addr = 25;
383
384 EXPECT_THROW_WITH_MESSAGE(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
385 ".*Invalid tag for sha256 state values.*");
386 TestTraceContainer trace;
387 trace.set(C::precomputed_first_row, 0, 1);
388
389 Sha256TraceBuilder builder;
390 const auto sha256_event_container = sha256_event_emitter.dump_events();
391 builder.process(sha256_event_container, trace);
392 GreaterThanTraceBuilder gt_builder;
394
395 check_relation<sha256_mem>(trace);
396 check_relation<sha256>(trace);
397 check_interaction<Sha256TraceBuilder,
401}
402
403TEST(Sha256MemoryConstrainingTest, InvalidInputTagErr)
404{
406 StrictMock<MockExecutionIdManager> execution_id_manager;
407 EXPECT_CALL(execution_id_manager, get_execution_id()).WillRepeatedly(Return(1));
408
409 EventEmitter<RangeCheckEvent> range_check_event_emitter;
410 DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
411 EventEmitter<GreaterThanEvent> gt_event_emitter;
412
414 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
415 GreaterThan gt(field_gt, range_check, gt_event_emitter);
416 PureBitwise bitwise;
417
418 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
419 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
420
421 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
422 MemoryAddress state_addr = 0;
423 for (uint32_t i = 0; i < 8; ++i) {
424 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
425 }
426
427 std::array<uint32_t, 14> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
428 MemoryAddress input_addr = 8;
429 for (uint32_t i = 0; i < 14; ++i) {
430 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
431 }
432 mem.set(input_addr + 14, MemoryValue::from<uint64_t>(14)); // Add an invalid tag
433 mem.set(input_addr + 15, MemoryValue::from<uint64_t>(15)); // Add an invalid tag
434 MemoryAddress output_addr = 25;
435
436 EXPECT_THROW_WITH_MESSAGE(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
437 ".*Invalid tag for sha256 input values.*");
438 TestTraceContainer trace;
439 trace.set(C::precomputed_first_row, 0, 1);
440
441 Sha256TraceBuilder builder;
442 const auto sha256_event_container = sha256_event_emitter.dump_events();
443 builder.process(sha256_event_container, trace);
444 GreaterThanTraceBuilder gt_builder;
446 if (getenv("AVM_DEBUG") != nullptr) {
447 InteractiveDebugger debugger(trace);
448 debugger.run();
449 }
450
451 check_relation<sha256_mem>(trace);
452 check_relation<sha256>(trace);
453 check_interaction<Sha256TraceBuilder,
457}
458
459TEST(Sha256MemoryConstrainingTest, PropagateError)
460{
462 StrictMock<MockExecutionIdManager> execution_id_manager;
463 EXPECT_CALL(execution_id_manager, get_execution_id()).WillOnce(Return(0));
464
465 EventEmitter<RangeCheckEvent> range_check_event_emitter;
466 DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
467 EventEmitter<GreaterThanEvent> gt_event_emitter;
468 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
469
471 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
472 GreaterThan gt(field_gt, range_check, gt_event_emitter);
473 PureBitwise bitwise;
474
475 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
476
477 MemoryAddress state_addr = 0;
478 MemoryAddress input_addr = 8;
479 MemoryAddress output_addr = 25;
480
481 // Set up execution trace
482 TestTraceContainer trace({
483 {
484 { C::precomputed_first_row, 1 },
485 // First invocation fails
486 { C::execution_sel, 1 },
487 { C::execution_context_id, mem.get_space_id() },
488 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
489 { C::execution_rop_0_, output_addr },
490 { C::execution_rop_1_, state_addr },
491 { C::execution_rop_2_, input_addr },
492 { C::execution_sel_opcode_error, 1 },
493 },
494 });
495 // Add the state values to memory and the memory trace
496 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
497 for (uint32_t i = 0; i < state.size(); ++i) {
498 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
499 trace.set(i,
500 { {
501 { C::memory_sel, 1 },
502 { C::memory_space_id, mem.get_space_id() },
503 { C::memory_address, state_addr + i },
504 { C::memory_value, state[i] },
505 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
506 } });
507 }
508
509 // Add the input values to memory and the memory trace
510 std::array<uint32_t, 13> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
511 for (uint32_t i = 0; i < input.size(); ++i) {
512 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
513 trace.set(i + state.size(),
514 { {
515 { C::memory_sel, 1 },
516 { C::memory_space_id, mem.get_space_id() },
517 { C::memory_address, input_addr + i },
518 { C::memory_value, input[i] },
519 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
520 } });
521 }
522
523 // Add a 14th input that has an invalid tag
524 mem.set(input_addr + 13, MemoryValue::from<uint64_t>(13));
525 trace.set(state.size() + input.size(),
526 { {
527 { C::memory_sel, 1 },
528 { C::memory_space_id, mem.get_space_id() },
529 { C::memory_address, input_addr + 13 },
530 { C::memory_value, 13 },
531 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U64) }, // Invalid tag
532 } });
533
534 EXPECT_THROW(sha256_gadget.compression(mem, state_addr, input_addr, output_addr),
535 std::runtime_error); // This will be out of range and throw an error
536
537 Sha256TraceBuilder builder;
538 const auto sha256_event_container = sha256_event_emitter.dump_events();
539 builder.process(sha256_event_container, trace);
540
541 GreaterThanTraceBuilder gt_builder;
543
544 PrecomputedTraceBuilder precomputed_builder;
545 precomputed_builder.process_misc(trace, 65); // Enough for round constants
547
548 if (getenv("AVM_DEBUG") != nullptr) {
549 InteractiveDebugger debugger(trace);
550 debugger.run();
551 }
552
553 check_relation<sha256_mem>(trace);
554 check_relation<sha256>(trace);
555 check_all_interactions<Sha256TraceBuilder>(trace);
556}
557
558TEST(Sha256MemoryConstrainingTest, Complex)
559{
561 StrictMock<MockExecutionIdManager> execution_id_manager;
562 EXPECT_CALL(execution_id_manager, get_execution_id()).WillOnce(Return(0)).WillOnce(Return(1));
563
564 EventEmitter<RangeCheckEvent> range_check_event_emitter;
565 DeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
566 EventEmitter<GreaterThanEvent> gt_event_emitter;
567 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
568 EventEmitter<BitwiseEvent> bitwise_event_emitter;
569
571 FieldGreaterThan field_gt(range_check, field_gt_event_emitter);
572 GreaterThan gt(field_gt, range_check, gt_event_emitter);
574
575 Sha256 sha256_gadget(execution_id_manager, bitwise, gt, sha256_event_emitter);
576
577 MemoryAddress state_addr = 0;
578 MemoryAddress input_addr = 8;
579 MemoryAddress output_addr = 25;
580
581 // Set up execution trace
582 TestTraceContainer trace({
583 {
584 { C::precomputed_first_row, 1 },
585 // First invocation fails
586 { C::execution_sel, 1 },
587 { C::execution_context_id, mem.get_space_id() },
588 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
589 { C::execution_rop_0_, static_cast<MemoryAddress>(AVM_HIGHEST_MEM_ADDRESS - 1) },
590 { C::execution_rop_1_, state_addr },
591 { C::execution_rop_2_, input_addr },
592 { C::execution_sel_opcode_error, 1 },
593 },
594 {
595 // Second invocation passes
596 { C::execution_sel, 1 },
597 { C::execution_context_id, mem.get_space_id() },
598 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
599 { C::execution_rop_0_, output_addr },
600 { C::execution_rop_1_, state_addr },
601 { C::execution_rop_2_, input_addr },
602 },
603 });
604 // Add the state values to memory and the memory trace
605 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
606 for (uint32_t i = 0; i < state.size(); ++i) {
607 mem.set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
608 trace.set(i,
609 { {
610 { C::memory_sel, 1 },
611 { C::memory_clk, 1 },
612 { C::memory_space_id, mem.get_space_id() },
613 { C::memory_address, state_addr + i },
614 { C::memory_value, state[i] },
615 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
616 } });
617 }
618
619 // Add the input values to memory and the memory trace
620 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
621 for (uint32_t i = 0; i < input.size(); ++i) {
622 mem.set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
623 trace.set(i + state.size(),
624 { {
625 { C::memory_sel, 1 },
626 { C::memory_clk, 1 },
627 { C::memory_space_id, mem.get_space_id() },
628 { C::memory_address, input_addr + i },
629 { C::memory_value, input[i] },
630 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
631 } });
632 }
633
634 // Compute the expected output and set it in memory
635 std::array<uint32_t, 8> expected_output = simulation::sha256_block(state, input);
636 for (uint32_t i = 0; i < expected_output.size(); ++i) {
637 mem.set(output_addr + i, MemoryValue::from<uint32_t>(expected_output[i]));
638 trace.set(i + state.size() + input.size(),
639 { {
640 { C::memory_sel, 1 },
641 { C::memory_clk, 1 },
642 { C::memory_space_id, mem.get_space_id() },
643 { C::memory_address, output_addr + i },
644 { C::memory_value, expected_output[i] },
645 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
646 { C::memory_rw, 1 }, // Write operations
647 } });
648 }
649
650 EXPECT_THROW(
651 sha256_gadget.compression(mem, state_addr, input_addr, static_cast<MemoryAddress>(AVM_HIGHEST_MEM_ADDRESS - 1)),
652 std::runtime_error); // This will be out of range and throw an error
653 sha256_gadget.compression(mem, state_addr, input_addr, output_addr); // This will succeed
654
655 Sha256TraceBuilder builder;
656 const auto sha256_event_container = sha256_event_emitter.dump_events();
657 builder.process(sha256_event_container, trace);
658
659 GreaterThanTraceBuilder gt_builder;
661
662 PrecomputedTraceBuilder precomputed_builder;
663 precomputed_builder.process_misc(trace, 65); // Enough for round constants
665
666 BitwiseTraceBuilder bitwise_builder;
667 bitwise_builder.process(bitwise_event_emitter.dump_events(), trace);
668
669 if (getenv("AVM_DEBUG") != nullptr) {
670 InteractiveDebugger debugger(trace);
671 debugger.run();
672 }
673
674 check_relation<sha256_mem>(trace);
675 check_relation<sha256>(trace);
676 check_all_interactions<Sha256TraceBuilder>(trace);
677}
678
679} // namespace
680} // namespace bb::avm2::constraining
#define AVM_HIGHEST_MEM_ADDRESS
void set(MemoryAddress index, MemoryValue value) override
uint16_t get_space_id() const override
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
Definition gt_trace.cpp:11
void process_sha256_round_constants(TraceContainer &trace)
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
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:402
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
FieldGreaterThan field_gt
NoopEventEmitter< FieldGreaterThanEvent > field_gt_event_emitter
NoopEventEmitter< BitwiseEvent > bitwise_event_emitter