Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
get_contract_instance_trace.test.cpp
Go to the documentation of this file.
2
3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
5
15
16namespace bb::avm2::tracegen {
17namespace {
18
19using ::testing::AllOf;
20using ::testing::ElementsAre;
21
22TEST(GetContractInstanceTraceTest, ValidMemberEnum)
23{
24 // Test constants
25 const uint32_t execution_clk = 42;
26 const FF nullifier_tree_root = 0x1234;
27 const FF public_data_tree_root = 0x5678;
28 const FF contract_address = 0x1234;
29 const uint32_t dst_offset = 100;
30 const uint32_t space_id = 1;
31 const FF deployer_addr = 0x5678;
32 const FF class_id = 0x9ABC;
33 const FF init_hash = 0xDEF0;
34 const uint32_t dst_offset_plus_one = dst_offset + 1;
35 const uint8_t deployer_enum = static_cast<uint8_t>(ContractInstanceMember::DEPLOYER);
36 const uint8_t u1_tag = static_cast<uint8_t>(ValueTag::U1);
37 const uint8_t ff_tag = static_cast<uint8_t>(ValueTag::FF);
38
39 TestTraceContainer trace;
40 GetContractInstanceTraceBuilder builder;
41 simulation::EventEmitter<simulation::GetContractInstanceEvent> emitter;
42
43 simulation::GetContractInstanceEvent event = {
44 .execution_clk = execution_clk,
45 .contract_address = contract_address,
46 .dst_offset = dst_offset,
47 .member_enum = deployer_enum,
48 .space_id = space_id,
49 .nullifier_tree_root = nullifier_tree_root,
50 .public_data_tree_root = public_data_tree_root,
51 .instance_exists = true,
52 .retrieved_deployer_addr = deployer_addr,
53 .retrieved_class_id = class_id,
54 .retrieved_init_hash = init_hash,
55 };
56
57 emitter.emit(std::move(event));
58 auto events = emitter.dump_events();
59
60 builder.process(events, trace);
61
62 EXPECT_THAT(trace.as_rows(),
63 ElementsAre(
64 // Row 0: Skippable gadget selector
65 AllOf(ROW_FIELD_EQ(get_contract_instance_sel, 0)),
66 // Row 1: Active GetContractInstance gadget
67 AllOf(ROW_FIELD_EQ(get_contract_instance_sel, 1),
68 ROW_FIELD_EQ(get_contract_instance_clk, execution_clk),
69 ROW_FIELD_EQ(get_contract_instance_contract_address, contract_address),
70 ROW_FIELD_EQ(get_contract_instance_dst_offset, dst_offset),
71 ROW_FIELD_EQ(get_contract_instance_member_enum, deployer_enum),
72 ROW_FIELD_EQ(get_contract_instance_space_id, space_id),
73 // Member selection flags
74 ROW_FIELD_EQ(get_contract_instance_is_valid_member_enum, 1),
75 ROW_FIELD_EQ(get_contract_instance_is_deployer, 1),
76 ROW_FIELD_EQ(get_contract_instance_is_class_id, 0),
77 ROW_FIELD_EQ(get_contract_instance_is_init_hash, 0),
78 // Error flags
79 ROW_FIELD_EQ(get_contract_instance_sel_error, 0),
80 // Retrieved members
81 ROW_FIELD_EQ(get_contract_instance_retrieved_deployer_addr, deployer_addr),
82 ROW_FIELD_EQ(get_contract_instance_retrieved_class_id, class_id),
83 ROW_FIELD_EQ(get_contract_instance_retrieved_init_hash, init_hash),
84 // Memory write columns
85 ROW_FIELD_EQ(get_contract_instance_member_write_offset, dst_offset_plus_one),
86 ROW_FIELD_EQ(get_contract_instance_exists_tag, u1_tag),
87 ROW_FIELD_EQ(get_contract_instance_member_tag, ff_tag))));
88}
89
90TEST(GetContractInstanceTraceTest, InvalidMemberEnum)
91{
92 // Test constants
93 const uint32_t execution_clk = 42;
94 const FF nullifier_tree_root = 0x1234;
95 const FF public_data_tree_root = 0x5678;
96 const FF contract_address = 0x1234;
97 const uint32_t dst_offset = 100;
98 const uint32_t space_id = 1;
99 const FF deployer_addr = 0x5678;
100 const FF class_id = 0x9ABC;
101 const FF init_hash = 0xDEF0;
102 const uint8_t invalid_enum = 5; // Invalid enum (> 2)
103
104 TestTraceContainer trace;
105 GetContractInstanceTraceBuilder builder;
106 simulation::EventEmitter<simulation::GetContractInstanceEvent> emitter;
107
108 simulation::GetContractInstanceEvent event = {
109 .execution_clk = execution_clk,
110 .contract_address = contract_address,
111 .dst_offset = dst_offset,
112 .member_enum = invalid_enum,
113 .space_id = space_id,
114 .nullifier_tree_root = nullifier_tree_root,
115 .public_data_tree_root = public_data_tree_root,
116 .instance_exists = true,
117 .retrieved_deployer_addr = deployer_addr,
118 .retrieved_class_id = class_id,
119 .retrieved_init_hash = init_hash,
120 };
121
122 emitter.emit(std::move(event));
123 auto events = emitter.dump_events();
124
125 builder.process(events, trace);
126
127 EXPECT_THAT(trace.as_rows(),
128 ElementsAre(
129 // Row 0: Skippable gadget selector
130 AllOf(ROW_FIELD_EQ(get_contract_instance_sel, 0)),
131 // Row 1: GetContractInstance gadget with invalid enum
132 AllOf(ROW_FIELD_EQ(get_contract_instance_sel, 1),
133 ROW_FIELD_EQ(get_contract_instance_clk, execution_clk),
134 ROW_FIELD_EQ(get_contract_instance_contract_address, contract_address),
135 ROW_FIELD_EQ(get_contract_instance_dst_offset, dst_offset),
136 ROW_FIELD_EQ(get_contract_instance_member_enum, invalid_enum),
137 ROW_FIELD_EQ(get_contract_instance_space_id, space_id),
138 // Error flags
139 ROW_FIELD_EQ(get_contract_instance_sel_error, 1), // Should have error
140 // Member selection flags (should all be false for invalid enum)
141 ROW_FIELD_EQ(get_contract_instance_is_valid_member_enum, 0),
142 ROW_FIELD_EQ(get_contract_instance_is_deployer, 0),
143 ROW_FIELD_EQ(get_contract_instance_is_class_id, 0),
144 ROW_FIELD_EQ(get_contract_instance_is_init_hash, 0))));
145}
146
147TEST(GetContractInstanceTraceTest, OutOfBoundsWrite)
148{
149 // Test constants
150 const uint32_t execution_clk = 42;
151 const FF nullifier_tree_root = 0x1234;
152 const FF public_data_tree_root = 0x5678;
153 const FF contract_address = 0x1234;
154 const uint32_t dst_offset = AVM_HIGHEST_MEM_ADDRESS; // Max address, so +1 is out of bounds
155 const uint32_t space_id = 1;
156 const FF deployer_addr = 0x5678;
157 const FF class_id = 0x9ABC;
158 const FF init_hash = 0xDEF0;
159 const uint8_t class_id_enum = static_cast<uint8_t>(ContractInstanceMember::CLASS_ID);
160 const uint32_t out_of_bounds_write_offset = AVM_HIGHEST_MEM_ADDRESS + 1;
161 const uint8_t zero_tag = 0;
162
163 TestTraceContainer trace;
164 GetContractInstanceTraceBuilder builder;
165 simulation::EventEmitter<simulation::GetContractInstanceEvent> emitter;
166
167 simulation::GetContractInstanceEvent event = {
168 .execution_clk = execution_clk,
169 .contract_address = contract_address,
170 .dst_offset = dst_offset,
171 .member_enum = class_id_enum,
172 .space_id = space_id,
173 .nullifier_tree_root = nullifier_tree_root,
174 .public_data_tree_root = public_data_tree_root,
175 .instance_exists = true,
176 .retrieved_deployer_addr = deployer_addr,
177 .retrieved_class_id = class_id,
178 .retrieved_init_hash = init_hash,
179 };
180
181 emitter.emit(std::move(event));
182 auto events = emitter.dump_events();
183
184 builder.process(events, trace);
185
186 EXPECT_THAT(trace.as_rows(),
187 ElementsAre(
188 // Row 0: Skippable gadget selector
189 AllOf(ROW_FIELD_EQ(get_contract_instance_sel, 0)),
190 // Row 1: GetContractInstance gadget with out-of-bounds destination
191 AllOf(ROW_FIELD_EQ(get_contract_instance_sel, 1),
192 ROW_FIELD_EQ(get_contract_instance_clk, execution_clk),
193 ROW_FIELD_EQ(get_contract_instance_contract_address, contract_address),
194 ROW_FIELD_EQ(get_contract_instance_dst_offset, dst_offset),
195 ROW_FIELD_EQ(get_contract_instance_member_enum, class_id_enum),
196 ROW_FIELD_EQ(get_contract_instance_space_id, space_id),
197 // Error flags
198 ROW_FIELD_EQ(get_contract_instance_sel_error, 1), // Should have error
199 // dst_offset_diff_max_inv calculation (when DST_OFFSET_DIFF_MAX = 0)
200 ROW_FIELD_EQ(get_contract_instance_dst_offset_diff_max_inv, 0),
201 // Memory write columns (should be 0 for invalid tags when out of bounds)
202 ROW_FIELD_EQ(get_contract_instance_member_write_offset, out_of_bounds_write_offset),
203 ROW_FIELD_EQ(get_contract_instance_exists_tag, zero_tag), // Should be 0 when out of bounds
204 ROW_FIELD_EQ(get_contract_instance_member_tag, zero_tag) // Should be 0 when out of bounds
205 )));
206}
207
208} // namespace
209} // namespace bb::avm2::tracegen
#define AVM_HIGHEST_MEM_ADDRESS
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
std::vector< AvmFullRowConstRef > as_rows() const
AluTraceBuilder builder
Definition alu.test.cpp:123
TestTraceContainer trace
#define ROW_FIELD_EQ(field_name, expression)
Definition macros.hpp:15
TEST(EmitUnencryptedLogTest, Basic)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
simulation::PublicDataTreeReadWriteEvent event