Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
update_check_trace.test.cpp
Go to the documentation of this file.
2
3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
5
6#include <cmath>
7#include <cstdint>
8
37
38namespace bb::avm2::tracegen {
39namespace {
40
41using ::testing::_;
42using ::testing::NiceMock;
43using ::testing::Return;
44using ::testing::ReturnRef;
45
47using simulation::EventEmitter;
48using simulation::ExecutionIdManager;
49using simulation::FieldGreaterThan;
50using simulation::FieldGreaterThanEvent;
51using simulation::MerkleDB;
52using simulation::MockFieldGreaterThan;
53using simulation::MockGreaterThan;
54using simulation::MockL1ToL2MessageTreeCheck;
55using simulation::MockLowLevelMerkleDB;
56using simulation::MockMerkleCheck;
57using simulation::MockNoteHashTreeCheck;
58using simulation::MockNullifierTreeCheck;
59using simulation::MockWrittenPublicDataSlotsTreeCheck;
60using simulation::NoopEventEmitter;
61using simulation::Poseidon2;
62using simulation::Poseidon2HashEvent;
63using simulation::Poseidon2PermutationEvent;
64using simulation::Poseidon2PermutationMemoryEvent;
65using simulation::PublicDataTreeCheck;
68using simulation::RangeCheck;
69using simulation::RangeCheckEvent;
70using simulation::UpdateCheck;
71using simulation::UpdateCheckEvent;
72
74using C = Column;
77
78TEST(UpdateCheckTracegenTest, HashZeroInteractions)
79{
80 uint64_t current_timestamp = 100;
81 ContractInstance instance = testing::random_contract_instance();
82 instance.current_class_id = instance.original_class_id;
83 AztecAddress derived_address = compute_contract_address(instance);
84 FF delayed_public_mutable_slot = poseidon2::hash({ UPDATED_CLASS_IDS_SLOT, derived_address });
85 FF delayed_public_mutable_hash_slot = delayed_public_mutable_slot + UPDATES_DELAYED_PUBLIC_MUTABLE_VALUES_LEN;
86 FF delayed_public_mutable_hash_leaf_slot = poseidon2::hash({ GENERATOR_INDEX__PUBLIC_LEAF_INDEX,
88 delayed_public_mutable_hash_slot });
89
90 TreeSnapshots trees;
91 trees.publicDataTree.root = 42;
92
93 ExecutionIdManager execution_id_manager(0);
94
95 EventEmitter<Poseidon2HashEvent> hash_event_emitter;
96 NoopEventEmitter<Poseidon2PermutationEvent> perm_event_emitter;
97 NoopEventEmitter<Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
98 NoopEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
99
100 EventEmitter<RangeCheckEvent> range_check_event_emitter;
102
103 NiceMock<MockFieldGreaterThan> mock_field_gt;
104 NiceMock<MockMerkleCheck> mock_merkle_check;
105 NiceMock<MockNullifierTreeCheck> mock_nullifier_tree_check;
106 NiceMock<MockNoteHashTreeCheck> mock_note_hash_tree_check;
107 NiceMock<MockWrittenPublicDataSlotsTreeCheck> mock_written_public_data_slots_tree_check;
108 NiceMock<MockL1ToL2MessageTreeCheck> mock_l1_to_l2_message_tree_check;
109
110 NiceMock<MockGreaterThan> mock_gt;
112 EventEmitter<PublicDataTreeCheckEvent> public_data_tree_check_event_emitter;
113 PublicDataTreeCheck public_data_tree_check(
114 poseidon2, mock_merkle_check, mock_field_gt, execution_id_manager, public_data_tree_check_event_emitter);
115
116 NiceMock<MockLowLevelMerkleDB> mock_low_level_merkle_db;
117
118 MerkleDB merkle_db(mock_low_level_merkle_db,
119 public_data_tree_check,
120 mock_nullifier_tree_check,
121 mock_note_hash_tree_check,
122 mock_written_public_data_slots_tree_check,
123 mock_l1_to_l2_message_tree_check);
124
125 EventEmitter<UpdateCheckEvent> update_check_event_emitter;
126 UpdateCheck update_check(
127 poseidon2, range_check, merkle_db, update_check_event_emitter, { .timestamp = current_timestamp });
128
129 uint32_t leaf_index = 27;
130 EXPECT_CALL(mock_low_level_merkle_db, get_tree_roots()).WillRepeatedly(ReturnRef(trees));
131 EXPECT_CALL(mock_low_level_merkle_db, get_sibling_path(world_state::MerkleTreeId::PUBLIC_DATA_TREE, _))
132 .WillOnce(Return(fr_sibling_path{ 0 }));
133 EXPECT_CALL(mock_low_level_merkle_db, get_leaf_preimage_public_data_tree(_))
134 .WillOnce(Return(PublicDataTreeLeafPreimage(PublicDataLeafValue(1, 0), 0, 0)));
135 EXPECT_CALL(
136 mock_low_level_merkle_db,
137 get_low_indexed_leaf(world_state::MerkleTreeId::PUBLIC_DATA_TREE, delayed_public_mutable_hash_leaf_slot))
138 .WillOnce(Return(GetLowIndexedLeafResponse(false, leaf_index)));
139
140 EXPECT_CALL(mock_field_gt, ff_gt(_, _)).WillRepeatedly(Return(true));
141
142 update_check.check_current_class_id(derived_address, instance);
143
144 Poseidon2TraceBuilder poseidon2_builder;
145 RangeCheckTraceBuilder range_check_builder;
146 PublicDataTreeTraceBuilder public_data_check_builder;
147 UpdateCheckTraceBuilder update_check_builder;
148
149 TestTraceContainer trace({ { { C::precomputed_first_row, 1 } } });
150
151 poseidon2_builder.process_hash(hash_event_emitter.dump_events(), trace);
153 public_data_check_builder.process(public_data_tree_check_event_emitter.dump_events(), trace);
154 update_check_builder.process(update_check_event_emitter.dump_events(), trace);
155
156 constraining::check_interaction<UpdateCheckTraceBuilder,
163}
164
165TEST(UpdateCheckTracegenTest, HashNonzeroInteractions)
166{
167 uint64_t current_timestamp = 100;
170 uint64_t update_timestamp_of_change = current_timestamp - 1;
171
172 ContractInstance instance = testing::random_contract_instance();
173 instance.current_class_id = update_post_class;
174 AztecAddress derived_address = compute_contract_address(instance);
175 FF delayed_public_mutable_slot = poseidon2::hash({ UPDATED_CLASS_IDS_SLOT, derived_address });
176
177 TreeSnapshots trees;
178 trees.publicDataTree.root = 42;
179
180 ExecutionIdManager execution_id_manager(0);
181
182 EventEmitter<Poseidon2HashEvent> hash_event_emitter;
183 NoopEventEmitter<Poseidon2PermutationEvent> perm_event_emitter;
184 NoopEventEmitter<Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
185 NoopEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
186
187 EventEmitter<RangeCheckEvent> range_check_event_emitter;
189
190 NiceMock<MockFieldGreaterThan> mock_field_gt;
191 NiceMock<MockMerkleCheck> mock_merkle_check;
192 NiceMock<MockNullifierTreeCheck> mock_nullifier_tree_check;
193 NiceMock<MockNoteHashTreeCheck> mock_note_hash_tree_check;
194 NiceMock<MockWrittenPublicDataSlotsTreeCheck> mock_written_public_data_slots_tree_check;
195 NiceMock<MockL1ToL2MessageTreeCheck> mock_l1_to_l2_message_tree_check;
196 NiceMock<MockGreaterThan> mock_gt;
197
199
200 EventEmitter<PublicDataTreeCheckEvent> public_data_tree_check_event_emitter;
201 PublicDataTreeCheck public_data_tree_check(
202 poseidon2, mock_merkle_check, mock_field_gt, execution_id_manager, public_data_tree_check_event_emitter);
203
204 NiceMock<MockLowLevelMerkleDB> mock_low_level_merkle_db;
205
206 MerkleDB merkle_db(mock_low_level_merkle_db,
207 public_data_tree_check,
208 mock_nullifier_tree_check,
209 mock_note_hash_tree_check,
210 mock_written_public_data_slots_tree_check,
211 mock_l1_to_l2_message_tree_check);
212
213 EventEmitter<UpdateCheckEvent> update_check_event_emitter;
214 GlobalVariables globals{ .timestamp = current_timestamp };
215 UpdateCheck update_check(poseidon2, range_check, merkle_db, update_check_event_emitter, globals);
216
217 FF update_metadata = FF(static_cast<uint64_t>(123) << 32) + update_timestamp_of_change;
218
219 std::vector<FF> update_leaf_values = { update_metadata, update_pre_class, update_post_class };
220 FF update_hash = poseidon2::hash(update_leaf_values);
221 update_leaf_values.push_back(update_hash);
222 std::vector<FF> update_leaf_slots;
223 for (size_t i = 0; i < update_leaf_values.size(); ++i) {
226 delayed_public_mutable_slot + i });
227 update_leaf_slots.push_back(leaf_slot);
228 }
229
230 EXPECT_CALL(mock_low_level_merkle_db, get_tree_roots()).WillRepeatedly(ReturnRef(trees));
231 EXPECT_CALL(mock_low_level_merkle_db, get_sibling_path(world_state::MerkleTreeId::PUBLIC_DATA_TREE, _))
232 .WillOnce(Return(fr_sibling_path{ 0 }));
233 EXPECT_CALL(mock_low_level_merkle_db, get_leaf_preimage_public_data_tree(_))
234 .WillRepeatedly([&](const uint64_t& index) {
236 PublicDataLeafValue(update_leaf_slots[index], update_leaf_values[index]), 0, 0);
237 });
238
239 EXPECT_CALL(mock_low_level_merkle_db, get_low_indexed_leaf(world_state::MerkleTreeId::PUBLIC_DATA_TREE, _))
240 .WillRepeatedly([&](world_state::MerkleTreeId, const FF& leaf_slot) {
241 for (size_t i = 0; i < update_leaf_slots.size(); ++i) {
242 if (leaf_slot == update_leaf_slots[i]) {
243 return GetLowIndexedLeafResponse(true, static_cast<uint64_t>(i));
244 }
245 }
246 throw std::runtime_error("Leaf not found");
247 });
248
249 EXPECT_CALL(mock_field_gt, ff_gt(_, _)).WillRepeatedly(Return(true));
250
251 update_check.check_current_class_id(derived_address, instance);
252
253 Poseidon2TraceBuilder poseidon2_builder;
254 RangeCheckTraceBuilder range_check_builder;
255 PublicDataTreeTraceBuilder public_data_check_builder;
256 UpdateCheckTraceBuilder update_check_builder;
257
258 TestTraceContainer trace({ { { C::precomputed_first_row, 1 } } });
259
260 poseidon2_builder.process_hash(hash_event_emitter.dump_events(), trace);
262 public_data_check_builder.process(public_data_tree_check_event_emitter.dump_events(), trace);
263 update_check_builder.process(update_check_event_emitter.dump_events(), trace);
264
265 constraining::check_interaction<UpdateCheckTraceBuilder,
272}
273
274} // namespace
275} // namespace bb::avm2::tracegen
#define GENERATOR_INDEX__PUBLIC_LEAF_INDEX
#define UPDATES_DELAYED_PUBLIC_MUTABLE_VALUES_LEN
#define UPDATED_CLASS_IDS_SLOT
#define CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS
StrictMock< MockHighLevelMerkleDB > merkle_db
void process(const simulation::EventEmitterInterface< simulation::RangeCheckEvent >::Container &events, TraceContainer &trace)
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
Implements a parallelized batch insertion indexed tree Accepts template argument of the type of store...
RangeCheckTraceBuilder range_check_builder
Definition alu.test.cpp:120
ExecutionIdManager execution_id_manager
EventEmitter< RangeCheckEvent > range_check_event_emitter
StrictMock< MockFieldGreaterThan > mock_field_gt
RangeCheck range_check
TestTraceContainer trace
NoopEventEmitter< Poseidon2PermutationEvent > perm_event_emitter
NoopEventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
NiceMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2HashEvent > hash_event_emitter
void check_interaction(tracegen::TestTraceContainer &trace)
std::variant< PublicDataTreeReadWriteEvent, CheckPointEventType > PublicDataTreeCheckEvent
IndexedLeaf< PublicDataLeafValue > PublicDataTreeLeafPreimage
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > poseidon2
TEST(EmitUnencryptedLogTest, Basic)
::bb::crypto::merkle_tree::PublicDataLeafValue PublicDataLeafValue
FF compute_contract_address(const ContractInstance &contract_instance)
ContractInstance random_contract_instance()
Definition fixtures.cpp:158
lookup_settings< lookup_update_check_timestamp_of_change_cmp_range_settings_ > lookup_update_check_timestamp_of_change_cmp_range_settings
lookup_settings< lookup_update_check_delayed_public_mutable_slot_poseidon2_settings_ > lookup_update_check_delayed_public_mutable_slot_poseidon2_settings
lookup_settings< lookup_update_check_update_hash_public_data_read_settings_ > lookup_update_check_update_hash_public_data_read_settings
lookup_settings< lookup_update_check_update_lo_metadata_range_settings_ > lookup_update_check_update_lo_metadata_range_settings
lookup_settings< lookup_update_check_update_hi_metadata_range_settings_ > lookup_update_check_update_hi_metadata_range_settings
lookup_settings< lookup_update_check_update_hash_poseidon2_settings_ > lookup_update_check_update_hash_poseidon2_settings
AvmFlavorSettings::FF FF
Definition field.hpp:10
std::vector< fr > fr_sibling_path
Definition hash_path.hpp:16
fr_sibling_path get_sibling_path(TypeOfTree &tree, index_t index, bool includeUncommitted=true, bool expected_success=true)
typename Flavor::FF FF
FF update_timestamp_of_change
FF update_pre_class
FF update_post_class