1#include <gtest/gtest.h>
26using tracegen::ExecutionTraceBuilder;
27using tracegen::NullifierTreeCheckTraceBuilder;
28using tracegen::TestTraceContainer;
30using simulation::EventEmitter;
31using simulation::FieldGreaterThan;
32using simulation::FieldGreaterThanEvent;
33using simulation::MockMerkleCheck;
34using simulation::MockPoseidon2;
35using simulation::MockRangeCheck;
36using simulation::NullifierTreeCheck;
39using testing::NiceMock;
45TEST(NullifierExistsConstrainingTest, PositiveTest)
47 TestTraceContainer
trace({ { { C::execution_sel, 1 },
48 { C::execution_sel_execute_nullifier_exists, 1 },
49 { C::execution_register_0_,
FF(0x123456) },
50 { C::execution_register_1_,
FF(0xdeadbeef) },
51 { C::execution_register_2_, 1 },
52 { C::execution_prev_nullifier_tree_root,
FF(0xabc) },
53 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
MemoryTag::FF) },
54 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
MemoryTag::FF) },
55 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
MemoryTag::U1) },
56 { C::execution_sel_opcode_error, 0 },
58 check_relation<nullifier_exists>(
trace);
61TEST(NullifierExistsConstrainingTest, PositiveNullifierNotExists)
63 TestTraceContainer
trace({ { { C::execution_sel, 1 },
64 { C::execution_sel_execute_nullifier_exists, 1 },
65 { C::execution_register_0_,
FF(0x123456) },
66 { C::execution_register_1_,
FF(0xdeadbeef) },
67 { C::execution_register_2_, 0 },
68 { C::execution_prev_nullifier_tree_root,
FF(0xabc) },
69 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
MemoryTag::FF) },
70 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
MemoryTag::FF) },
71 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
MemoryTag::U1) },
72 { C::execution_sel_opcode_error, 0 },
74 check_relation<nullifier_exists>(
trace);
77TEST(NullifierExistsConstrainingTest, NegativeInvalidOutputTag)
79 TestTraceContainer
trace({ { { C::execution_sel, 1 },
80 { C::execution_sel_execute_nullifier_exists, 1 },
81 { C::execution_register_0_,
FF(0x123456) },
82 { C::execution_register_1_,
FF(0xdeadbeef) },
83 { C::execution_register_2_, 0 },
84 { C::execution_prev_nullifier_tree_root,
FF(0xabc) },
85 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
MemoryTag::FF) },
86 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
MemoryTag::FF) },
87 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
MemoryTag::U8) },
88 { C::execution_sel_opcode_error, 0 },
92 "NULLIFIER_EXISTS_U1_OUTPUT_TAG");
95TEST(NullifierExistsConstrainingTest, NegativeNullifierExistsSuccess)
97 TestTraceContainer
trace({ {
98 { C::execution_sel_execute_nullifier_exists, 1 },
99 { C::execution_sel_opcode_error, 1 },
103 "NULLIFIER_EXISTS_SUCCESS");
106TEST(NullifierExistsConstrainingTest, Interactions)
109 NiceMock<MockMerkleCheck> merkle_check;
115 EventEmitter<NullifierTreeCheckEvent> nullifier_tree_check_event_emitter;
116 NullifierTreeCheck nullifier_tree_check(
poseidon2, merkle_check,
field_gt, nullifier_tree_check_event_emitter);
121 AppendOnlyTreeSnapshot nullifier_tree_snapshot = AppendOnlyTreeSnapshot{
123 .nextAvailableLeafIndex = 128,
126 nullifier_tree_check.assert_read(
nullifier, address,
true, {}, 0, {}, nullifier_tree_snapshot);
128 TestTraceContainer
trace({ {
129 { C::execution_sel_execute_nullifier_exists, 1 },
131 { C::execution_register_1_, address },
132 { C::execution_register_2_, 1 },
133 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
MemoryTag::FF) },
134 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
MemoryTag::FF) },
135 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
MemoryTag::U1) },
136 { C::execution_prev_nullifier_tree_root, nullifier_tree_snapshot.root },
137 { C::execution_sel_opcode_error, 0 },
141 NullifierTreeCheckTraceBuilder nullifier_tree_check_trace_builder;
142 nullifier_tree_check_trace_builder.process(nullifier_tree_check_event_emitter.dump_events(),
trace);
144 check_relation<nullifier_exists>(
trace);
146 check_interaction<ExecutionTraceBuilder, lookup_nullifier_exists_nullifier_exists_check_settings>(
trace);
#define AVM_EXEC_OP_ID_NULLIFIER_EXISTS
static constexpr size_t SR_NULLIFIER_EXISTS_U1_OUTPUT_TAG
static constexpr size_t SR_NULLIFIER_EXISTS_SUCCESS
EventEmitter< DataCopyEvent > event_emitter
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > poseidon2
std::variant< NullifierTreeReadWriteEvent, CheckPointEventType > NullifierTreeCheckEvent
NiceMock< MockFieldGreaterThan > field_gt