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
60
61namespace bb::avm2 {
62
63using namespace bb::avm2::simulation;
64
65namespace {
66
67// Configuration for full simulation (for proving).
68struct ProvingSettings {
69 template <typename E> using DefaultEventEmitter = EventEmitter<E>;
70 template <typename E> using DefaultDeduplicatingEventEmitter = DeduplicatingEventEmitter<E>;
71};
72
73// Configuration for fast simulation.
74struct FastSettings {
75 template <typename E> using DefaultEventEmitter = NoopEventEmitter<E>;
76 template <typename E> using DefaultDeduplicatingEventEmitter = NoopEventEmitter<E>;
77};
78
79} // namespace
80
82{
83 typename S::template DefaultEventEmitter<ExecutionEvent> execution_emitter;
84 typename S::template DefaultDeduplicatingEventEmitter<AluEvent> alu_emitter;
85 typename S::template DefaultEventEmitter<BitwiseEvent> bitwise_emitter;
86 typename S::template DefaultEventEmitter<DataCopyEvent> data_copy_emitter;
87 typename S::template DefaultEventEmitter<MemoryEvent> memory_emitter;
88 typename S::template DefaultEventEmitter<BytecodeRetrievalEvent> bytecode_retrieval_emitter;
89 typename S::template DefaultEventEmitter<BytecodeHashingEvent> bytecode_hashing_emitter;
90 typename S::template DefaultEventEmitter<BytecodeDecompositionEvent> bytecode_decomposition_emitter;
91 typename S::template DefaultDeduplicatingEventEmitter<InstructionFetchingEvent> instruction_fetching_emitter;
92 typename S::template DefaultEventEmitter<AddressDerivationEvent> address_derivation_emitter;
93 typename S::template DefaultEventEmitter<ClassIdDerivationEvent> class_id_derivation_emitter;
94 typename S::template DefaultEventEmitter<SiloingEvent> siloing_emitter;
95 typename S::template DefaultEventEmitter<Sha256CompressionEvent> sha256_compression_emitter;
96 typename S::template DefaultEventEmitter<EccAddEvent> ecc_add_emitter;
97 typename S::template DefaultEventEmitter<ScalarMulEvent> scalar_mul_emitter;
98 typename S::template DefaultEventEmitter<EccAddMemoryEvent> ecc_add_memory_emitter;
99 typename S::template DefaultEventEmitter<Poseidon2HashEvent> poseidon2_hash_emitter;
100 typename S::template DefaultEventEmitter<Poseidon2PermutationEvent> poseidon2_perm_emitter;
101 typename S::template DefaultEventEmitter<Poseidon2PermutationMemoryEvent> poseidon2_perm_mem_emitter;
102 typename S::template DefaultEventEmitter<KeccakF1600Event> keccakf1600_emitter;
103 typename S::template DefaultEventEmitter<ToRadixEvent> to_radix_emitter;
104 typename S::template DefaultEventEmitter<ToRadixMemoryEvent> to_radix_memory_emitter;
105 typename S::template DefaultEventEmitter<FieldGreaterThanEvent> field_gt_emitter;
106 typename S::template DefaultEventEmitter<MerkleCheckEvent> merkle_check_emitter;
107 typename S::template DefaultDeduplicatingEventEmitter<RangeCheckEvent> range_check_emitter;
108 typename S::template DefaultEventEmitter<ContextStackEvent> context_stack_emitter;
109 typename S::template DefaultEventEmitter<PublicDataTreeCheckEvent> public_data_tree_check_emitter;
110 typename S::template DefaultEventEmitter<UpdateCheckEvent> update_check_emitter;
111 typename S::template DefaultEventEmitter<NullifierTreeCheckEvent> nullifier_tree_check_emitter;
112 typename S::template DefaultEventEmitter<TxEvent> tx_event_emitter;
113 typename S::template DefaultEventEmitter<CalldataEvent> calldata_emitter;
114 typename S::template DefaultEventEmitter<InternalCallStackEvent> internal_call_stack_emitter;
115 typename S::template DefaultEventEmitter<NoteHashTreeCheckEvent> note_hash_tree_check_emitter;
116 typename S::template DefaultEventEmitter<WrittenPublicDataSlotsTreeCheckEvent>
117 written_public_data_slots_tree_check_emitter;
118 typename S::template DefaultDeduplicatingEventEmitter<GreaterThanEvent> greater_than_emitter;
119 typename S::template DefaultEventEmitter<ContractInstanceRetrievalEvent> contract_instance_retrieval_emitter;
120 typename S::template DefaultEventEmitter<GetContractInstanceEvent> get_contract_instance_emitter;
121 typename S::template DefaultEventEmitter<L1ToL2MessageTreeCheckEvent> l1_to_l2_msg_tree_check_emitter;
122 typename S::template DefaultEventEmitter<EmitUnencryptedLogEvent> emit_unencrypted_log_emitter;
123
125 RangeCheck range_check(range_check_emitter);
126 FieldGreaterThan field_gt(range_check, field_gt_emitter);
127 GreaterThan greater_than(field_gt, range_check, greater_than_emitter);
128 ToRadix to_radix(execution_id_manager, greater_than, to_radix_emitter, to_radix_memory_emitter);
130 execution_id_manager, greater_than, poseidon2_hash_emitter, poseidon2_perm_emitter, poseidon2_perm_mem_emitter);
131 MerkleCheck merkle_check(poseidon2, merkle_check_emitter);
132 PublicDataTreeCheck public_data_tree_check(
133 poseidon2, merkle_check, field_gt, execution_id_manager, public_data_tree_check_emitter);
136 field_gt,
138 written_public_data_slots_tree_check_emitter);
139 NullifierTreeCheck nullifier_tree_check(poseidon2, merkle_check, field_gt, nullifier_tree_check_emitter);
141 hints.tx.nonRevertibleAccumulatedData.nullifiers[0], poseidon2, merkle_check, note_hash_tree_check_emitter);
142 L1ToL2MessageTreeCheck l1_to_l2_msg_tree_check(merkle_check, l1_to_l2_msg_tree_check_emitter);
143 EmitUnencryptedLog emit_unencrypted_log_component(execution_id_manager, greater_than, emit_unencrypted_log_emitter);
144 Alu alu(greater_than, field_gt, range_check, alu_emitter);
145 Bitwise bitwise(bitwise_emitter);
146 Sha256 sha256(execution_id_manager, bitwise, greater_than, sha256_compression_emitter);
148
149 Ecc ecc(execution_id_manager, greater_than, to_radix, ecc_add_emitter, scalar_mul_emitter, ecc_add_memory_emitter);
150 AddressDerivation address_derivation(poseidon2, ecc, address_derivation_emitter);
151 ClassIdDerivation class_id_derivation(poseidon2, class_id_derivation_emitter);
152 HintedRawContractDB raw_contract_db(hints);
153 HintedRawMerkleDB raw_merkle_db(hints);
155
156 MerkleDB merkle_db(raw_merkle_db,
157 public_data_tree_check,
158 nullifier_tree_check,
161 l1_to_l2_msg_tree_check);
162 merkle_db.add_checkpoint_listener(note_hash_tree_check);
163 merkle_db.add_checkpoint_listener(nullifier_tree_check);
164 merkle_db.add_checkpoint_listener(public_data_tree_check);
165 merkle_db.add_checkpoint_listener(emit_unencrypted_log_component);
166
168
169 BytecodeHasher bytecode_hasher(poseidon2, bytecode_hashing_emitter);
170 Siloing siloing(siloing_emitter);
172
174 contract_db, merkle_db, update_check, contract_instance_retrieval_emitter);
175
176 TxBytecodeManager bytecode_manager(contract_db,
177 merkle_db,
181 bytecode_retrieval_emitter,
182 bytecode_decomposition_emitter,
183 instruction_fetching_emitter);
185
186 MemoryProvider memory_provider(range_check, execution_id_manager, memory_emitter);
187 CalldataHashingProvider calldata_hashing_provider(poseidon2, calldata_emitter);
188 InternalCallStackManagerProvider internal_call_stack_manager_provider(internal_call_stack_emitter);
189 ContextProvider context_provider(bytecode_manager,
190 memory_provider,
191 calldata_hashing_provider,
192 internal_call_stack_manager_provider,
193 merkle_db,
196 DataCopy data_copy(execution_id_manager, greater_than, data_copy_emitter);
197
198 // Create GetContractInstance opcode component
200 execution_id_manager, merkle_db, get_contract_instance_emitter, contract_instance_manager);
201
203 bitwise,
204 data_copy,
205 poseidon2,
206 ecc,
207 to_radix,
208 sha256,
209 execution_components,
213 execution_emitter,
214 context_stack_emitter,
216 greater_than,
218 emit_unencrypted_log_component,
219 merkle_db);
222 merkle_db,
224 field_gt,
225 poseidon2,
227
228 tx_execution.simulate(hints.tx);
229
230 return {
231 tx_event_emitter.dump_events(),
232 execution_emitter.dump_events(),
233 alu_emitter.dump_events(),
234 bitwise_emitter.dump_events(),
235 memory_emitter.dump_events(),
236 bytecode_retrieval_emitter.dump_events(),
237 bytecode_hashing_emitter.dump_events(),
238 bytecode_decomposition_emitter.dump_events(),
239 instruction_fetching_emitter.dump_events(),
240 address_derivation_emitter.dump_events(),
241 class_id_derivation_emitter.dump_events(),
242 siloing_emitter.dump_events(),
243 sha256_compression_emitter.dump_events(),
244 ecc_add_emitter.dump_events(),
245 scalar_mul_emitter.dump_events(),
246 ecc_add_memory_emitter.dump_events(),
247 poseidon2_hash_emitter.dump_events(),
248 poseidon2_perm_emitter.dump_events(),
249 poseidon2_perm_mem_emitter.dump_events(),
250 keccakf1600_emitter.dump_events(),
251 to_radix_emitter.dump_events(),
252 to_radix_memory_emitter.dump_events(),
253 field_gt_emitter.dump_events(),
254 greater_than_emitter.dump_events(),
255 merkle_check_emitter.dump_events(),
256 range_check_emitter.dump_events(),
257 context_stack_emitter.dump_events(),
258 public_data_tree_check_emitter.dump_events(),
259 update_check_emitter.dump_events(),
260 nullifier_tree_check_emitter.dump_events(),
261 data_copy_emitter.dump_events(),
262 calldata_emitter.dump_events(),
263 internal_call_stack_emitter.dump_events(),
264 note_hash_tree_check_emitter.dump_events(),
265 written_public_data_slots_tree_check_emitter.dump_events(),
266 contract_instance_retrieval_emitter.dump_events(),
267 get_contract_instance_emitter.dump_events(),
268 l1_to_l2_msg_tree_check_emitter.dump_events(),
269 emit_unencrypted_log_emitter.dump_events(),
270 };
271}
272
274{
275 return simulate_with_settings<ProvingSettings>();
276}
277
279{
280 simulate_with_settings<FastSettings>();
281}
282
283} // namespace bb::avm2
StrictMock< MockHighLevelMerkleDB > merkle_db
BytecodeHasher bytecode_hasher
StrictMock< MockContractDB > contract_db
StrictMock< MockContractInstanceManager > contract_instance_manager
simulation::EventsContainer simulate_with_settings()
simulation::EventsContainer simulate()
ExecutionIdManager execution_id_manager
InstructionInfoDB instruction_info_db
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > poseidon2
WrittenPublicDataSlotsTree build_public_data_slots_tree()
std::vector< FF > nullifiers
GlobalVariables globalVariables
AccumulatedData nonRevertibleAccumulatedData
TxExecution tx_execution
NiceMock< MockFieldGreaterThan > field_gt
NiceMock< MockContextProvider > context_provider
EventEmitter< TxEvent > tx_event_emitter