2#include <gmock/gmock.h>
3#include <gtest/gtest.h>
32using ::testing::StrictMock;
36using simulation::EventEmitter;
37using simulation::MockExecutionIdManager;
38using simulation::MockGreaterThan;
39using simulation::Poseidon2;
40using simulation::Poseidon2HashEvent;
41using simulation::Poseidon2PermutationEvent;
42using simulation::Poseidon2PermutationMemoryEvent;
43using tracegen::CalldataTraceBuilder;
44using tracegen::Poseidon2TraceBuilder;
45using tracegen::PrecomputedTraceBuilder;
46using tracegen::TestTraceContainer;
53class CalldataHashingConstrainingTest :
public ::testing::Test {
67class CalldataHashingConstrainingTestTraceHelper :
public CalldataHashingConstrainingTest {
69 TestTraceContainer process_calldata_hashing_trace(std::vector<std::vector<FF>> all_calldata_fields,
70 std::vector<uint32_t> context_ids)
75 TestTraceContainer
trace({
76 { { C::precomputed_first_row, 1 } },
80 for (uint32_t j = 0; j < all_calldata_fields.size(); j++) {
82 auto calldata_fields = all_calldata_fields[j];
86 auto calldata_field_at = [&calldata_fields](
size_t i) ->
FF {
87 return i < calldata_fields.size() ? calldata_fields[i] : 0;
91 .calldata = all_calldata_fields[j],
92 .calldata_hash = hash,
94 auto padding_amount = (3 - (calldata_fields.size() % 3)) % 3;
95 auto num_rounds = (calldata_fields.size() + padding_amount) / 3;
96 for (uint32_t i = 0; i < calldata_fields.size(); i += 3) {
100 { C::calldata_hashing_sel, 1 },
101 { C::calldata_hashing_start,
index == 0 ? 1 : 0 },
102 { C::calldata_hashing_sel_not_start,
index == 0 ? 0 : 1 },
103 { C::calldata_hashing_context_id,
context_id },
104 { C::calldata_hashing_calldata_size, calldata_fields.size() - 1 },
105 { C::calldata_hashing_input_len, calldata_fields.size() },
106 { C::calldata_hashing_rounds_rem, num_rounds },
107 { C::calldata_hashing_index_0_,
index },
108 { C::calldata_hashing_index_1_,
index + 1 },
109 { C::calldata_hashing_index_2_,
index + 2 },
110 { C::calldata_hashing_input_0_, calldata_field_at(
index) },
111 { C::calldata_hashing_input_1_, calldata_field_at(
index + 1) },
112 { C::calldata_hashing_input_2_, calldata_field_at(
index + 2) },
113 { C::calldata_hashing_output_hash, hash },
114 { C::calldata_hashing_sel_not_padding_1, (num_rounds == 1) && (padding_amount == 2) ? 0 : 1 },
115 { C::calldata_hashing_sel_not_padding_2, (num_rounds == 1) && (padding_amount > 0) ? 0 : 1 },
116 { C::calldata_hashing_end, (num_rounds == 1) ? 1 : 0 },
117 { C::calldata_hashing_sel_end_not_empty,
118 (num_rounds == 1) && !calldata_fields.empty() ? 1 : 0 },
132TEST_F(CalldataHashingConstrainingTest, EmptyRow)
137TEST_F(CalldataHashingConstrainingTest, SingleCalldataHashOneRow)
141 std::vector<FF> calldata_fields = { 1, 2 };
145 auto trace = TestTraceContainer({
146 { { C::precomputed_first_row, 1 } },
148 { C::calldata_hashing_index_1_, 1 },
149 { C::calldata_hashing_index_2_, 2 },
151 { C::calldata_hashing_input_1_, 1 },
152 { C::calldata_hashing_input_2_, 2 },
153 { C::calldata_hashing_input_len, 3 },
154 { C::calldata_hashing_end, 1 },
155 { C::calldata_hashing_sel_not_padding_1, 1 },
156 { C::calldata_hashing_sel_not_padding_2, 1 },
157 { C::calldata_hashing_sel_not_start, 0 },
158 { C::calldata_hashing_calldata_size, 2 },
159 { C::calldata_hashing_context_id, 1 },
160 { C::calldata_hashing_index_0_, 0 },
161 { C::calldata_hashing_output_hash, hash },
162 { C::calldata_hashing_rounds_rem, 1 },
163 { C::calldata_hashing_sel, 1 },
164 { C::calldata_hashing_start, 1 },
165 { C::calldata_hashing_sel_end_not_empty, 1 },
169 builder.process_retrieval({ { .context_id = 1, .calldata = calldata_fields } },
trace);
172 check_relation<calldata_hashing>(trace);
173 check_all_interactions<CalldataTraceBuilder>(trace);
176TEST_F(CalldataHashingConstrainingTest, SingleCalldataHashOneElt)
180 std::vector<FF> calldata_fields = { 2 };
184 auto trace = TestTraceContainer({
185 { { C::precomputed_first_row, 1 } },
187 { C::calldata_hashing_index_1_, 1 },
188 { C::calldata_hashing_index_2_, 2 },
190 { C::calldata_hashing_input_1_, 2 },
191 { C::calldata_hashing_input_2_, 0 },
192 { C::calldata_hashing_input_len, 2 },
193 { C::calldata_hashing_end, 1 },
194 { C::calldata_hashing_sel_not_padding_1, 1 },
195 { C::calldata_hashing_sel_not_padding_2, 0 },
196 { C::calldata_hashing_sel_not_start, 0 },
197 { C::calldata_hashing_calldata_size, 1 },
198 { C::calldata_hashing_context_id, 1 },
199 { C::calldata_hashing_index_0_, 0 },
200 { C::calldata_hashing_output_hash, hash },
201 { C::calldata_hashing_rounds_rem, 1 },
202 { C::calldata_hashing_sel, 1 },
203 { C::calldata_hashing_start, 1 },
204 { C::calldata_hashing_sel_end_not_empty, 1 },
208 builder.process_retrieval({ { .context_id = 1, .calldata = calldata_fields } },
trace);
211 check_relation<calldata_hashing>(trace);
212 check_all_interactions<CalldataTraceBuilder>(trace);
215TEST_F(CalldataHashingConstrainingTest, EmptyCalldataHash)
219 std::vector<FF> calldata_fields = {};
223 auto trace = TestTraceContainer({
224 { { C::precomputed_first_row, 1 } },
226 { C::calldata_hashing_index_1_, 1 },
227 { C::calldata_hashing_index_2_, 2 },
229 { C::calldata_hashing_input_1_, 0 },
230 { C::calldata_hashing_input_2_, 0 },
231 { C::calldata_hashing_input_len, 1 },
232 { C::calldata_hashing_end, 1 },
233 { C::calldata_hashing_sel_not_padding_1, 0 },
234 { C::calldata_hashing_sel_not_padding_2, 0 },
235 { C::calldata_hashing_sel_not_start, 0 },
236 { C::calldata_hashing_calldata_size, 0 },
237 { C::calldata_hashing_context_id, 1 },
238 { C::calldata_hashing_index_0_, 0 },
239 { C::calldata_hashing_output_hash, hash },
240 { C::calldata_hashing_rounds_rem, 1 },
241 { C::calldata_hashing_sel, 1 },
242 { C::calldata_hashing_start, 1 },
246 builder.process_retrieval({ { .context_id = 1, .calldata = calldata_fields } },
trace);
249 check_relation<calldata_hashing>(trace);
250 check_all_interactions<CalldataTraceBuilder>(trace);
253TEST_F(CalldataHashingConstrainingTestTraceHelper, EmptyCalldataHash)
255 TestTraceContainer
trace = process_calldata_hashing_trace({}, { 1 });
257 check_relation<calldata_hashing>(trace);
258 check_all_interactions<CalldataTraceBuilder>(trace);
261TEST_F(CalldataHashingConstrainingTestTraceHelper, SingleCalldataHash100Fields)
264 FF hash =
FF(
"0x14a1539bdb1d26e03097cf4d40c87e02ca03f0bb50a3e617ace5a7bfd3943944");
266 std::vector<FF> calldata_fields = {};
267 calldata_fields.reserve(100);
268 for (uint32_t i = 0; i < 100; i++) {
269 calldata_fields.push_back(
FF(i));
272 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
274 check_relation<calldata_hashing>(trace);
275 check_all_interactions<CalldataTraceBuilder>(trace);
276 EXPECT_EQ(
trace.
get(C::calldata_hashing_output_hash, 1), hash);
279TEST_F(CalldataHashingConstrainingTestTraceHelper, MultipleCalldataHash)
286 TestTraceContainer
trace = process_calldata_hashing_trace(all_calldata_fields, { 1, 2, 3 });
288 check_relation<calldata_hashing>(trace);
289 check_all_interactions<CalldataTraceBuilder>(trace);
290 uint32_t end_row = 17;
292 EXPECT_EQ(
trace.
get(C::calldata_hashing_end, end_row), 1);
293 EXPECT_EQ(
trace.
get(C::calldata_hashing_sel_not_padding_2, end_row), 1);
296 EXPECT_EQ(
trace.
get(C::calldata_hashing_end, end_row), 1);
297 EXPECT_EQ(
trace.
get(C::calldata_hashing_sel_not_padding_2, end_row), 0);
298 EXPECT_EQ(
trace.
get(C::calldata_hashing_sel_not_padding_1, end_row), 1);
301 EXPECT_EQ(
trace.
get(C::calldata_hashing_end, end_row), 1);
302 EXPECT_EQ(
trace.
get(C::calldata_hashing_sel_not_padding_2, end_row), 0);
303 EXPECT_EQ(
trace.
get(C::calldata_hashing_sel_not_padding_1, end_row), 0);
307TEST_F(CalldataHashingConstrainingTest, NegativeEndNotSel)
309 TestTraceContainer
trace(
310 { { { C::precomputed_first_row, 1 } }, { { C::calldata_hashing_end, 1 }, { C::calldata_hashing_sel, 1 } } });
313 trace.
set(C::calldata_hashing_sel, 1, 0);
315 "SEL_ON_START_OR_END");
319 { C::calldata_end, 1 },
320 { C::calldata_sel, 1 },
329TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeInvalidStartAfterLatch)
333 check_relation<calldata_hashing>(trace);
336 trace.
set(Column::calldata_hashing_start, 1, 0);
338 "START_AFTER_LATCH");
339 trace.
set(Column::calldata_hashing_start, 1, 1);
342 trace.
set(Column::calldata_hashing_start, 2, 0);
344 "START_AFTER_LATCH");
347TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeInvalidStartIndex)
349 TestTraceContainer
trace = process_calldata_hashing_trace({
random_fields(10) }, { 1 });
350 check_relation<calldata_hashing>(trace);
353 trace.
set(Column::calldata_hashing_index_0_, 1, 5);
355 "START_INDEX_IS_ZERO");
358TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeStartIsSeparator)
360 TestTraceContainer
trace = process_calldata_hashing_trace({
random_fields(10) }, { 1 });
361 check_relation<calldata_hashing>(trace);
364 trace.
set(Column::calldata_hashing_input_0_, 1, 5);
366 "START_IS_SEPARATOR");
369TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeInvalidIndexIncrements)
371 TestTraceContainer
trace = process_calldata_hashing_trace({
random_fields(10) }, { 1 });
372 check_relation<calldata_hashing>(trace);
375 trace.
set(Column::calldata_hashing_index_1_, 1, 2);
377 "INDEX_INCREMENTS_1");
378 trace.
set(Column::calldata_hashing_index_1_, 1, 1);
379 trace.
set(Column::calldata_hashing_index_2_, 1, 3);
381 "INDEX_INCREMENTS_2");
382 trace.
set(Column::calldata_hashing_index_2_, 1, 2);
384 trace.
set(Column::calldata_hashing_index_0_, 2, 2);
389TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeConsistency)
392 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
393 check_relation<calldata_hashing>(trace);
396 trace.
set(Column::calldata_hashing_context_id, 2, 2);
399 trace.
set(Column::calldata_hashing_context_id, 2, 1);
401 trace.
set(Column::calldata_hashing_output_hash, 2, 2);
404 trace.
set(Column::calldata_hashing_output_hash, 2,
trace.
get(Column::calldata_hashing_output_hash, 1));
406 trace.
set(Column::calldata_hashing_calldata_size, 2, 2);
409 trace.
set(Column::calldata_hashing_calldata_size, 2, 10);
412 trace.
set(Column::calldata_hashing_input_len, 1, 2);
415 "CALLDATA_HASH_INPUT_LENGTH_FIELDS");
418TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeCalldataInteraction)
421 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
422 check_all_interactions<CalldataTraceBuilder>(trace);
426 trace.
set(Column::calldata_hashing_index_0_, 2, 0);
428 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_get_calldata_field_0_settings>(trace)),
429 "Failed.*GET_CALLDATA_FIELD_0. Could not find tuple in destination.");
432 trace.
set(Column::calldata_hashing_input_1_, 2, 0);
434 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_get_calldata_field_1_settings>(trace)),
435 "Failed.*GET_CALLDATA_FIELD_1. Could not find tuple in destination.");
438 trace.
set(Column::calldata_hashing_context_id, 2, 0);
440 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_get_calldata_field_2_settings>(trace)),
441 "Failed.*GET_CALLDATA_FIELD_2. Could not find tuple in destination.");
444TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativePaddingSelectors)
448 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
449 check_relation<calldata_hashing>(trace);
450 check_all_interactions<CalldataTraceBuilder>(trace);
453 trace.
set(Column::calldata_hashing_sel_not_padding_2, 2, 0);
455 trace.
set(Column::calldata_hashing_sel_not_padding_2, 2, 1);
458 trace.
set(Column::calldata_hashing_sel_not_padding_2, 4, 1);
460 "PADDING_CONSISTENCY");
461 trace.
set(Column::calldata_hashing_sel_not_padding_2, 4, 0);
464 trace.
set(Column::calldata_hashing_input_1_, 4, 1);
467 trace.
set(Column::calldata_hashing_input_2_, 4, 1);
472TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativePaddingUnder)
477 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
478 check_relation<calldata_hashing>(trace);
479 check_all_interactions<CalldataTraceBuilder>(trace);
483 trace.
set(Column::calldata_hashing_sel_not_padding_1, 4, 1);
486 "CHECK_FINAL_INDEX");
488 for (uint32_t j = 1; j <= 4; j++) {
489 trace.
set(Column::calldata_hashing_calldata_size, j, 10);
490 trace.
set(Column::calldata_hashing_input_len, j, 11);
492 trace.
set(Column::poseidon2_hash_input_len, j, 11);
495 check_relation<calldata_hashing>(trace);
498 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_get_calldata_field_1_settings>(trace)),
499 "Failed.*GET_CALLDATA_FIELD_1. Could not find tuple in destination.");
502 (check_interaction<CalldataTraceBuilder, perm_calldata_hashing_check_final_size_settings>(trace)),
503 "Failure to build permutation.*CHECK_FINAL_SIZE");
506TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativePaddingOver)
511 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
512 check_relation<calldata_hashing>(trace);
513 check_all_interactions<CalldataTraceBuilder>(trace);
517 trace.
set(Column::calldata_hashing_sel_not_padding_2, 3, 0);
522 trace.
set(Column::calldata_hashing_input_2_, 3, 0);
524 for (uint32_t j = 1; j <= 3; j++) {
525 trace.
set(Column::calldata_hashing_calldata_size, j, 7);
526 trace.
set(Column::calldata_hashing_input_len, j, 8);
528 trace.
set(Column::poseidon2_hash_input_len, j, 8);
531 check_relation<calldata_hashing>(trace);
534 (check_interaction<CalldataTraceBuilder, perm_calldata_hashing_check_final_size_settings>(trace)),
535 "Failure to build permutation.*CHECK_FINAL_SIZE");
538TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeInputLen)
543 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
544 check_relation<calldata_hashing>(trace);
545 check_all_interactions<CalldataTraceBuilder>(trace);
548 trace.
set(Column::calldata_hashing_input_len, 1, 0);
550 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_poseidon2_hash_settings>(trace)),
551 "Failed.*LOOKUP_CALLDATA_HASHING_POSEIDON2_HASH. Could not find tuple in destination.");
553 trace.
set(Column::calldata_hashing_input_len, 1, 9);
555 trace.
set(Column::calldata_hashing_input_len, 2, 4);
558 "CALLDATA_HASH_INPUT_LENGTH_FIELDS");
560 trace.
set(Column::calldata_hashing_calldata_size, 2, 3);
564 for (uint32_t j = 1; j <= 3; j++) {
565 trace.
set(Column::calldata_hashing_calldata_size, j, 7);
566 trace.
set(Column::calldata_hashing_input_len, j, 8);
568 trace.
set(Column::poseidon2_hash_input_len, j, 8);
571 trace.
set(Column::calldata_hashing_sel_not_padding_2, 3, 0);
572 trace.
set(Column::calldata_hashing_input_2_, 3, 0);
573 check_relation<calldata_hashing>(trace);
576 (check_interaction<CalldataTraceBuilder, perm_calldata_hashing_check_final_size_settings>(trace)),
577 "Failure to build permutation.*CHECK_FINAL_SIZE");
580TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeRounds)
583 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
584 check_relation<calldata_hashing>(trace);
585 check_all_interactions<CalldataTraceBuilder>(trace);
588 trace.
set(Column::calldata_hashing_rounds_rem, 1, 1);
593TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeOutputHash)
600 auto trace = TestTraceContainer({
601 { { C::precomputed_first_row, 1 } },
603 { C::calldata_hashing_index_1_, 1 },
604 { C::calldata_hashing_index_2_, 2 },
606 { C::calldata_hashing_input_1_, calldata_fields[0] },
607 { C::calldata_hashing_input_2_, calldata_fields[1] },
608 { C::calldata_hashing_input_len, 6 },
609 { C::calldata_hashing_end, 0 },
610 { C::calldata_hashing_sel_not_padding_1, 1 },
611 { C::calldata_hashing_sel_not_padding_2, 1 },
612 { C::calldata_hashing_sel_not_start, 0 },
613 { C::calldata_hashing_calldata_size, 5 },
614 { C::calldata_hashing_context_id, 1 },
615 { C::calldata_hashing_index_0_, 0 },
616 { C::calldata_hashing_rounds_rem, 2 },
617 { C::calldata_hashing_sel, 1 },
618 { C::calldata_hashing_start, 1 },
621 { C::calldata_hashing_index_1_, 4 },
622 { C::calldata_hashing_index_2_, 5 },
623 { C::calldata_hashing_input_0_, calldata_fields[2] },
624 { C::calldata_hashing_input_1_, calldata_fields[3] },
625 { C::calldata_hashing_input_2_, calldata_fields[4] },
626 { C::calldata_hashing_input_len, 6 },
627 { C::calldata_hashing_end, 1 },
628 { C::calldata_hashing_sel_not_padding_1, 1 },
629 { C::calldata_hashing_sel_not_padding_2, 1 },
630 { C::calldata_hashing_sel_not_start, 1 },
631 { C::calldata_hashing_calldata_size, 5 },
632 { C::calldata_hashing_context_id, 1 },
633 { C::calldata_hashing_index_0_, 3 },
634 { C::calldata_hashing_rounds_rem, 1 },
635 { C::calldata_hashing_sel, 1 },
636 { C::calldata_hashing_sel_end_not_empty, 1 },
640 builder.process_retrieval({ { .context_id = 1, .calldata = calldata_fields } },
trace);
642 auto good_hash = poseidon2_int.
hash({
651 auto bad_hash = poseidon2_int.
hash({
660 trace.
set(Column::calldata_hashing_output_hash, 1, good_hash);
662 trace.
set(Column::calldata_hashing_output_hash, 2, bad_hash);
664 check_all_interactions<CalldataTraceBuilder>(trace);
670TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativePoseidonInteraction)
677 auto trace = TestTraceContainer({
678 { { C::precomputed_first_row, 1 } },
680 { C::calldata_hashing_index_0_, 0 },
681 { C::calldata_hashing_index_1_, 1 },
682 { C::calldata_hashing_index_2_, 2 },
684 { C::calldata_hashing_input_1_, calldata_fields[0] },
685 { C::calldata_hashing_input_2_, calldata_fields[1] },
686 { C::calldata_hashing_input_len, 11 },
687 { C::calldata_hashing_end, 0 },
688 { C::calldata_hashing_sel_not_padding_1, 1 },
689 { C::calldata_hashing_sel_not_padding_2, 1 },
690 { C::calldata_hashing_sel_not_start, 0 },
691 { C::calldata_hashing_calldata_size, 10 },
692 { C::calldata_hashing_context_id, 1 },
693 { C::calldata_hashing_rounds_rem, 4 },
694 { C::calldata_hashing_sel, 1 },
695 { C::calldata_hashing_start, 1 },
698 { C::calldata_hashing_index_0_, 3 },
699 { C::calldata_hashing_index_1_, 4 },
700 { C::calldata_hashing_index_2_, 5 },
701 { C::calldata_hashing_input_0_, calldata_fields[2] },
702 { C::calldata_hashing_input_1_, calldata_fields[3] },
703 { C::calldata_hashing_input_2_, calldata_fields[4] },
704 { C::calldata_hashing_input_len, 11 },
705 { C::calldata_hashing_end, 0 },
706 { C::calldata_hashing_sel_not_padding_1, 1 },
707 { C::calldata_hashing_sel_not_padding_2, 1 },
708 { C::calldata_hashing_sel_not_start, 1 },
709 { C::calldata_hashing_calldata_size, 10 },
710 { C::calldata_hashing_context_id, 1 },
711 { C::calldata_hashing_rounds_rem, 3 },
712 { C::calldata_hashing_sel, 1 },
715 { C::calldata_hashing_index_0_, 6 },
716 { C::calldata_hashing_index_1_, 7 },
717 { C::calldata_hashing_index_2_, 8 },
718 { C::calldata_hashing_input_0_, calldata_fields[5] },
719 { C::calldata_hashing_input_1_, calldata_fields[6] },
720 { C::calldata_hashing_input_2_, calldata_fields[7] },
721 { C::calldata_hashing_input_len, 11 },
722 { C::calldata_hashing_end, 0 },
723 { C::calldata_hashing_sel_not_padding_1, 1 },
724 { C::calldata_hashing_sel_not_padding_2, 1 },
725 { C::calldata_hashing_sel_not_start, 1 },
726 { C::calldata_hashing_calldata_size, 10 },
727 { C::calldata_hashing_context_id, 1 },
728 { C::calldata_hashing_rounds_rem, 2 },
729 { C::calldata_hashing_sel, 1 },
732 { C::calldata_hashing_index_0_, 9 },
733 { C::calldata_hashing_index_1_, 10 },
734 { C::calldata_hashing_index_2_, 11 },
735 { C::calldata_hashing_input_0_, calldata_fields[8] },
736 { C::calldata_hashing_input_1_, calldata_fields[9] },
737 { C::calldata_hashing_input_2_, 0 },
738 { C::calldata_hashing_input_len, 11 },
739 { C::calldata_hashing_end, 1 },
740 { C::calldata_hashing_sel_not_padding_1, 1 },
741 { C::calldata_hashing_sel_not_padding_2, 0 },
742 { C::calldata_hashing_sel_not_start, 1 },
743 { C::calldata_hashing_calldata_size, 10 },
744 { C::calldata_hashing_context_id, 1 },
745 { C::calldata_hashing_rounds_rem, 1 },
746 { C::calldata_hashing_sel, 1 },
747 { C::calldata_hashing_sel_end_not_empty, 1 },
751 builder.process_retrieval({ { .context_id = 1, .calldata = calldata_fields } },
trace);
753 auto bad_hash_prepended = poseidon2_int.
hash({
770 auto bad_hash_misordered = poseidon2_int.
hash({
784 auto bad_hash_padded_zero = poseidon2_int.
hash({
800 check_relation<poseidon2>(trace);
801 for (uint32_t j = 1; j <= 4; j++) {
802 trace.
set(Column::calldata_hashing_output_hash, j, bad_hash_prepended);
806 check_relation<calldata_hashing>(trace);
808 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_poseidon2_hash_settings>(trace)),
809 "Failed.*LOOKUP_CALLDATA_HASHING_POSEIDON2_HASH. Could not find tuple in destination.");
811 for (uint32_t j = 1; j <= 4; j++) {
812 trace.
set(Column::calldata_hashing_output_hash, j, bad_hash_misordered);
815 check_relation<calldata_hashing>(trace);
817 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_poseidon2_hash_settings>(trace)),
818 "Failed.*LOOKUP_CALLDATA_HASHING_POSEIDON2_HASH. Could not find tuple in destination.");
820 for (uint32_t j = 1; j <= 4; j++) {
821 trace.
set(Column::calldata_hashing_output_hash, j, bad_hash_padded_zero);
824 check_relation<calldata_hashing>(trace);
826 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_poseidon2_hash_settings>(trace)),
827 "Failed.*LOOKUP_CALLDATA_HASHING_POSEIDON2_HASH. Could not find tuple in destination.");
830 for (uint32_t j = 1; j <= 4; j++) {
831 trace.
set(Column::calldata_hashing_input_len, j, 12);
835 check_all_interactions<CalldataTraceBuilder>(trace);
840 "CALLDATA_HASH_INPUT_LENGTH_FIELDS");
843 for (uint32_t j = 1; j <= 4; j++) {
844 trace.
set(Column::calldata_hashing_calldata_size, j, 11);
852 "CHECK_FINAL_INDEX");
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
#define DOM_SEP__PUBLIC_CALLDATA
StrictMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
EventEmitter< Poseidon2PermutationEvent > perm_event_emitter
EventEmitter< Poseidon2HashEvent > hash_event_emitter
Poseidon2TraceBuilder poseidon2_builder
StrictMock< MockExecutionIdManager > mock_execution_id_manager
static constexpr size_t SR_PADDING_END
static constexpr size_t SR_PADDING_CONSISTENCY
static constexpr size_t SR_START_AFTER_LATCH
static constexpr size_t SR_START_IS_SEPARATOR
static constexpr size_t SR_ID_CONSISTENCY
static constexpr size_t SR_ROUNDS_DECREMENT
static constexpr size_t SR_CHECK_FINAL_INDEX
static constexpr size_t SR_SIZE_CONSISTENCY
static constexpr size_t SR_PADDED_BY_ZERO_2
static constexpr size_t SR_INDEX_INCREMENTS_2
static constexpr size_t SR_INDEX_INCREMENTS
static constexpr size_t SR_PADDED_BY_ZERO_1
static constexpr size_t SR_CALLDATA_HASH_INPUT_LENGTH_FIELDS
static constexpr size_t SR_HASH_CONSISTENCY
static constexpr size_t SR_SEL_ON_START_OR_END
static constexpr size_t SR_INDEX_INCREMENTS_1
static constexpr size_t SR_START_INDEX_IS_ZERO
void process_hash(const simulation::EventEmitterInterface< simulation::Poseidon2HashEvent >::Container &hash_events, TraceContainer &trace)
Processes the hash events for the Poseidon2 hash function. It populates the columns for the poseidon2...
const FF & get(Column col, uint32_t row) const
void set(Column col, uint32_t row, const FF &value)
Native Poseidon2 hash function implementation.
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
PrecomputedTraceBuilder precomputed_builder
TEST_F(AvmRecursiveTests, TwoLayerAvmRecursionFailsWithWrongPIs)
void check_relation(const tracegen::TestTraceContainer &trace, Ts... subrelation)
TestTraceContainer empty_trace()
std::vector< FF > random_fields(size_t n)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept