4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
31using ::testing::NiceMock;
33using testing::TestMemoryTree;
35using simulation::DeduplicatingEventEmitter;
36using simulation::EventEmitter;
37using simulation::ExecutionIdManager;
38using simulation::FieldGreaterThan;
39using simulation::FieldGreaterThanEvent;
40using simulation::IndexedTreeCheck;
42using simulation::IndexedTreeLeafData;
43using simulation::IndexedTreeSiloingParameters;
44using simulation::MerkleCheck;
45using simulation::MerkleCheckEvent;
46using simulation::MockGreaterThan;
47using simulation::MockRangeCheck;
48using simulation::Poseidon2;
49using simulation::Poseidon2HashEvent;
50using simulation::Poseidon2PermutationEvent;
51using simulation::Poseidon2PermutationMemoryEvent;
60constexpr size_t TREE_HEIGHT = 8;
62class IndexedTreeCheckTracegenTest :
public ::testing::Test {
64 IndexedTreeCheckTracegenTest()
74 Poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter);
85 TestParams{ .value = 42, .exists =
true, .low_leaf = { .value = 42, .next_value = 0, .next_index = 0 } },
87 TestParams{ .value = 42, .exists =
true, .low_leaf = { .value = 42, .next_value = 50, .next_index = 28 } },
89 TestParams{ .value = 42, .exists =
false, .low_leaf = { .value = 10, .next_value = 0, .next_index = 0 } },
91 TestParams{ .value = 42, .exists =
false, .low_leaf = { .value = 10, .next_value = 50, .next_index = 28 } }
94class ReadInteractionsTests :
public IndexedTreeCheckTracegenTest,
public ::testing::WithParamInterface<TestParams> {};
96TEST_P(ReadInteractionsTests, PositiveWithInteractions)
98 const auto& param = GetParam();
100 EventEmitter<MerkleCheckEvent> merkle_event_emitter;
111 TestTraceContainer
trace({ { { C::precomputed_first_row, 1 } } });
113 MerkleCheckTraceBuilder merkle_check_builder;
118 uint64_t leaf_index = 30;
119 std::vector<FF> sibling_path;
120 sibling_path.reserve(TREE_HEIGHT);
121 for (
size_t i = 0; i < TREE_HEIGHT; ++i) {
122 sibling_path.emplace_back(i);
132 AppendOnlyTreeSnapshot{ .root = root });
135 merkle_check_builder.process(merkle_event_emitter.dump_events(), trace);
150INSTANTIATE_TEST_SUITE_P(IndexedTreeCheckTracegenTest, ReadInteractionsTests, ::testing::ValuesIn(positive_read_tests));
152TEST_F(IndexedTreeCheckTracegenTest, WriteWithInteractions)
154 EventEmitter<MerkleCheckEvent> merkle_event_emitter;
165 TestTraceContainer
trace({ { { C::precomputed_first_row, 1 } } });
167 MerkleCheckTraceBuilder merkle_check_builder;
173 FF siloing_separator = 42;
176 TestMemoryTree<Poseidon2HashPolicy> tree(8, TREE_HEIGHT);
178 IndexedTreeLeafData
low_leaf = { .value = low_value, .next_value = siloed_value + 1, .next_index = 10 };
180 uint64_t low_leaf_index = 0;
181 tree.update_element(low_leaf_index, low_leaf_hash);
183 AppendOnlyTreeSnapshot prev_snapshot =
184 AppendOnlyTreeSnapshot{ .root = tree.root(), .next_available_leaf_index = 128 };
185 std::vector<FF> low_leaf_sibling_path = tree.get_sibling_path(low_leaf_index);
187 IndexedTreeLeafData updated_low_leaf =
low_leaf;
188 updated_low_leaf.next_index = prev_snapshot.next_available_leaf_index;
189 updated_low_leaf.next_value = siloed_value;
191 tree.update_element(low_leaf_index, updated_low_leaf_hash);
193 std::vector<FF> insertion_sibling_path = tree.get_sibling_path(prev_snapshot.next_available_leaf_index);
195 IndexedTreeLeafData new_leaf = { .value = siloed_value,
197 .next_index =
low_leaf.next_index };
199 tree.update_element(prev_snapshot.next_available_leaf_index, new_leaf_hash);
201 IndexedTreeSiloingParameters siloing_params = {
202 .address = contract_address,
203 .siloing_separator = siloing_separator,
211 low_leaf_sibling_path,
213 insertion_sibling_path);
216 merkle_check_builder.process(merkle_event_emitter.dump_events(), trace);
StrictMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
EventEmitter< Poseidon2PermutationEvent > perm_event_emitter
EventEmitter< Poseidon2HashEvent > hash_event_emitter
Poseidon2TraceBuilder poseidon2_builder
FieldGreaterThan field_gt
IndexedTreeCheckTraceBuilder indexed_tree_check_builder
IndexedTreeCheck indexed_tree_check
EventEmitter< simulation::IndexedTreeCheckEvent > indexed_tree_check_event_emitter
void process(const simulation::EventEmitterInterface< simulation::FieldGreaterThanEvent >::Container &events, TraceContainer &trace)
Processes FieldGreaterThanEvent events and generates trace rows for the ff_gt gadget.
void process(const simulation::EventEmitterInterface< simulation::IndexedTreeCheckEvent >::Container &events, TraceContainer &trace)
Process generic indexed tree check events and populate the relevant columns in the trace.
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...
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
FieldGreaterThanTraceBuilder field_gt_builder
ExecutionIdManager execution_id_manager
IndexedTreeLeafData low_leaf
TEST_P(AvmRecursiveTestsParameterized, TwoLayerAvmRecursion)
A test of the Two Layer AVM recursive verifier.
INSTANTIATE_TEST_SUITE_P(PaddingVariants, AvmRecursiveTestsParameterized, ::testing::Values(false, true), [](const auto &info) { return info.param ? "Padded" :"Unpadded";})
void check_interaction(tracegen::TestTraceContainer &trace)
FF unconstrained_root_from_path(const FF &leaf_value, const uint64_t leaf_index, std::span< const FF > path)
std::variant< IndexedTreeReadWriteEvent, CheckPointEventType > IndexedTreeCheckEvent
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > Poseidon2
lookup_settings< lookup_indexed_tree_check_silo_poseidon2_settings_ > lookup_indexed_tree_check_silo_poseidon2_settings
lookup_settings< lookup_indexed_tree_check_low_leaf_value_validation_settings_ > lookup_indexed_tree_check_low_leaf_value_validation_settings
lookup_settings< lookup_indexed_tree_check_low_leaf_poseidon2_settings_ > lookup_indexed_tree_check_low_leaf_poseidon2_settings
lookup_settings< lookup_indexed_tree_check_updated_low_leaf_poseidon2_settings_ > lookup_indexed_tree_check_updated_low_leaf_poseidon2_settings
lookup_settings< lookup_indexed_tree_check_low_leaf_next_value_validation_settings_ > lookup_indexed_tree_check_low_leaf_next_value_validation_settings
lookup_settings< lookup_indexed_tree_check_low_leaf_merkle_check_settings_ > lookup_indexed_tree_check_low_leaf_merkle_check_settings
lookup_settings< lookup_indexed_tree_check_new_leaf_poseidon2_settings_ > lookup_indexed_tree_check_new_leaf_poseidon2_settings
lookup_settings< lookup_indexed_tree_check_new_leaf_merkle_check_settings_ > lookup_indexed_tree_check_new_leaf_merkle_check_settings
TEST_F(IPATest, ChallengesAreZero)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
NoopEventEmitter< FieldGreaterThanEvent > field_gt_event_emitter