Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
contract_instance_retrieval_trace.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
4#include <cstdint>
5#include <memory>
6#include <vector>
7
15
16namespace bb::avm2::tracegen {
17namespace {
18
19using C = Column;
20using simulation::ContractInstanceRetrievalEvent;
21
22// Helper to create a test contract instance with all fields populated
23ContractInstance create_test_contract_instance(uint32_t salt_value = 123)
24{
25 return ContractInstance{
26 .salt = FF(salt_value),
27 .deployer_addr = FF(0x123456789ULL),
28 .current_class_id = FF(0xdeadbeefULL),
29 .original_class_id = FF(0xcafebabeULL),
30 .initialisation_hash = FF(0x11111111ULL),
31 .public_keys =
32 PublicKeys{
33 .nullifier_key = { FF(0x100), FF(0x101) },
34 .incoming_viewing_key = { FF(0x200), FF(0x201) },
35 .outgoing_viewing_key = { FF(0x300), FF(0x301) },
36 .tagging_key = { FF(0x400), FF(0x401) },
37 },
38 };
39}
40
41TEST(ContractInstanceRetrievalTraceGenTest, EmptyEvents)
42{
43 TestTraceContainer trace;
44 ContractInstanceRetrievalTraceBuilder builder;
45
47
48 // When there are no events, the trace sets selector to 0 at row 0
49 // But since TraceContainer doesn't store zero values, get_num_rows() returns 0
50 // We verify that reading row 0 returns 0 for the selector
51 EXPECT_EQ(trace.get(C::contract_instance_retrieval_sel, 0), 0);
52}
53
54TEST(ContractInstanceRetrievalTraceGenTest, SingleEvent)
55{
56 TestTraceContainer trace;
57 ContractInstanceRetrievalTraceBuilder builder;
58
59 // Test constants
60 const auto contract_address = FF(0xabcdef123456ULL);
61 const auto nullifier_tree_root = FF(0x9999);
62 const auto public_data_tree_root = FF(0x8888);
63 const auto deployment_nullifier = FF(0x7777);
64 const auto deployer_protocol_contract_address = FF(0x6666);
65 const auto expected_rows = 2;
66
67 auto contract_instance = create_test_contract_instance();
68
70 {
71 ContractInstanceRetrievalEvent{
72 .address = contract_address,
73 .contract_instance = contract_instance,
74 .nullifier_tree_root = nullifier_tree_root,
75 .public_data_tree_root = public_data_tree_root,
76 .deployment_nullifier = deployment_nullifier,
77 .nullifier_exists = true,
78 .deployer_protocol_contract_address = deployer_protocol_contract_address,
79 },
80 },
81 trace);
82
83 auto rows = trace.as_rows();
84
85 // Skippable gadget row + 1 event row
86 ASSERT_EQ(rows.size(), expected_rows);
87
88 // Check skippable gadget row
89 EXPECT_THAT(rows.at(0), ROW_FIELD_EQ(contract_instance_retrieval_sel, 0));
90
91 // Check event row
92 EXPECT_THAT(rows.at(1),
93 AllOf(ROW_FIELD_EQ(contract_instance_retrieval_sel, 1),
94 ROW_FIELD_EQ(contract_instance_retrieval_address, contract_address),
95 ROW_FIELD_EQ(contract_instance_retrieval_exists, 1),
96
97 // Contract instance members
98 ROW_FIELD_EQ(contract_instance_retrieval_salt, 123),
99 ROW_FIELD_EQ(contract_instance_retrieval_deployer_addr, 0x123456789ULL),
100 ROW_FIELD_EQ(contract_instance_retrieval_current_class_id, 0xdeadbeefULL),
101 ROW_FIELD_EQ(contract_instance_retrieval_original_class_id, 0xcafebabeULL),
102 ROW_FIELD_EQ(contract_instance_retrieval_init_hash, 0x11111111ULL),
103
104 // Public keys
105 ROW_FIELD_EQ(contract_instance_retrieval_nullifier_key_x, 0x100),
106 ROW_FIELD_EQ(contract_instance_retrieval_nullifier_key_y, 0x101),
107 ROW_FIELD_EQ(contract_instance_retrieval_incoming_viewing_key_x, 0x200),
108 ROW_FIELD_EQ(contract_instance_retrieval_incoming_viewing_key_y, 0x201),
109 ROW_FIELD_EQ(contract_instance_retrieval_outgoing_viewing_key_x, 0x300),
110 ROW_FIELD_EQ(contract_instance_retrieval_outgoing_viewing_key_y, 0x301),
111 ROW_FIELD_EQ(contract_instance_retrieval_tagging_key_x, 0x400),
112 ROW_FIELD_EQ(contract_instance_retrieval_tagging_key_y, 0x401),
113
114 // Tree context
115 ROW_FIELD_EQ(contract_instance_retrieval_public_data_tree_root, public_data_tree_root),
116 ROW_FIELD_EQ(contract_instance_retrieval_nullifier_tree_root, nullifier_tree_root),
117
118 // Deployer protocol contract address
119 ROW_FIELD_EQ(contract_instance_retrieval_deployer_protocol_contract_address,
120 deployer_protocol_contract_address)));
121}
122
123TEST(ContractInstanceRetrievalTraceGenTest, MultipleEvents)
124{
125 TestTraceContainer trace;
126 ContractInstanceRetrievalTraceBuilder builder;
127
128 // Test constants
129 const auto num_events = 5;
130 const auto base_address = 0x1000;
131 const auto base_nullifier_tree_root = 0x2000;
132 const auto base_public_data_tree_root = 0x3000;
133 const auto base_deployment_nullifier = 0x4000;
134 const auto base_deployer_protocol_contract_address = 0x5000;
135 const auto base_salt = 1000;
136 const auto expected_rows = num_events + 1; // +1 for skippable gadget row
137
139
140 // Create events with different data
141 for (uint32_t i = 0; i < num_events; i++) {
142 auto contract_instance = create_test_contract_instance(base_salt + i);
143
144 events.push_back(ContractInstanceRetrievalEvent{
145 .address = FF(base_address + i),
146 .contract_instance = contract_instance,
147 .nullifier_tree_root = FF(base_nullifier_tree_root + i),
148 .public_data_tree_root = FF(base_public_data_tree_root + i),
149 .deployment_nullifier = FF(base_deployment_nullifier + i),
150 .nullifier_exists = (i % 2 == 0), // Alternate true/false
151 .deployer_protocol_contract_address = FF(base_deployer_protocol_contract_address + i),
152 });
153 }
154
155 builder.process(events, trace);
156 auto rows = trace.as_rows();
157
158 ASSERT_EQ(rows.size(), expected_rows);
159
160 // Check each event row
161 for (uint32_t i = 0; i < num_events; i++) {
162 EXPECT_THAT(
163 rows.at(i + 1),
164 AllOf(ROW_FIELD_EQ(contract_instance_retrieval_sel, 1),
165 ROW_FIELD_EQ(contract_instance_retrieval_address, base_address + i),
166 ROW_FIELD_EQ(contract_instance_retrieval_exists, i % 2 == 0 ? 1 : 0),
167 ROW_FIELD_EQ(contract_instance_retrieval_salt, base_salt + i),
168 ROW_FIELD_EQ(contract_instance_retrieval_nullifier_tree_root, base_nullifier_tree_root + i),
169 ROW_FIELD_EQ(contract_instance_retrieval_public_data_tree_root, base_public_data_tree_root + i),
170 ROW_FIELD_EQ(contract_instance_retrieval_deployer_protocol_contract_address,
171 base_deployer_protocol_contract_address + i)));
172 }
173}
174
175} // namespace
176} // namespace bb::avm2::tracegen
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
std::vector< AvmFullRowConstRef > as_rows() const
const FF & get(Column col, uint32_t row) const
AluTraceBuilder builder
Definition alu.test.cpp:123
TestTraceContainer trace
#define ROW_FIELD_EQ(field_name, expression)
Definition macros.hpp:15
TEST(EmitUnencryptedLogTest, Basic)
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13