5#include <gmock/gmock.h>
6#include <gtest/gtest.h>
35using ::testing::NiceMock;
37using testing::TestMemoryTree;
39using simulation::DeduplicatingEventEmitter;
40using simulation::EventEmitter;
41using simulation::ExecutionIdManager;
42using simulation::FieldGreaterThan;
43using simulation::FieldGreaterThanEvent;
44using simulation::MerkleCheck;
45using simulation::MerkleCheckEvent;
46using simulation::MockGreaterThan;
47using simulation::MockRangeCheck;
48using simulation::NullifierTreeCheck;
51using simulation::Poseidon2;
52using simulation::Poseidon2HashEvent;
53using simulation::Poseidon2PermutationEvent;
54using simulation::Poseidon2PermutationMemoryEvent;
64class NullifierTreeCheckTracegenTest :
public ::testing::Test {
66 NullifierTreeCheckTracegenTest()
76 Poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter);
98class NullifierReadInteractionsTests :
public NullifierTreeCheckTracegenTest,
99 public ::testing::WithParamInterface<TestParams> {};
101TEST_P(NullifierReadInteractionsTests, PositiveWithInteractions)
103 const auto& param = GetParam();
105 EventEmitter<MerkleCheckEvent> merkle_event_emitter;
106 MerkleCheck merkle_check(
poseidon2, merkle_event_emitter);
113 EventEmitter<NullifierTreeCheckEvent> nullifier_tree_check_event_emitter;
114 NullifierTreeCheck nullifier_tree_check_simulator(
117 TestTraceContainer
trace({ { { C::precomputed_first_row, 1 } } });
119 MerkleCheckTraceBuilder merkle_check_builder;
121 NullifierTreeCheckTraceBuilder nullifier_tree_check_builder;
124 uint64_t leaf_index = 30;
125 std::vector<FF> sibling_path;
128 sibling_path.emplace_back(i);
132 nullifier_tree_check_simulator.assert_read(param.nullifier,
138 AppendOnlyTreeSnapshot{ .root = root });
141 merkle_check_builder.process(merkle_event_emitter.dump_events(), trace);
143 nullifier_tree_check_builder.process(nullifier_tree_check_event_emitter.dump_events(), trace);
157 NullifierReadInteractionsTests,
158 ::testing::ValuesIn(positive_read_tests));
160TEST_F(NullifierTreeCheckTracegenTest, WriteWithInteractions)
162 EventEmitter<MerkleCheckEvent> merkle_event_emitter;
163 MerkleCheck merkle_check(
poseidon2, merkle_event_emitter);
170 EventEmitter<NullifierTreeCheckEvent> nullifier_tree_check_event_emitter;
171 NullifierTreeCheck nullifier_tree_check_simulator(
174 TestTraceContainer
trace({ { { C::precomputed_first_row, 1 } } });
176 MerkleCheckTraceBuilder merkle_check_builder;
178 NullifierTreeCheckTraceBuilder nullifier_tree_check_builder;
183 FF low_nullifier = 40;
189 uint64_t low_leaf_index = 0;
190 nullifier_tree.update_element(low_leaf_index, low_leaf_hash);
192 AppendOnlyTreeSnapshot prev_snapshot =
193 AppendOnlyTreeSnapshot{ .root = nullifier_tree.root(), .next_available_leaf_index = 128 };
194 std::vector<FF> low_leaf_sibling_path = nullifier_tree.get_sibling_path(low_leaf_index);
197 updated_low_leaf.
nextIndex = prev_snapshot.next_available_leaf_index;
198 updated_low_leaf.nextKey = siloed_nullifier;
200 nullifier_tree.update_element(low_leaf_index, updated_low_leaf_hash);
202 std::vector<FF> insertion_sibling_path = nullifier_tree.get_sibling_path(prev_snapshot.next_available_leaf_index);
207 nullifier_tree.update_element(prev_snapshot.next_available_leaf_index, new_leaf_hash);
209 nullifier_tree_check_simulator.write(
nullifier,
214 low_leaf_sibling_path,
216 insertion_sibling_path);
219 merkle_check_builder.process(merkle_event_emitter.dump_events(), trace);
221 nullifier_tree_check_builder.process(nullifier_tree_check_event_emitter.dump_events(), trace);
FieldGreaterThan field_gt
#define NULLIFIER_TREE_HEIGHT
StrictMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
EventEmitter< Poseidon2PermutationEvent > perm_event_emitter
EventEmitter< Poseidon2HashEvent > hash_event_emitter
Poseidon2TraceBuilder poseidon2_builder
void process(const simulation::EventEmitterInterface< simulation::FieldGreaterThanEvent >::Container &events, TraceContainer &trace)
void process_hash(const simulation::EventEmitterInterface< simulation::Poseidon2HashEvent >::Container &hash_events, TraceContainer &trace)
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
FieldGreaterThanTraceBuilder field_gt_builder
ExecutionIdManager execution_id_manager
NullifierTreeLeafPreimage low_leaf
AztecAddress contract_address
INSTANTIATE_TEST_SUITE_P(PaddingVariants, AvmRecursiveTestsParameterized, ::testing::Values(false, true), [](const auto &info) { return info.param ? "Padded" :"Unpadded";})
void check_interaction(tracegen::TestTraceContainer &trace)
TEST_P(AvmRecursiveTestsParameterized, GoblinRecursion)
A test of the Goblinized AVM recursive verifier.
crypto::merkle_tree::IndexedLeaf< crypto::merkle_tree::NullifierLeafValue > NullifierTreeLeafPreimage
::bb::crypto::merkle_tree::NullifierLeafValue NullifierLeafValue
FF unconstrained_root_from_path(const FF &leaf_value, const uint64_t leaf_index, std::span< const FF > path)
std::variant< NullifierTreeReadWriteEvent, CheckPointEventType > NullifierTreeCheckEvent
FF unconstrained_silo_nullifier(const AztecAddress &contract_address, const FF &nullifier)
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > Poseidon2
lookup_settings< lookup_nullifier_check_updated_low_leaf_poseidon2_settings_ > lookup_nullifier_check_updated_low_leaf_poseidon2_settings
lookup_settings< lookup_nullifier_check_low_leaf_poseidon2_settings_ > lookup_nullifier_check_low_leaf_poseidon2_settings
lookup_settings< lookup_nullifier_check_low_leaf_nullifier_validation_settings_ > lookup_nullifier_check_low_leaf_nullifier_validation_settings
lookup_settings< lookup_nullifier_check_low_leaf_merkle_check_settings_ > lookup_nullifier_check_low_leaf_merkle_check_settings
lookup_settings< lookup_nullifier_check_low_leaf_next_nullifier_validation_settings_ > lookup_nullifier_check_low_leaf_next_nullifier_validation_settings
lookup_settings< lookup_nullifier_check_silo_poseidon2_settings_ > lookup_nullifier_check_silo_poseidon2_settings
lookup_settings< lookup_nullifier_check_new_leaf_merkle_check_settings_ > lookup_nullifier_check_new_leaf_merkle_check_settings
lookup_settings< lookup_nullifier_check_new_leaf_poseidon2_settings_ > lookup_nullifier_check_new_leaf_poseidon2_settings
TEST_F(IPATest, ChallengesAreZero)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
NoopEventEmitter< FieldGreaterThanEvent > field_gt_event_emitter