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
23
24// Events.
48
49// Gadgets.
78
79// Standalone.
96
97namespace bb::avm2 {
98
99using namespace bb::avm2::simulation;
100
101namespace {
102
103PublicTxEffect extract_public_tx_effect(const TxExecutionResult& tx_execution_result,
105{
106 PublicTxEffect public_tx_effect;
107 const auto& side_effects = side_effect_tracker.get_side_effects();
108 public_tx_effect.transaction_fee = tx_execution_result.transaction_fee;
109 public_tx_effect.note_hashes = side_effects.note_hashes;
110 public_tx_effect.nullifiers = side_effects.nullifiers;
111 public_tx_effect.l2_to_l1_msgs = side_effects.l2_to_l1_messages;
112 public_tx_effect.public_logs = side_effects.public_logs.to_logs();
113
114 // We need to copy the storage writes slot to value in the order of the slots by insertion.
115 const size_t num_storage_writes = side_effects.storage_writes_slots_by_insertion.size();
116 public_tx_effect.public_data_writes.reserve(num_storage_writes);
117 for (size_t i = 0; i < num_storage_writes; i++) {
118 const auto& slot = side_effects.storage_writes_slots_by_insertion[i];
119 const auto& value = side_effects.storage_writes_slot_to_value.at(slot);
120 public_tx_effect.public_data_writes.push_back(PublicDataWrite{ .leaf_slot = slot, .value = value });
121 }
122
123 return public_tx_effect;
124}
125
126} // namespace
127
128// Internal helper function for event-generating simulation (with full gadgets).
129// NOTE: Some of the config parameters are ignored in this function.
130template <template <typename> class DefaultEventEmitter, template <typename> class DefaultDeduplicatingEventEmitter>
132 ContractDBInterface& raw_contract_db,
133 LowLevelMerkleDBInterface& raw_merkle_db,
134 const PublicSimulatorConfig& config,
135 const Tx& tx,
136 const GlobalVariables& global_variables,
137 const ProtocolContracts& protocol_contracts)
138{
139 BB_BENCH_NAME("AvmSimulationHelper::simulate_for_witgen_internal");
140
141 DefaultEventEmitter<ExecutionEvent> execution_emitter;
142 DefaultDeduplicatingEventEmitter<AluEvent> alu_emitter;
143 DefaultDeduplicatingEventEmitter<BitwiseEvent> bitwise_emitter;
144 DefaultEventEmitter<DataCopyEvent> data_copy_emitter;
145 DefaultEventEmitter<MemoryEvent> memory_emitter;
146 DefaultEventEmitter<BytecodeRetrievalEvent> bytecode_retrieval_emitter;
147 DefaultEventEmitter<BytecodeHashingEvent> bytecode_hashing_emitter;
148 DefaultEventEmitter<BytecodeDecompositionEvent> bytecode_decomposition_emitter;
149 DefaultDeduplicatingEventEmitter<InstructionFetchingEvent> instruction_fetching_emitter;
150 DefaultEventEmitter<AddressDerivationEvent> address_derivation_emitter;
151 DefaultEventEmitter<ClassIdDerivationEvent> class_id_derivation_emitter;
152 DefaultEventEmitter<SiloingEvent> siloing_emitter;
153 DefaultEventEmitter<Sha256CompressionEvent> sha256_compression_emitter;
154 DefaultEventEmitter<EccAddEvent> ecc_add_emitter;
155 DefaultEventEmitter<ScalarMulEvent> scalar_mul_emitter;
156 DefaultEventEmitter<EccAddMemoryEvent> ecc_add_memory_emitter;
157 DefaultEventEmitter<Poseidon2HashEvent> poseidon2_hash_emitter;
158 DefaultEventEmitter<Poseidon2PermutationEvent> poseidon2_perm_emitter;
159 DefaultEventEmitter<Poseidon2PermutationMemoryEvent> poseidon2_perm_mem_emitter;
160 DefaultEventEmitter<KeccakF1600Event> keccakf1600_emitter;
161 DefaultEventEmitter<ToRadixEvent> to_radix_emitter;
162 DefaultEventEmitter<ToRadixMemoryEvent> to_radix_memory_emitter;
163 DefaultDeduplicatingEventEmitter<FieldGreaterThanEvent> field_gt_emitter;
164 DefaultEventEmitter<MerkleCheckEvent> merkle_check_emitter;
165 DefaultDeduplicatingEventEmitter<RangeCheckEvent> range_check_emitter;
166 DefaultEventEmitter<ContextStackEvent> context_stack_emitter;
167 DefaultEventEmitter<PublicDataTreeCheckEvent> public_data_tree_check_emitter;
168 DefaultEventEmitter<UpdateCheckEvent> update_check_emitter;
169 DefaultEventEmitter<NullifierTreeCheckEvent> nullifier_tree_check_emitter;
170 DefaultEventEmitter<TxEvent> tx_event_emitter;
171 DefaultEventEmitter<CalldataEvent> calldata_emitter;
172 DefaultEventEmitter<InternalCallStackEvent> internal_call_stack_emitter;
173 DefaultEventEmitter<NoteHashTreeCheckEvent> note_hash_tree_check_emitter;
174 DefaultEventEmitter<WrittenPublicDataSlotsTreeCheckEvent> written_public_data_slots_tree_check_emitter;
175 DefaultDeduplicatingEventEmitter<GreaterThanEvent> greater_than_emitter;
176 DefaultEventEmitter<ContractInstanceRetrievalEvent> contract_instance_retrieval_emitter;
177 DefaultEventEmitter<GetContractInstanceEvent> get_contract_instance_emitter;
178 DefaultEventEmitter<L1ToL2MessageTreeCheckEvent> l1_to_l2_msg_tree_check_emitter;
179 DefaultEventEmitter<EmitUnencryptedLogEvent> emit_unencrypted_log_emitter;
180 DefaultEventEmitter<RetrievedBytecodesTreeCheckEvent> retrieved_bytecodes_tree_check_emitter;
181
185 GreaterThan greater_than(field_gt, range_check, greater_than_emitter);
186 ToRadix to_radix(execution_id_manager, greater_than, to_radix_emitter, to_radix_memory_emitter);
188 execution_id_manager, greater_than, poseidon2_hash_emitter, poseidon2_perm_emitter, poseidon2_perm_mem_emitter);
189 MerkleCheck merkle_check(poseidon2, merkle_check_emitter);
190 PublicDataTreeCheck public_data_tree_check(
191 poseidon2, merkle_check, field_gt, execution_id_manager, public_data_tree_check_emitter);
194 field_gt,
196 written_public_data_slots_tree_check_emitter);
198 poseidon2, merkle_check, field_gt, build_retrieved_bytecodes_tree(), retrieved_bytecodes_tree_check_emitter);
199 NullifierTreeCheck nullifier_tree_check(poseidon2, merkle_check, field_gt, nullifier_tree_check_emitter);
200
201 // The protocol requires at least one non-revertible nullifier in the transaction (used for uniqueness of note
202 // hashes).
203 if (tx.non_revertible_accumulated_data.nullifiers.empty()) {
204 throw std::runtime_error("Non-revertible nullifiers are empty in the transaction.");
205 }
206
208 tx.non_revertible_accumulated_data.nullifiers[0], poseidon2, merkle_check, note_hash_tree_check_emitter);
209 L1ToL2MessageTreeCheck l1_to_l2_msg_tree_check(merkle_check, l1_to_l2_msg_tree_check_emitter);
210 EmitUnencryptedLog emit_unencrypted_log_component(execution_id_manager, greater_than, emit_unencrypted_log_emitter);
212 Bitwise bitwise(bitwise_emitter);
213 Sha256 sha256(execution_id_manager, bitwise, greater_than, sha256_compression_emitter);
215
216 Ecc ecc(execution_id_manager, greater_than, to_radix, ecc_add_emitter, scalar_mul_emitter, ecc_add_memory_emitter);
217 AddressDerivation address_derivation(poseidon2, ecc, address_derivation_emitter);
218 ClassIdDerivation class_id_derivation(poseidon2, class_id_derivation_emitter);
219
220 ContractDB contract_db(raw_contract_db, address_derivation, class_id_derivation, protocol_contracts);
221
222 MerkleDB base_merkle_db(raw_merkle_db,
223 public_data_tree_check,
224 nullifier_tree_check,
227 l1_to_l2_msg_tree_check);
228 base_merkle_db.add_checkpoint_listener(note_hash_tree_check);
229 base_merkle_db.add_checkpoint_listener(nullifier_tree_check);
230 base_merkle_db.add_checkpoint_listener(public_data_tree_check);
231 // This one is only needed for events.
232 base_merkle_db.add_checkpoint_listener(emit_unencrypted_log_component);
233
234 // Side effect tracking is only strictly needed for logs and L2-to-L1 messages.
236
238 tx.non_revertible_accumulated_data.nullifiers[0], base_merkle_db, side_effect_tracker);
239
240 UpdateCheck update_check(poseidon2, range_check, greater_than, merkle_db, update_check_emitter, global_variables);
241
242 BytecodeHasher bytecode_hasher(poseidon2, bytecode_hashing_emitter);
243 Siloing siloing(siloing_emitter);
245
247 contract_db, merkle_db, update_check, field_gt, protocol_contracts, contract_instance_retrieval_emitter);
248
249 TxBytecodeManager bytecode_manager(contract_db,
250 merkle_db,
255 bytecode_retrieval_emitter,
256 bytecode_decomposition_emitter,
257 instruction_fetching_emitter);
259
260 MemoryProvider memory_provider(range_check, execution_id_manager, memory_emitter);
261 CalldataHashingProvider calldata_hashing_provider(poseidon2, calldata_emitter);
262 InternalCallStackManagerProvider internal_call_stack_manager_provider(internal_call_stack_emitter);
263 ContextProvider context_provider(bytecode_manager,
264 memory_provider,
265 calldata_hashing_provider,
266 internal_call_stack_manager_provider,
267 merkle_db,
271 global_variables);
273
274 // Create GetContractInstance opcode component
276 execution_id_manager, merkle_db, get_contract_instance_emitter, contract_instance_manager);
277
278 NoopDebugLogger debug_log_component;
284
286 bitwise,
287 data_copy,
288 poseidon2,
289 ecc,
290 to_radix,
291 sha256,
292 execution_components,
296 execution_emitter,
297 context_stack_emitter,
301 emit_unencrypted_log_component,
302 debug_log_component,
303 merkle_db,
305
309 merkle_db,
313 field_gt,
314 poseidon2,
317
319 public_inputs_builder.extract_inputs(tx, global_variables, protocol_contracts, config.prover_id, raw_merkle_db);
320
321 TxExecutionResult tx_execution_result = tx_execution.simulate(tx);
322
323 public_inputs_builder.extract_outputs(raw_merkle_db,
324 // TODO(MW): Use of billed_gas is a bit misleading - we want public + private
325 // - teardown, which is stored as billed gas here/in ts:
326 tx_execution_result.gas_used.billed_gas,
327 tx_execution_result.transaction_fee,
328 tx_execution_result.revert_code != RevertCode::OK,
329 side_effect_tracker.get_side_effects());
330
331 public_data_tree_check.generate_ff_gt_events_for_squashing(
332 side_effect_tracker.get_side_effects().storage_writes_slots_by_insertion);
333
334 EventsContainer events = {
335 tx_event_emitter.dump_events(),
336 execution_emitter.dump_events(),
337 alu_emitter.dump_events(),
338 bitwise_emitter.dump_events(),
339 memory_emitter.dump_events(),
340 bytecode_retrieval_emitter.dump_events(),
341 bytecode_hashing_emitter.dump_events(),
342 bytecode_decomposition_emitter.dump_events(),
343 instruction_fetching_emitter.dump_events(),
344 address_derivation_emitter.dump_events(),
345 class_id_derivation_emitter.dump_events(),
346 siloing_emitter.dump_events(),
347 sha256_compression_emitter.dump_events(),
348 ecc_add_emitter.dump_events(),
349 scalar_mul_emitter.dump_events(),
350 ecc_add_memory_emitter.dump_events(),
351 poseidon2_hash_emitter.dump_events(),
352 poseidon2_perm_emitter.dump_events(),
353 poseidon2_perm_mem_emitter.dump_events(),
354 keccakf1600_emitter.dump_events(),
355 to_radix_emitter.dump_events(),
356 to_radix_memory_emitter.dump_events(),
357 field_gt_emitter.dump_events(),
358 greater_than_emitter.dump_events(),
359 merkle_check_emitter.dump_events(),
360 range_check_emitter.dump_events(),
361 context_stack_emitter.dump_events(),
362 public_data_tree_check_emitter.dump_events(),
363 update_check_emitter.dump_events(),
364 nullifier_tree_check_emitter.dump_events(),
365 data_copy_emitter.dump_events(),
366 calldata_emitter.dump_events(),
367 internal_call_stack_emitter.dump_events(),
368 note_hash_tree_check_emitter.dump_events(),
369 written_public_data_slots_tree_check_emitter.dump_events(),
370 contract_instance_retrieval_emitter.dump_events(),
371 get_contract_instance_emitter.dump_events(),
372 l1_to_l2_msg_tree_check_emitter.dump_events(),
373 emit_unencrypted_log_emitter.dump_events(),
374 retrieved_bytecodes_tree_check_emitter.dump_events(),
375 };
376
377 TxSimulationResult tx_simulation_result = {
378 .gas_used = tx_execution_result.gas_used,
379 .revert_code = tx_execution_result.revert_code,
380 .public_tx_effect = extract_public_tx_effect(tx_execution_result, side_effect_tracker),
381 .call_stack_metadata = call_stack_metadata_collector->dump_call_stack_metadata(),
382 .logs = debug_log_component.dump_logs(),
383 .public_inputs =
385 };
386
387 return { std::move(events), std::move(tx_simulation_result) };
388}
389
390// Internal helper function for fast simulation.
392 LowLevelMerkleDBInterface& raw_merkle_db,
393 const PublicSimulatorConfig& config,
394 const Tx& tx,
395 const GlobalVariables& global_variables,
396 const ProtocolContracts& protocol_contracts,
397 CancellationTokenPtr cancellation_token)
398{
399 BB_BENCH_NAME("AvmSimulationHelper::simulate_fast_internal");
400
401 NoopEventEmitter<ExecutionEvent> execution_emitter;
402 NoopEventEmitter<DataCopyEvent> data_copy_emitter;
403 NoopEventEmitter<EccAddEvent> ecc_add_emitter;
404 NoopEventEmitter<ScalarMulEvent> scalar_mul_emitter;
405 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_emitter;
407 NoopEventEmitter<MerkleCheckEvent> merkle_check_emitter;
409 NoopEventEmitter<ContextStackEvent> context_stack_emitter;
411 NoopEventEmitter<InternalCallStackEvent> internal_call_stack_emitter;
412 NoopEventEmitter<ContractInstanceRetrievalEvent> contract_instance_retrieval_emitter;
413 NoopEventEmitter<GetContractInstanceEvent> get_contract_instance_emitter;
414 NoopEventEmitter<EmitUnencryptedLogEvent> emit_unencrypted_log_emitter;
415 NoopEventEmitter<RetrievedBytecodesTreeCheckEvent> retrieved_bytecodes_tree_check_emitter;
416 NoopEventEmitter<UpdateCheckEvent> update_check_emitter;
417
424 MerkleCheck merkle_check(poseidon2, merkle_check_emitter);
427 poseidon2, merkle_check, field_gt, build_retrieved_bytecodes_tree(), retrieved_bytecodes_tree_check_emitter);
428 EmitUnencryptedLog emit_unencrypted_log_component(execution_id_manager, greater_than, emit_unencrypted_log_emitter);
429 PureAlu alu;
433
434 Ecc ecc(execution_id_manager, greater_than, to_radix, ecc_add_emitter, scalar_mul_emitter, ecc_add_memory_emitter);
435
437 PureContractDB contract_db(raw_contract_db);
438
439 // The protocol requires at least one non-revertible nullifier in the transaction (used for uniqueness of note
440 // hashes).
441 if (tx.non_revertible_accumulated_data.nullifiers.empty()) {
442 throw std::runtime_error("Non-revertible nullifiers are empty in the transaction.");
443 }
444
446 tx.non_revertible_accumulated_data.nullifiers[0], raw_merkle_db, written_public_data_slots_tree_check);
448
449 tx.non_revertible_accumulated_data.nullifiers[0], base_merkle_db, side_effect_tracker);
450
453
455 contract_db, merkle_db, update_check, field_gt, protocol_contracts, contract_instance_retrieval_emitter);
457
459
460 PureMemoryProvider memory_provider;
461 NoopCalldataHashingProvider calldata_hashing_provider;
462 InternalCallStackManagerProvider internal_call_stack_manager_provider(internal_call_stack_emitter);
463 ContextProvider context_provider(tx_bytecode_manager,
464 memory_provider,
465 calldata_hashing_provider,
466 internal_call_stack_manager_provider,
467 merkle_db,
471 global_variables);
473
474 // Create GetContractInstance opcode component
476 execution_id_manager, merkle_db, get_contract_instance_emitter, contract_instance_manager);
477
479 if (config.collect_debug_logs) {
480 // TODO(fcarreiro): add debug log level?
481 const DebugLogLevel debug_log_level = DebugLogLevel::INFO;
482 return std::make_unique<DebugLogger>(debug_log_level,
484 [](const std::string& message) { vinfo(message); });
485 } else {
487 }
488 }();
494
496 bitwise,
497 data_copy,
498 poseidon2,
499 ecc,
500 to_radix,
501 sha256,
502 execution_components,
506 execution_emitter,
507 context_stack_emitter,
511 emit_unencrypted_log_component,
512 *debug_log_component,
513 merkle_db,
515 std::move(cancellation_token));
519 merkle_db,
523 field_gt,
524 poseidon2,
527 config.skip_fee_enforcement);
528
530 public_inputs_builder.extract_inputs(tx, global_variables, protocol_contracts, config.prover_id, raw_merkle_db);
531
532 // This triggers all the work.
533 TxExecutionResult tx_execution_result = tx_execution.simulate(tx);
534
535 public_inputs_builder.extract_outputs(raw_merkle_db,
536 // TODO(MW): Use of billed_gas is a bit misleading - we want public + private
537 // - teardown, which is stored as billed gas here/in ts:
538 tx_execution_result.gas_used.billed_gas,
539 tx_execution_result.transaction_fee,
540 tx_execution_result.revert_code != RevertCode::OK,
541 side_effect_tracker.get_side_effects());
542
543 return {
544 // Simulation.
545 .gas_used = tx_execution_result.gas_used,
546 .revert_code = tx_execution_result.revert_code,
547 .public_tx_effect = extract_public_tx_effect(tx_execution_result, side_effect_tracker),
548 .call_stack_metadata = call_stack_metadata_collector->dump_call_stack_metadata(),
549 .logs = debug_log_component->dump_logs(),
550 // Proving request data.
551 .public_inputs =
553 .hints = std::nullopt, // NOTE: hints are injected by the caller.
554 };
555}
556
557/************************************
558 * Entry points
559 ************************************/
560
562 simulation::ContractDBInterface& raw_contract_db,
563 const world_state::WorldStateRevision& world_state_revision,
565 const PublicSimulatorConfig& config,
566 const Tx& tx,
567 const GlobalVariables& global_variables,
568 const ProtocolContracts& protocol_contracts,
569 CancellationTokenPtr cancellation_token)
570{
571 // For collecting hints, use the other method.
572 BB_ASSERT(!config.collect_hints && "Use simulate_for_hint_collection instead");
573
574 // Create PureRawMerkleDB with the provided WorldState instance and cancellation token
575 PureRawMerkleDB raw_merkle_db(world_state_revision, ws, /*cache_tree_roots=*/true, cancellation_token);
576
578 raw_contract_db, raw_merkle_db, config, tx, global_variables, protocol_contracts, cancellation_token);
579}
580
582 simulation::ContractDBInterface& raw_contract_db,
583 const world_state::WorldStateRevision& world_state_revision,
585 const PublicSimulatorConfig& config,
586 const Tx& tx,
587 const GlobalVariables& global_variables,
588 const ProtocolContracts& protocol_contracts,
589 CancellationTokenPtr cancellation_token)
590{
591 // If you are not collecting hints, don't use this method.
592 BB_ASSERT(config.collect_hints && "Use simulate_fast_with_existing_ws instead");
593
594 // Create PureRawMerkleDB with the provided WorldState instance and cancellation token
595 PureRawMerkleDB raw_merkle_db(world_state_revision, ws, /*cache_tree_roots=*/true, cancellation_token);
596
597 auto starting_tree_roots = raw_merkle_db.get_tree_roots();
599 HintingRawDB hinting_merkle_db(raw_merkle_db);
600
601 // We use NoopEventEmitters here because we don't want to collect events.
602 auto [/* unused */ events_, tx_result] = simulate_for_witgen_internal<NoopEventEmitter, NoopEventEmitter>(
603 hinting_contract_db, hinting_merkle_db, config, tx, global_variables, protocol_contracts);
604
605 ExecutionHints collected_hints = ExecutionHints{ .global_variables = global_variables,
606 .tx = tx,
607 .protocol_contracts = protocol_contracts,
608 .starting_tree_roots = starting_tree_roots };
609 hinting_contract_db.dump_hints(collected_hints);
610 hinting_merkle_db.dump_hints(collected_hints);
611
612 tx_result.hints = std::move(collected_hints);
613
614 // Need to std::move to avoid copying (due to structured bindings).
615 // This was fixed in C++23 via http://wg21.link/P2266R3.
616 return std::move(tx_result);
617}
618
620{
621 // TODO(fcarreiro): decide if we want to pass a config here.
622 const PublicSimulatorConfig config{};
623
624 HintedRawContractDB raw_contract_db(hints);
625 HintedRawMerkleDB raw_merkle_db(hints);
626
627 // We use EventEmitters and DeduplicatingEventEmitters here because we want to collect events.
628 auto [events, /* unused */ tx_result_] = simulate_for_witgen_internal<EventEmitter, DeduplicatingEventEmitter>(
629 raw_contract_db, raw_merkle_db, config, hints.tx, hints.global_variables, hints.protocol_contracts);
630
631 // Need to std::move to avoid copying (due to structured bindings).
632 // This was fixed in C++23 via http://wg21.link/P2266R3.
633 return std::move(events);
634}
635
637 const PublicSimulatorConfig& config)
638{
639 HintedRawContractDB raw_contract_db(hints);
640 HintedRawMerkleDB raw_merkle_db(hints);
642 raw_contract_db, raw_merkle_db, config, hints.tx, hints.global_variables, hints.protocol_contracts);
643}
644
645} // namespace bb::avm2
DeduplicatingEventEmitter< FieldGreaterThanEvent > field_gt_emitter
GreaterThan greater_than
FieldGreaterThan field_gt
DeduplicatingEventEmitter< RangeCheckEvent > range_check_emitter
EventEmitter< AluEvent > alu_emitter
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:219
BytecodeHasher bytecode_hasher
StrictMock< MockHighLevelMerkleDB > merkle_db
StrictMock< MockContractDB > contract_db
StrictMock< MockContractInstanceManager > contract_instance_manager
TxSimulationResult simulate_fast_internal(simulation::ContractDBInterface &raw_contract_db, simulation::LowLevelMerkleDBInterface &raw_merkle_db, const PublicSimulatorConfig &config, const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts, simulation::CancellationTokenPtr cancellation_token=nullptr)
std::tuple< simulation::EventsContainer, TxSimulationResult > simulate_for_witgen_internal(simulation::ContractDBInterface &raw_contract_db, simulation::LowLevelMerkleDBInterface &raw_merkle_db, const PublicSimulatorConfig &config, const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts)
TxSimulationResult simulate_for_hint_collection(simulation::ContractDBInterface &raw_contract_db, const world_state::WorldStateRevision &world_state_revision, world_state::WorldState &ws, const PublicSimulatorConfig &config, const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts, simulation::CancellationTokenPtr cancellation_token=nullptr)
TxSimulationResult simulate_fast_with_hinted_dbs(const ExecutionHints &hints, const PublicSimulatorConfig &config)
TxSimulationResult simulate_fast_with_existing_ws(simulation::ContractDBInterface &raw_contract_db, const world_state::WorldStateRevision &world_state_revision, world_state::WorldState &ws, const PublicSimulatorConfig &config, const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts, simulation::CancellationTokenPtr cancellation_token=nullptr)
simulation::EventsContainer simulate_for_witgen(const ExecutionHints &hints)
std::vector< DebugLog > dump_logs() override
Definition debug_log.hpp:19
void generate_ff_gt_events_for_squashing(const std::vector< FF > &written_leaf_slots)
Generates ff_gt events for squashing.
PublicInputsBuilder & extract_inputs(const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts, const FF &prover_id, const LowLevelMerkleDBInterface &merkle_db)
TreeSnapshots get_tree_roots() const override
const TrackedSideEffects & get_side_effects() const override
A high-level merkle db that tracks side effects.
Holds the Merkle trees responsible for storing the state of the Aztec protocol.
ExecutionIdManager execution_id_manager
InstructionInfoDB instruction_info_db
HintingContractsDB hinting_contract_db
HintedRawMerkleDB base_merkle_db
HintingRawDB hinting_merkle_db
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > poseidon2
RetrievedBytecodesTree build_retrieved_bytecodes_tree()
std::shared_ptr< CancellationToken > CancellationTokenPtr
WrittenPublicDataSlotsTree build_public_data_slots_tree()
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
GlobalVariables global_variables
Definition avm_io.hpp:359
ProtocolContracts protocol_contracts
Definition avm_io.hpp:362
CollectionLimitsConfig collection_limits
Definition avm_io.hpp:451
std::vector< FF > note_hashes
Definition avm_io.hpp:537
std::vector< PublicLog > public_logs
Definition avm_io.hpp:540
std::vector< FF > nullifiers
Definition avm_io.hpp:538
std::vector< PublicDataWrite > public_data_writes
Definition avm_io.hpp:541
std::vector< ScopedL2ToL1Message > l2_to_l1_msgs
Definition avm_io.hpp:539
tracegen::PublicInputsTraceBuilder public_inputs_builder
Definition tx.test.cpp:81
SideEffectTracker side_effect_tracker
TxExecution tx_execution
NiceMock< MockContextProvider > context_provider
NoopCallStackMetadataCollector call_stack_metadata_collector
EventEmitter< TxEvent > tx_event_emitter