2#include <gmock/gmock.h>
3#include <gtest/gtest.h>
9#include "barretenberg/aztec/aztec_constants.hpp"
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];
84 calldata_fields.insert(calldata_fields.begin(), DOM_SEP__PUBLIC_CALLDATA);
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 };
143 auto hash =
poseidon2.
hash({ DOM_SEP__PUBLIC_CALLDATA, 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 },
150 { C::calldata_hashing_input_0_, DOM_SEP__PUBLIC_CALLDATA },
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 },
189 { C::calldata_hashing_input_0_, DOM_SEP__PUBLIC_CALLDATA },
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 },
228 { C::calldata_hashing_input_0_, DOM_SEP__PUBLIC_CALLDATA },
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);
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);
339 trace.
set(Column::calldata_hashing_start, 1, 1);
342 trace.
set(Column::calldata_hashing_start, 2, 0);
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);
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);
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);
378 trace.
set(Column::calldata_hashing_index_1_, 1, 1);
379 trace.
set(Column::calldata_hashing_index_2_, 1, 3);
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);
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);
456 trace.
set(Column::calldata_hashing_sel_not_padding_2, 2, 1);
459 trace.
set(Column::calldata_hashing_sel_not_padding_2, 4, 1);
462 trace.
set(Column::calldata_hashing_sel_not_padding_2, 4, 0);
465 trace.
set(Column::calldata_hashing_input_1_, 4, 1);
468 trace.
set(Column::calldata_hashing_input_2_, 4, 1);
473TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativePaddingUnder)
478 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
479 check_relation<calldata_hashing>(trace);
480 check_all_interactions<CalldataTraceBuilder>(trace);
484 trace.
set(Column::calldata_hashing_sel_not_padding_1, 4, 1);
489 for (uint32_t j = 1; j <= 4; j++) {
490 trace.
set(Column::calldata_hashing_calldata_size, j, 10);
491 trace.
set(Column::calldata_hashing_input_len, j, 11);
493 trace.
set(Column::poseidon2_hash_input_len, j, 11);
496 check_relation<calldata_hashing>(trace);
499 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_get_calldata_field_1_settings>(trace)),
500 "Failed.*GET_CALLDATA_FIELD_1. Could not find tuple in destination.");
503 (check_interaction<CalldataTraceBuilder, perm_calldata_hashing_check_final_size_settings>(trace)),
504 "Failure to build permutation.*CHECK_FINAL_SIZE");
507TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativePaddingOver)
512 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
513 check_relation<calldata_hashing>(trace);
514 check_all_interactions<CalldataTraceBuilder>(trace);
518 trace.
set(Column::calldata_hashing_sel_not_padding_2, 3, 0);
523 trace.
set(Column::calldata_hashing_input_2_, 3, 0);
525 for (uint32_t j = 1; j <= 3; j++) {
526 trace.
set(Column::calldata_hashing_calldata_size, j, 7);
527 trace.
set(Column::calldata_hashing_input_len, j, 8);
529 trace.
set(Column::poseidon2_hash_input_len, j, 8);
532 check_relation<calldata_hashing>(trace);
535 (check_interaction<CalldataTraceBuilder, perm_calldata_hashing_check_final_size_settings>(trace)),
536 "Failure to build permutation.*CHECK_FINAL_SIZE");
539TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeInputLen)
544 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
545 check_relation<calldata_hashing>(trace);
546 check_all_interactions<CalldataTraceBuilder>(trace);
549 trace.
set(Column::calldata_hashing_input_len, 1, 0);
551 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_poseidon2_hash_settings>(trace)),
552 "Failed.*LOOKUP_CALLDATA_HASHING_POSEIDON2_HASH. Could not find tuple in destination.");
554 trace.
set(Column::calldata_hashing_input_len, 1, 9);
556 trace.
set(Column::calldata_hashing_input_len, 2, 4);
561 trace.
set(Column::calldata_hashing_calldata_size, 2, 3);
565 for (uint32_t j = 1; j <= 3; j++) {
566 trace.
set(Column::calldata_hashing_calldata_size, j, 7);
567 trace.
set(Column::calldata_hashing_input_len, j, 8);
569 trace.
set(Column::poseidon2_hash_input_len, j, 8);
572 trace.
set(Column::calldata_hashing_sel_not_padding_2, 3, 0);
573 trace.
set(Column::calldata_hashing_input_2_, 3, 0);
574 check_relation<calldata_hashing>(trace);
577 (check_interaction<CalldataTraceBuilder, perm_calldata_hashing_check_final_size_settings>(trace)),
578 "Failure to build permutation.*CHECK_FINAL_SIZE");
581TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeRounds)
584 TestTraceContainer
trace = process_calldata_hashing_trace({ calldata_fields }, { 1 });
585 check_relation<calldata_hashing>(trace);
586 check_all_interactions<CalldataTraceBuilder>(trace);
589 trace.
set(Column::calldata_hashing_rounds_rem, 1, 1);
594TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativeOutputHash)
601 auto trace = TestTraceContainer({
602 { { C::precomputed_first_row, 1 } },
604 { C::calldata_hashing_index_1_, 1 },
605 { C::calldata_hashing_index_2_, 2 },
606 { C::calldata_hashing_input_0_, DOM_SEP__PUBLIC_CALLDATA },
607 { C::calldata_hashing_input_1_, calldata_fields[0] },
608 { C::calldata_hashing_input_2_, calldata_fields[1] },
609 { C::calldata_hashing_input_len, 6 },
610 { C::calldata_hashing_end, 0 },
611 { C::calldata_hashing_sel_not_padding_1, 1 },
612 { C::calldata_hashing_sel_not_padding_2, 1 },
613 { C::calldata_hashing_sel_not_start, 0 },
614 { C::calldata_hashing_calldata_size, 5 },
615 { C::calldata_hashing_context_id, 1 },
616 { C::calldata_hashing_index_0_, 0 },
617 { C::calldata_hashing_rounds_rem, 2 },
618 { C::calldata_hashing_sel, 1 },
619 { C::calldata_hashing_start, 1 },
622 { C::calldata_hashing_index_1_, 4 },
623 { C::calldata_hashing_index_2_, 5 },
624 { C::calldata_hashing_input_0_, calldata_fields[2] },
625 { C::calldata_hashing_input_1_, calldata_fields[3] },
626 { C::calldata_hashing_input_2_, calldata_fields[4] },
627 { C::calldata_hashing_input_len, 6 },
628 { C::calldata_hashing_end, 1 },
629 { C::calldata_hashing_sel_not_padding_1, 1 },
630 { C::calldata_hashing_sel_not_padding_2, 1 },
631 { C::calldata_hashing_sel_not_start, 1 },
632 { C::calldata_hashing_calldata_size, 5 },
633 { C::calldata_hashing_context_id, 1 },
634 { C::calldata_hashing_index_0_, 3 },
635 { C::calldata_hashing_rounds_rem, 1 },
636 { C::calldata_hashing_sel, 1 },
637 { C::calldata_hashing_sel_end_not_empty, 1 },
641 builder.process_retrieval({ { .context_id = 1, .calldata = calldata_fields } },
trace);
643 auto good_hash = poseidon2_int.
hash({
644 DOM_SEP__PUBLIC_CALLDATA,
652 auto bad_hash = poseidon2_int.
hash({
661 trace.
set(Column::calldata_hashing_output_hash, 1, good_hash);
663 trace.
set(Column::calldata_hashing_output_hash, 2, bad_hash);
665 check_all_interactions<CalldataTraceBuilder>(trace);
671TEST_F(CalldataHashingConstrainingTestTraceHelper, NegativePoseidonInteraction)
678 auto trace = TestTraceContainer({
679 { { C::precomputed_first_row, 1 } },
681 { C::calldata_hashing_index_0_, 0 },
682 { C::calldata_hashing_index_1_, 1 },
683 { C::calldata_hashing_index_2_, 2 },
684 { C::calldata_hashing_input_0_, DOM_SEP__PUBLIC_CALLDATA },
685 { C::calldata_hashing_input_1_, calldata_fields[0] },
686 { C::calldata_hashing_input_2_, calldata_fields[1] },
687 { C::calldata_hashing_input_len, 11 },
688 { C::calldata_hashing_end, 0 },
689 { C::calldata_hashing_sel_not_padding_1, 1 },
690 { C::calldata_hashing_sel_not_padding_2, 1 },
691 { C::calldata_hashing_sel_not_start, 0 },
692 { C::calldata_hashing_calldata_size, 10 },
693 { C::calldata_hashing_context_id, 1 },
694 { C::calldata_hashing_rounds_rem, 4 },
695 { C::calldata_hashing_sel, 1 },
696 { C::calldata_hashing_start, 1 },
699 { C::calldata_hashing_index_0_, 3 },
700 { C::calldata_hashing_index_1_, 4 },
701 { C::calldata_hashing_index_2_, 5 },
702 { C::calldata_hashing_input_0_, calldata_fields[2] },
703 { C::calldata_hashing_input_1_, calldata_fields[3] },
704 { C::calldata_hashing_input_2_, calldata_fields[4] },
705 { C::calldata_hashing_input_len, 11 },
706 { C::calldata_hashing_end, 0 },
707 { C::calldata_hashing_sel_not_padding_1, 1 },
708 { C::calldata_hashing_sel_not_padding_2, 1 },
709 { C::calldata_hashing_sel_not_start, 1 },
710 { C::calldata_hashing_calldata_size, 10 },
711 { C::calldata_hashing_context_id, 1 },
712 { C::calldata_hashing_rounds_rem, 3 },
713 { C::calldata_hashing_sel, 1 },
716 { C::calldata_hashing_index_0_, 6 },
717 { C::calldata_hashing_index_1_, 7 },
718 { C::calldata_hashing_index_2_, 8 },
719 { C::calldata_hashing_input_0_, calldata_fields[5] },
720 { C::calldata_hashing_input_1_, calldata_fields[6] },
721 { C::calldata_hashing_input_2_, calldata_fields[7] },
722 { C::calldata_hashing_input_len, 11 },
723 { C::calldata_hashing_end, 0 },
724 { C::calldata_hashing_sel_not_padding_1, 1 },
725 { C::calldata_hashing_sel_not_padding_2, 1 },
726 { C::calldata_hashing_sel_not_start, 1 },
727 { C::calldata_hashing_calldata_size, 10 },
728 { C::calldata_hashing_context_id, 1 },
729 { C::calldata_hashing_rounds_rem, 2 },
730 { C::calldata_hashing_sel, 1 },
733 { C::calldata_hashing_index_0_, 9 },
734 { C::calldata_hashing_index_1_, 10 },
735 { C::calldata_hashing_index_2_, 11 },
736 { C::calldata_hashing_input_0_, calldata_fields[8] },
737 { C::calldata_hashing_input_1_, calldata_fields[9] },
738 { C::calldata_hashing_input_2_, 0 },
739 { C::calldata_hashing_input_len, 11 },
740 { C::calldata_hashing_end, 1 },
741 { C::calldata_hashing_sel_not_padding_1, 1 },
742 { C::calldata_hashing_sel_not_padding_2, 0 },
743 { C::calldata_hashing_sel_not_start, 1 },
744 { C::calldata_hashing_calldata_size, 10 },
745 { C::calldata_hashing_context_id, 1 },
746 { C::calldata_hashing_rounds_rem, 1 },
747 { C::calldata_hashing_sel, 1 },
748 { C::calldata_hashing_sel_end_not_empty, 1 },
752 builder.process_retrieval({ { .context_id = 1, .calldata = calldata_fields } },
trace);
754 auto bad_hash_prepended = poseidon2_int.
hash({
758 DOM_SEP__PUBLIC_CALLDATA,
771 auto bad_hash_misordered = poseidon2_int.
hash({
772 DOM_SEP__PUBLIC_CALLDATA,
785 auto bad_hash_padded_zero = poseidon2_int.
hash({
786 DOM_SEP__PUBLIC_CALLDATA,
801 check_relation<poseidon2>(trace);
802 for (uint32_t j = 1; j <= 4; j++) {
803 trace.
set(Column::calldata_hashing_output_hash, j, bad_hash_prepended);
807 check_relation<calldata_hashing>(trace);
809 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_poseidon2_hash_settings>(trace)),
810 "Failed.*LOOKUP_CALLDATA_HASHING_POSEIDON2_HASH. Could not find tuple in destination.");
812 for (uint32_t j = 1; j <= 4; j++) {
813 trace.
set(Column::calldata_hashing_output_hash, j, bad_hash_misordered);
816 check_relation<calldata_hashing>(trace);
818 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_poseidon2_hash_settings>(trace)),
819 "Failed.*LOOKUP_CALLDATA_HASHING_POSEIDON2_HASH. Could not find tuple in destination.");
821 for (uint32_t j = 1; j <= 4; j++) {
822 trace.
set(Column::calldata_hashing_output_hash, j, bad_hash_padded_zero);
825 check_relation<calldata_hashing>(trace);
827 (check_interaction<CalldataTraceBuilder, lookup_calldata_hashing_poseidon2_hash_settings>(trace)),
828 "Failed.*LOOKUP_CALLDATA_HASHING_POSEIDON2_HASH. Could not find tuple in destination.");
831 for (uint32_t j = 1; j <= 4; j++) {
832 trace.
set(Column::calldata_hashing_input_len, j, 12);
836 check_all_interactions<CalldataTraceBuilder>(trace);
844 for (uint32_t j = 1; j <= 4; j++) {
845 trace.
set(Column::calldata_hashing_calldata_size, j, 11);
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
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 std::string get_subrelation_label(size_t index)
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, bool use_atomic_limbs=false)
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, TwoLayerAvmRecursion)
A test of the Two Layer AVM recursive verifier.
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