Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
simulation_helper.cpp
Go to the documentation of this file.
2
3#include <cstdint>
4
10
15
16// Events.
40
41// Gadgets.
67
68// Standalone.
82
83namespace bb::avm2 {
84
85using namespace bb::avm2::simulation;
86
88 std::vector<PublicDataWrite> public_data_writes)
89{
90 BB_BENCH_NAME("AvmSimulationHelper::simulate_for_witgen");
91
92 EventEmitter<ExecutionEvent> execution_emitter;
95 EventEmitter<DataCopyEvent> data_copy_emitter;
96 EventEmitter<MemoryEvent> memory_emitter;
97 EventEmitter<BytecodeRetrievalEvent> bytecode_retrieval_emitter;
98 EventEmitter<BytecodeHashingEvent> bytecode_hashing_emitter;
99 EventEmitter<BytecodeDecompositionEvent> bytecode_decomposition_emitter;
100 DeduplicatingEventEmitter<InstructionFetchingEvent> instruction_fetching_emitter;
101 EventEmitter<AddressDerivationEvent> address_derivation_emitter;
102 EventEmitter<ClassIdDerivationEvent> class_id_derivation_emitter;
103 EventEmitter<SiloingEvent> siloing_emitter;
104 EventEmitter<Sha256CompressionEvent> sha256_compression_emitter;
105 EventEmitter<EccAddEvent> ecc_add_emitter;
106 EventEmitter<ScalarMulEvent> scalar_mul_emitter;
107 EventEmitter<EccAddMemoryEvent> ecc_add_memory_emitter;
108 EventEmitter<Poseidon2HashEvent> poseidon2_hash_emitter;
109 EventEmitter<Poseidon2PermutationEvent> poseidon2_perm_emitter;
110 EventEmitter<Poseidon2PermutationMemoryEvent> poseidon2_perm_mem_emitter;
111 EventEmitter<KeccakF1600Event> keccakf1600_emitter;
112 EventEmitter<ToRadixEvent> to_radix_emitter;
113 EventEmitter<ToRadixMemoryEvent> to_radix_memory_emitter;
115 EventEmitter<MerkleCheckEvent> merkle_check_emitter;
117 EventEmitter<ContextStackEvent> context_stack_emitter;
118 EventEmitter<PublicDataTreeCheckEvent> public_data_tree_check_emitter;
119 EventEmitter<UpdateCheckEvent> update_check_emitter;
120 EventEmitter<NullifierTreeCheckEvent> nullifier_tree_check_emitter;
122 EventEmitter<CalldataEvent> calldata_emitter;
123 EventEmitter<InternalCallStackEvent> internal_call_stack_emitter;
124 EventEmitter<NoteHashTreeCheckEvent> note_hash_tree_check_emitter;
125 EventEmitter<WrittenPublicDataSlotsTreeCheckEvent> written_public_data_slots_tree_check_emitter;
127 EventEmitter<ContractInstanceRetrievalEvent> contract_instance_retrieval_emitter;
128 EventEmitter<GetContractInstanceEvent> get_contract_instance_emitter;
129 EventEmitter<L1ToL2MessageTreeCheckEvent> l1_to_l2_msg_tree_check_emitter;
130 EventEmitter<EmitUnencryptedLogEvent> emit_unencrypted_log_emitter;
131 EventEmitter<RetrievedBytecodesTreeCheckEvent> retrieved_bytecodes_tree_check_emitter;
132
134 RangeCheck range_check(range_check_emitter);
135 FieldGreaterThan field_gt(range_check, field_gt_emitter);
136 GreaterThan greater_than(field_gt, range_check, greater_than_emitter);
137 ToRadix to_radix(execution_id_manager, greater_than, to_radix_emitter, to_radix_memory_emitter);
139 execution_id_manager, greater_than, poseidon2_hash_emitter, poseidon2_perm_emitter, poseidon2_perm_mem_emitter);
140 MerkleCheck merkle_check(poseidon2, merkle_check_emitter);
141 PublicDataTreeCheck public_data_tree_check(
142 poseidon2, merkle_check, field_gt, execution_id_manager, public_data_tree_check_emitter);
145 field_gt,
147 written_public_data_slots_tree_check_emitter);
149 poseidon2, merkle_check, field_gt, build_retrieved_bytecodes_tree(), retrieved_bytecodes_tree_check_emitter);
150 NullifierTreeCheck nullifier_tree_check(poseidon2, merkle_check, field_gt, nullifier_tree_check_emitter);
152 hints.tx.nonRevertibleAccumulatedData.nullifiers[0], poseidon2, merkle_check, note_hash_tree_check_emitter);
153 L1ToL2MessageTreeCheck l1_to_l2_msg_tree_check(merkle_check, l1_to_l2_msg_tree_check_emitter);
154 EmitUnencryptedLog emit_unencrypted_log_component(execution_id_manager, greater_than, emit_unencrypted_log_emitter);
155 Alu alu(greater_than, field_gt, range_check, alu_emitter);
156 Bitwise bitwise(bitwise_emitter);
157 Sha256 sha256(execution_id_manager, bitwise, greater_than, sha256_compression_emitter);
159
160 Ecc ecc(execution_id_manager, greater_than, to_radix, ecc_add_emitter, scalar_mul_emitter, ecc_add_memory_emitter);
161 AddressDerivation address_derivation(poseidon2, ecc, address_derivation_emitter);
162 ClassIdDerivation class_id_derivation(poseidon2, class_id_derivation_emitter);
163 HintedRawContractDB raw_contract_db(hints);
164 HintedRawMerkleDB raw_merkle_db(hints);
165
167
168 MerkleDB merkle_db(raw_merkle_db,
169 public_data_tree_check,
170 nullifier_tree_check,
173 l1_to_l2_msg_tree_check);
174 merkle_db.add_checkpoint_listener(note_hash_tree_check);
175 merkle_db.add_checkpoint_listener(nullifier_tree_check);
176 merkle_db.add_checkpoint_listener(public_data_tree_check);
177 merkle_db.add_checkpoint_listener(emit_unencrypted_log_component);
178
180 poseidon2, range_check, greater_than, merkle_db, update_check_emitter, hints.globalVariables);
181
182 BytecodeHasher bytecode_hasher(poseidon2, bytecode_hashing_emitter);
183 Siloing siloing(siloing_emitter);
185
187 contract_db, merkle_db, update_check, field_gt, hints.protocolContracts, contract_instance_retrieval_emitter);
188
189 TxBytecodeManager bytecode_manager(contract_db,
190 merkle_db,
195 bytecode_retrieval_emitter,
196 bytecode_decomposition_emitter,
197 instruction_fetching_emitter);
199
200 MemoryProvider memory_provider(range_check, execution_id_manager, memory_emitter);
201 CalldataHashingProvider calldata_hashing_provider(poseidon2, calldata_emitter);
202 InternalCallStackManagerProvider internal_call_stack_manager_provider(internal_call_stack_emitter);
203 ContextProvider context_provider(bytecode_manager,
204 memory_provider,
205 calldata_hashing_provider,
206 internal_call_stack_manager_provider,
207 merkle_db,
210 hints.globalVariables);
212
213 // Create GetContractInstance opcode component
215 execution_id_manager, merkle_db, get_contract_instance_emitter, contract_instance_manager);
216
217 NoopDebugLogger debug_log_component;
218
220 bitwise,
221 data_copy,
222 poseidon2,
223 ecc,
224 to_radix,
225 sha256,
226 execution_components,
230 execution_emitter,
231 context_stack_emitter,
235 emit_unencrypted_log_component,
236 debug_log_component,
237 merkle_db);
238
241 merkle_db,
244 field_gt,
245 poseidon2,
247
248 tx_execution.simulate(hints.tx);
249
250 public_data_tree_check.generate_ff_gt_events_for_squashing(public_data_writes);
251
252 return {
253 tx_event_emitter.dump_events(),
254 execution_emitter.dump_events(),
255 alu_emitter.dump_events(),
256 bitwise_emitter.dump_events(),
257 memory_emitter.dump_events(),
258 bytecode_retrieval_emitter.dump_events(),
259 bytecode_hashing_emitter.dump_events(),
260 bytecode_decomposition_emitter.dump_events(),
261 instruction_fetching_emitter.dump_events(),
262 address_derivation_emitter.dump_events(),
263 class_id_derivation_emitter.dump_events(),
264 siloing_emitter.dump_events(),
265 sha256_compression_emitter.dump_events(),
266 ecc_add_emitter.dump_events(),
267 scalar_mul_emitter.dump_events(),
268 ecc_add_memory_emitter.dump_events(),
269 poseidon2_hash_emitter.dump_events(),
270 poseidon2_perm_emitter.dump_events(),
271 poseidon2_perm_mem_emitter.dump_events(),
272 keccakf1600_emitter.dump_events(),
273 to_radix_emitter.dump_events(),
274 to_radix_memory_emitter.dump_events(),
275 field_gt_emitter.dump_events(),
276 greater_than_emitter.dump_events(),
277 merkle_check_emitter.dump_events(),
278 range_check_emitter.dump_events(),
279 context_stack_emitter.dump_events(),
280 public_data_tree_check_emitter.dump_events(),
281 update_check_emitter.dump_events(),
282 nullifier_tree_check_emitter.dump_events(),
283 data_copy_emitter.dump_events(),
284 calldata_emitter.dump_events(),
285 internal_call_stack_emitter.dump_events(),
286 note_hash_tree_check_emitter.dump_events(),
287 written_public_data_slots_tree_check_emitter.dump_events(),
288 contract_instance_retrieval_emitter.dump_events(),
289 get_contract_instance_emitter.dump_events(),
290 l1_to_l2_msg_tree_check_emitter.dump_events(),
291 emit_unencrypted_log_emitter.dump_events(),
292 retrieved_bytecodes_tree_check_emitter.dump_events(),
293 };
294}
295
297{
298 BB_BENCH_NAME("AvmSimulationHelper::simulate_fast");
299
300 // TODO(fcarreiro): These should come from the simulate call.
301 bool user_requested_simulation = false;
302 DebugLogLevel debug_log_level = DebugLogLevel::INFO;
303 uint32_t max_debug_log_memory_reads = DEFAULT_MAX_DEBUG_LOG_MEMORY_READS;
304
305 NoopEventEmitter<ExecutionEvent> execution_emitter;
306 NoopEventEmitter<DataCopyEvent> data_copy_emitter;
307 NoopEventEmitter<Sha256CompressionEvent> sha256_compression_emitter;
308 NoopEventEmitter<EccAddEvent> ecc_add_emitter;
309 NoopEventEmitter<ScalarMulEvent> scalar_mul_emitter;
310 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_emitter;
311 NoopEventEmitter<KeccakF1600Event> keccakf1600_emitter;
313 NoopEventEmitter<MerkleCheckEvent> merkle_check_emitter;
314 NoopEventEmitter<RangeCheckEvent> range_check_emitter;
315 NoopEventEmitter<ContextStackEvent> context_stack_emitter;
317 NoopEventEmitter<CalldataEvent> calldata_emitter;
318 NoopEventEmitter<InternalCallStackEvent> internal_call_stack_emitter;
319 NoopEventEmitter<ContractInstanceRetrievalEvent> contract_instance_retrieval_emitter;
320 NoopEventEmitter<GetContractInstanceEvent> get_contract_instance_emitter;
321 NoopEventEmitter<EmitUnencryptedLogEvent> emit_unencrypted_log_emitter;
322 NoopEventEmitter<RetrievedBytecodesTreeCheckEvent> retrieved_bytecodes_tree_check_emitter;
323
325 RangeCheck range_check(range_check_emitter);
326 FieldGreaterThan field_gt(range_check, field_gt_emitter);
330 MerkleCheck merkle_check(poseidon2, merkle_check_emitter);
333 poseidon2, merkle_check, field_gt, build_retrieved_bytecodes_tree(), retrieved_bytecodes_tree_check_emitter);
334 EmitUnencryptedLog emit_unencrypted_log_component(execution_id_manager, greater_than, emit_unencrypted_log_emitter);
335 PureAlu alu;
337 Sha256 sha256(execution_id_manager, bitwise, greater_than, sha256_compression_emitter);
339
340 Ecc ecc(execution_id_manager, greater_than, to_radix, ecc_add_emitter, scalar_mul_emitter, ecc_add_memory_emitter);
341 HintedRawContractDB raw_contract_db(hints);
342 HintedRawMerkleDB raw_merkle_db(hints);
343
344 PureContractDB contract_db(raw_contract_db);
345
348 merkle_db.add_checkpoint_listener(emit_unencrypted_log_component);
349
351
353
355 contract_db, merkle_db, update_check, field_gt, hints.protocolContracts, contract_instance_retrieval_emitter);
356
359
360 PureMemoryProvider memory_provider;
361 CalldataHashingProvider calldata_hashing_provider(poseidon2, calldata_emitter);
362 InternalCallStackManagerProvider internal_call_stack_manager_provider(internal_call_stack_emitter);
363 ContextProvider context_provider(bytecode_manager,
364 memory_provider,
365 calldata_hashing_provider,
366 internal_call_stack_manager_provider,
367 merkle_db,
370 hints.globalVariables);
372
373 // Create GetContractInstance opcode component
375 execution_id_manager, merkle_db, get_contract_instance_emitter, contract_instance_manager);
376
377 std::unique_ptr<DebugLoggerInterface> debug_log_component;
378 if (user_requested_simulation) {
379 debug_log_component = std::make_unique<DebugLogger>(
380 debug_log_level, max_debug_log_memory_reads, [](const std::string& message) { info(message); });
381 } else {
382 debug_log_component = std::make_unique<NoopDebugLogger>();
383 }
384
386 bitwise,
387 data_copy,
388 poseidon2,
389 ecc,
390 to_radix,
391 sha256,
392 execution_components,
396 execution_emitter,
397 context_stack_emitter,
401 emit_unencrypted_log_component,
402 *debug_log_component,
403 merkle_db);
406 merkle_db,
409 field_gt,
410 poseidon2,
412
413 tx_execution.simulate(hints.tx);
414}
415
416} // namespace bb::avm2
#define DEFAULT_MAX_DEBUG_LOG_MEMORY_READS
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:218
BytecodeHasher bytecode_hasher
StrictMock< MockHighLevelMerkleDB > merkle_db
StrictMock< MockContractDB > contract_db
StrictMock< MockContractInstanceManager > contract_instance_manager
void simulate_fast(const ExecutionHints &hints)
simulation::EventsContainer simulate_for_witgen(const ExecutionHints &hints, std::vector< PublicDataWrite > public_data_writes)
EventEmitter< Event >::Container dump_events()
void generate_ff_gt_events_for_squashing(std::vector< PublicDataWrite > &public_data_writes)
void info(Args... args)
Definition log.hpp:74
ExecutionIdManager execution_id_manager
InstructionInfoDB instruction_info_db
testing::StrictMock< MockGreaterThan > greater_than
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > poseidon2
RetrievedBytecodesTree build_retrieved_bytecodes_tree()
WrittenPublicDataSlotsTree build_public_data_slots_tree()
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
FieldGreaterThan field_gt
std::vector< FF > nullifiers
ProtocolContracts protocolContracts
GlobalVariables globalVariables
AccumulatedData nonRevertibleAccumulatedData
TxExecution tx_execution
NiceMock< MockContextProvider > context_provider
EventEmitter< TxEvent > tx_event_emitter