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
38
39namespace bb::avm2::tracegen {
40namespace {
41
42using ::testing::_;
43using ::testing::NiceMock;
44using ::testing::Return;
45using ::testing::ReturnRef;
46
48using simulation::EventEmitter;
49using simulation::ExecutionIdManager;
50using simulation::FieldGreaterThan;
51using simulation::FieldGreaterThanEvent;
52using simulation::GreaterThan;
53using simulation::GreaterThanEvent;
54using simulation::MerkleDB;
55using simulation::MockFieldGreaterThan;
56using simulation::MockGreaterThan;
57using simulation::MockL1ToL2MessageTreeCheck;
58using simulation::MockLowLevelMerkleDB;
59using simulation::MockMerkleCheck;
60using simulation::MockNoteHashTreeCheck;
61using simulation::MockNullifierTreeCheck;
62using simulation::MockWrittenPublicDataSlotsTreeCheck;
63using simulation::NoopEventEmitter;
64using simulation::Poseidon2;
65using simulation::Poseidon2HashEvent;
66using simulation::Poseidon2PermutationEvent;
67using simulation::Poseidon2PermutationMemoryEvent;
68using simulation::PublicDataTreeCheck;
71using simulation::RangeCheck;
72using simulation::RangeCheckEvent;
73using simulation::UpdateCheck;
74using simulation::UpdateCheckEvent;
75
77using C = Column;
80
81TEST(UpdateCheckTracegenTest, HashZeroInteractions)
82{
83 uint64_t current_timestamp = 100;
85 instance.current_contract_class_id = instance.original_contract_class_id;
87 FF delayed_public_mutable_slot = poseidon2::hash({ UPDATED_CLASS_IDS_SLOT, derived_address });
88 FF delayed_public_mutable_hash_slot = delayed_public_mutable_slot + UPDATES_DELAYED_PUBLIC_MUTABLE_VALUES_LEN;
89 FF delayed_public_mutable_hash_leaf_slot = poseidon2::hash(
90 { DOM_SEP__PUBLIC_LEAF_INDEX, CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS, delayed_public_mutable_hash_slot });
91
92 TreeSnapshots trees;
93 trees.public_data_tree.root = 42;
94
95 ExecutionIdManager execution_id_manager(0);
96
97 EventEmitter<Poseidon2HashEvent> hash_event_emitter;
98 NoopEventEmitter<Poseidon2PermutationEvent> perm_event_emitter;
99 NoopEventEmitter<Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
100 NoopEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
101 NoopEventEmitter<GreaterThanEvent> greater_than_event_emitter;
102
103 EventEmitter<RangeCheckEvent> range_check_event_emitter;
105
106 NiceMock<MockFieldGreaterThan> mock_field_gt;
107 NiceMock<MockMerkleCheck> mock_merkle_check;
108 NiceMock<MockNullifierTreeCheck> mock_nullifier_tree_check;
109 NiceMock<MockNoteHashTreeCheck> mock_note_hash_tree_check;
110 NiceMock<MockWrittenPublicDataSlotsTreeCheck> mock_written_public_data_slots_tree_check;
111 NiceMock<MockL1ToL2MessageTreeCheck> mock_l1_to_l2_message_tree_check;
112
113 GreaterThan gt(mock_field_gt, range_check, greater_than_event_emitter);
115 EventEmitter<PublicDataTreeCheckEvent> public_data_tree_check_event_emitter;
116 PublicDataTreeCheck public_data_tree_check(
117 poseidon2, mock_merkle_check, mock_field_gt, execution_id_manager, public_data_tree_check_event_emitter);
118
119 NiceMock<MockLowLevelMerkleDB> mock_low_level_merkle_db;
120
121 MerkleDB merkle_db(mock_low_level_merkle_db,
122 public_data_tree_check,
123 mock_nullifier_tree_check,
124 mock_note_hash_tree_check,
125 mock_written_public_data_slots_tree_check,
126 mock_l1_to_l2_message_tree_check);
127
128 EventEmitter<UpdateCheckEvent> update_check_event_emitter;
129 UpdateCheck update_check(
130 poseidon2, range_check, gt, merkle_db, update_check_event_emitter, { .timestamp = current_timestamp });
131
132 uint32_t leaf_index = 27;
133 EXPECT_CALL(mock_low_level_merkle_db, get_tree_roots()).WillRepeatedly(Return(trees));
134 EXPECT_CALL(mock_low_level_merkle_db, get_sibling_path(world_state::MerkleTreeId::PUBLIC_DATA_TREE, _))
135 .WillOnce(Return(fr_sibling_path{ 0 }));
136 EXPECT_CALL(mock_low_level_merkle_db, get_leaf_preimage_public_data_tree(_))
137 .WillOnce(Return(PublicDataTreeLeafPreimage(PublicDataLeafValue(1, 0), 0, 0)));
138 EXPECT_CALL(
139 mock_low_level_merkle_db,
140 get_low_indexed_leaf(world_state::MerkleTreeId::PUBLIC_DATA_TREE, delayed_public_mutable_hash_leaf_slot))
141 .WillOnce(Return(GetLowIndexedLeafResponse(false, leaf_index)));
142
143 EXPECT_CALL(mock_field_gt, ff_gt(_, _)).WillRepeatedly(Return(true));
144
145 update_check.check_current_class_id(derived_address, instance);
146
147 Poseidon2TraceBuilder poseidon2_builder;
148 RangeCheckTraceBuilder range_check_builder;
149 GreaterThanTraceBuilder greater_than_builder;
150 PublicDataTreeTraceBuilder public_data_check_builder;
151 UpdateCheckTraceBuilder update_check_builder;
152
153 TestTraceContainer trace({ { { C::precomputed_first_row, 1 } } });
154
157 greater_than_builder.process(greater_than_event_emitter.dump_events(), trace);
158 public_data_check_builder.process(public_data_tree_check_event_emitter.dump_events(), trace);
159 update_check_builder.process(update_check_event_emitter.dump_events(), trace);
160
161 constraining::check_interaction<UpdateCheckTraceBuilder,
168}
169
170TEST(UpdateCheckTracegenTest, HashNonzeroInteractions)
171{
172 uint64_t current_timestamp = 100;
175 uint64_t update_timestamp_of_change = current_timestamp - 1;
176
177 ContractInstance instance = testing::random_contract_instance();
178 instance.current_contract_class_id = update_post_class;
180 FF delayed_public_mutable_slot = poseidon2::hash({ UPDATED_CLASS_IDS_SLOT, derived_address });
181
182 TreeSnapshots trees;
183 trees.public_data_tree.root = 42;
184
185 ExecutionIdManager execution_id_manager(0);
186
187 EventEmitter<Poseidon2HashEvent> hash_event_emitter;
188 NoopEventEmitter<Poseidon2PermutationEvent> perm_event_emitter;
189 NoopEventEmitter<Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
190 NoopEventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
191
192 EventEmitter<RangeCheckEvent> range_check_event_emitter;
194
195 NiceMock<MockFieldGreaterThan> mock_field_gt;
196 NiceMock<MockMerkleCheck> mock_merkle_check;
197 NiceMock<MockNullifierTreeCheck> mock_nullifier_tree_check;
198 NiceMock<MockNoteHashTreeCheck> mock_note_hash_tree_check;
199 NiceMock<MockWrittenPublicDataSlotsTreeCheck> mock_written_public_data_slots_tree_check;
200 NiceMock<MockL1ToL2MessageTreeCheck> mock_l1_to_l2_message_tree_check;
201
202 EventEmitter<GreaterThanEvent> greater_than_event_emitter;
203 GreaterThan gt(mock_field_gt, range_check, greater_than_event_emitter);
205
206 EventEmitter<PublicDataTreeCheckEvent> public_data_tree_check_event_emitter;
207 PublicDataTreeCheck public_data_tree_check(
208 poseidon2, mock_merkle_check, mock_field_gt, execution_id_manager, public_data_tree_check_event_emitter);
209
210 NiceMock<MockLowLevelMerkleDB> mock_low_level_merkle_db;
211
212 MerkleDB merkle_db(mock_low_level_merkle_db,
213 public_data_tree_check,
214 mock_nullifier_tree_check,
215 mock_note_hash_tree_check,
216 mock_written_public_data_slots_tree_check,
217 mock_l1_to_l2_message_tree_check);
218
219 EventEmitter<UpdateCheckEvent> update_check_event_emitter;
220 GlobalVariables globals{ .timestamp = current_timestamp };
221 UpdateCheck update_check(poseidon2, range_check, gt, merkle_db, update_check_event_emitter, globals);
222
223 FF update_metadata = FF(static_cast<uint64_t>(123) << 32) + update_timestamp_of_change;
224
225 std::vector<FF> update_leaf_values = { update_metadata, update_pre_class, update_post_class };
226 FF update_hash = poseidon2::hash(update_leaf_values);
227 update_leaf_values.push_back(update_hash);
228 std::vector<FF> update_leaf_slots;
229 for (size_t i = 0; i < update_leaf_values.size(); ++i) {
232 delayed_public_mutable_slot + i });
233 update_leaf_slots.push_back(leaf_slot);
234 }
235
236 EXPECT_CALL(mock_low_level_merkle_db, get_tree_roots()).WillRepeatedly(Return(trees));
237 EXPECT_CALL(mock_low_level_merkle_db, get_sibling_path(world_state::MerkleTreeId::PUBLIC_DATA_TREE, _))
238 .WillOnce(Return(fr_sibling_path{ 0 }));
239 EXPECT_CALL(mock_low_level_merkle_db, get_leaf_preimage_public_data_tree(_))
240 .WillRepeatedly([&](const uint64_t& index) {
242 PublicDataLeafValue(update_leaf_slots[index], update_leaf_values[index]), 0, 0);
243 });
244
245 EXPECT_CALL(mock_low_level_merkle_db, get_low_indexed_leaf(world_state::MerkleTreeId::PUBLIC_DATA_TREE, _))
246 .WillRepeatedly([&](world_state::MerkleTreeId, const FF& leaf_slot) {
247 for (size_t i = 0; i < update_leaf_slots.size(); ++i) {
248 if (leaf_slot == update_leaf_slots[i]) {
249 return GetLowIndexedLeafResponse(true, static_cast<uint64_t>(i));
250 }
251 }
252 throw std::runtime_error("Leaf not found");
253 });
254
255 EXPECT_CALL(mock_field_gt, ff_gt(_, _)).WillRepeatedly(Return(true));
256
257 update_check.check_current_class_id(derived_address, instance);
258
259 Poseidon2TraceBuilder poseidon2_builder;
260 RangeCheckTraceBuilder range_check_builder;
261 GreaterThanTraceBuilder greater_than_builder;
262 PublicDataTreeTraceBuilder public_data_check_builder;
263 UpdateCheckTraceBuilder update_check_builder;
264
265 TestTraceContainer trace({ { { C::precomputed_first_row, 1 } } });
266
269 greater_than_builder.process(greater_than_event_emitter.dump_events(), trace);
270 public_data_check_builder.process(public_data_tree_check_event_emitter.dump_events(), trace);
271 update_check_builder.process(update_check_event_emitter.dump_events(), trace);
272
273 constraining::check_interaction<UpdateCheckTraceBuilder,
280}
281
282} // namespace
283} // namespace bb::avm2::tracegen
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define UPDATES_DELAYED_PUBLIC_MUTABLE_VALUES_LEN
#define UPDATED_CLASS_IDS_SLOT
#define DOM_SEP__PUBLIC_LEAF_INDEX
#define CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS
EventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
EventEmitter< Poseidon2PermutationEvent > perm_event_emitter
EventEmitter< Poseidon2HashEvent > hash_event_emitter
Poseidon2TraceBuilder poseidon2_builder
StrictMock< MockHighLevelMerkleDB > merkle_db
void process_hash(const simulation::EventEmitterInterface< simulation::Poseidon2HashEvent >::Container &hash_events, TraceContainer &trace)
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.
RangeCheckTraceBuilder range_check_builder
Definition alu.test.cpp:121
ExecutionIdManager execution_id_manager
EventEmitter< RangeCheckEvent > range_check_event_emitter
StrictMock< MockFieldGreaterThan > mock_field_gt
RangeCheck range_check
GreaterThan gt
TestTraceContainer trace
StrictMock< MockUpdateCheck > update_check
void check_interaction(tracegen::TestTraceContainer &trace)
std::variant< PublicDataTreeReadWriteEvent, CheckPointEventType > PublicDataTreeCheckEvent
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > poseidon2
IndexedLeaf< PublicDataLeafValue > PublicDataTreeLeafPreimage
::bb::crypto::merkle_tree::PublicDataLeafValue PublicDataLeafValue
Definition db.hpp:38
FF compute_contract_address(const ContractInstance &contract_instance)
ContractInstance random_contract_instance()
Definition fixtures.cpp:159
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_timestamp_is_lt_timestamp_of_change_settings_ > lookup_update_check_timestamp_is_lt_timestamp_of_change_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)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
NoopEventEmitter< GreaterThanEvent > greater_than_event_emitter
NoopEventEmitter< FieldGreaterThanEvent > field_gt_event_emitter
FF update_timestamp_of_change
FF update_pre_class
FF update_post_class