Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
bc_retrieval.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
4#include <cstdint>
5#include <memory>
6#include <vector>
7
8#include "barretenberg/aztec/aztec_constants.hpp"
45
46namespace bb::avm2::constraining {
47namespace {
48using ::testing::StrictMock;
49
52using tracegen::BytecodeTraceBuilder;
53using tracegen::ClassIdDerivationTraceBuilder;
54using tracegen::ContractInstanceRetrievalTraceBuilder;
55using tracegen::FieldGreaterThanTraceBuilder;
56using tracegen::IndexedTreeCheckTraceBuilder;
57using tracegen::Poseidon2TraceBuilder;
58using tracegen::PrecomputedTraceBuilder;
59using tracegen::TestTraceContainer;
60
61using simulation::EventEmitter;
62using simulation::FieldGreaterThan;
63using simulation::IndexedTreeCheck;
65using simulation::IndexedTreeLeafData;
66using simulation::IndexedTreeReadWriteEvent;
67using simulation::MerkleCheck;
68using simulation::MockExecutionIdManager;
69using simulation::MockGreaterThan;
70using simulation::Poseidon2;
71using simulation::Poseidon2HashEvent;
72using simulation::Poseidon2PermutationEvent;
73using simulation::Poseidon2PermutationMemoryEvent;
74using simulation::RangeCheck;
75using simulation::RetrievedBytecodesTreeCheck;
76
78using C = Column;
79using bc_retrieval = bb::avm2::bc_retrieval<FF>;
81
82class BytecodeRetrievalConstrainingTest : public ::testing::Test {
83 public:
84 static TestTraceContainer init_trace()
85 {
86 // Add first row.
87 TestTraceContainer trace({
88 { { C::precomputed_first_row, 1 } },
89 });
90 return trace;
91 }
92};
93
94TEST_F(BytecodeRetrievalConstrainingTest, EmptyRow)
95{
96 check_relation<bc_retrieval>(testing::empty_trace());
97}
98
99TEST_F(BytecodeRetrievalConstrainingTest, SuccessfulRetrieval)
100{
101 TestTraceContainer trace = init_trace();
102 BytecodeTraceBuilder builder;
103 ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder;
104 ClassIdDerivationTraceBuilder class_id_builder;
105 IndexedTreeCheckTraceBuilder indexed_tree_check_builder;
106
107 FF nullifier_tree_root = FF::random_element();
108 FF public_data_tree_root = FF::random_element();
109
110 ContractInstance instance = random_contract_instance();
111 uint32_t bytecode_size = 20;
112 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
113 std::vector<FF> bytecode_fields = simulation::encode_bytecode(klass.packed_bytecode);
114 std::vector<FF> hash_input = { simulation::compute_public_bytecode_first_field(klass.packed_bytecode.size()) };
115 hash_input.reserve(1 + bytecode_fields.size());
116 hash_input.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
117 // Compute the bytecode commitment separately
118 FF bytecode_commitment = RawPoseidon2::hash(hash_input);
119 builder.process_hashing({ { .bytecode_id = bytecode_commitment,
120 .bytecode_length_in_bytes = bytecode_size,
121 .bytecode_fields = bytecode_fields } },
122 trace);
124 .address = instance.deployer,
125 .contract_instance = { instance },
126 .nullifier_tree_root = nullifier_tree_root,
127 .public_data_tree_root = public_data_tree_root,
128 .exists = true,
129 } },
130 trace);
131 class_id_builder.process({ { .class_id = instance.current_contract_class_id,
132 .artifact_hash = klass.artifact_hash,
133 .private_functions_root = klass.private_functions_root,
134 .public_bytecode_commitment = bytecode_commitment } },
135 trace);
136
137 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
138 .root = FF(AVM_RETRIEVED_BYTECODES_TREE_INITIAL_ROOT),
139 .next_available_leaf_index = AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE,
140 };
141
142 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
143 .root = FF(42),
144 .next_available_leaf_index = AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE + 1,
145 };
146
148 { // Read the tree of the retrieved bytecodes
149 IndexedTreeReadWriteEvent{
150 .value = instance.current_contract_class_id,
151 .prev_snapshot = snapshot_before,
152 .next_snapshot = snapshot_before,
153 .tree_height = AVM_RETRIEVED_BYTECODES_TREE_HEIGHT,
154 .merkle_hash_separator = FF(DOM_SEP__RETRIEVED_BYTECODES_MERKLE),
155 .low_leaf_data = IndexedTreeLeafData{ .value = 0, .next_value = 0, .next_index = 0 },
156 .low_leaf_hash = 0,
157 .low_leaf_index = 0,
158 },
159 // Insertion in the retrieved bytecodes tree
160 IndexedTreeReadWriteEvent{
161 .value = instance.current_contract_class_id,
162 .prev_snapshot = snapshot_before,
163 .next_snapshot = snapshot_after,
164 .tree_height = AVM_RETRIEVED_BYTECODES_TREE_HEIGHT,
165 .merkle_hash_separator = FF(DOM_SEP__RETRIEVED_BYTECODES_MERKLE),
166 .low_leaf_data = IndexedTreeLeafData{ .value = 0, .next_value = 0, .next_index = 0 },
167 .low_leaf_hash = 0,
168 .low_leaf_index = 0,
169 .write = true,
170 } },
171 trace);
172
173 // Build a bytecode retrieval event where instance exists
174 builder.process_retrieval({ {
175 .bytecode_id = bytecode_commitment, // bytecode_id equals commitment
176 .address = instance.deployer,
177 .current_class_id = instance.current_contract_class_id,
178 .contract_class = klass,
179 .nullifier_tree_root = nullifier_tree_root,
180 .public_data_tree_root = public_data_tree_root,
181 .retrieved_bytecodes_snapshot_before = snapshot_before,
182 .retrieved_bytecodes_snapshot_after = snapshot_after,
183 .is_new_class = true,
184 } },
185 trace);
186
187 check_relation<bc_retrieval>(trace);
188 check_interaction<BytecodeTraceBuilder,
193}
194
195TEST_F(BytecodeRetrievalConstrainingTest, TooManyBytecodes)
196{
197 TestTraceContainer trace = init_trace();
198 BytecodeTraceBuilder builder;
199
200 FF nullifier_tree_root = FF::random_element();
201 FF public_data_tree_root = FF::random_element();
202
203 ContractInstance instance = random_contract_instance();
204 uint32_t bytecode_size = 20;
205 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
206
207 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
208 .root = FF(42),
209 .next_available_leaf_index =
210 MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS + AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE,
211 };
212
213 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
214 .root = FF(42),
215 .next_available_leaf_index =
216 MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS + AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE,
217 };
218
219 // Build a bytecode retrieval event where instance exists
220 builder.process_retrieval({ {
221 .bytecode_id = 0, // bytecode_id equals commitment
222 .address = instance.deployer,
223 .current_class_id = instance.current_contract_class_id,
224 .nullifier_tree_root = nullifier_tree_root,
225 .public_data_tree_root = public_data_tree_root,
226 .retrieved_bytecodes_snapshot_before = snapshot_before,
227 .retrieved_bytecodes_snapshot_after = snapshot_after,
228 .is_new_class = true,
230 } },
231 trace);
232
233 check_relation<bc_retrieval>(trace);
234}
235
236TEST_F(BytecodeRetrievalConstrainingTest, NonExistentInstance)
237{
238
239 ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder;
240 TestTraceContainer trace = init_trace();
241 FF contract_address = FF::random_element();
242
243 // Instance retrieval enforces current_class_id = 0 when exists = 0:
245 .address = contract_address,
246 .exists = false,
247 } },
248 trace);
249
250 // Manually set up a row where instance_exists = 0
251 // All other fields should be forced to 0 by constraints
252 trace.set(
253 1,
254 { {
255 { C::bc_retrieval_sel, 1 },
256 { C::bc_retrieval_instance_exists, 0 },
257 { C::bc_retrieval_current_class_id, 0 },
258 { C::bc_retrieval_artifact_hash, 0 },
259 { C::bc_retrieval_private_functions_root, 0 },
260 { C::bc_retrieval_bytecode_id, 0 },
261 { C::bc_retrieval_address, contract_address },
262 { C::bc_retrieval_prev_retrieved_bytecodes_tree_size, 1 },
263 { C::bc_retrieval_next_retrieved_bytecodes_tree_size, 1 },
264 { C::bc_retrieval_retrieved_bytecodes_tree_height, AVM_RETRIEVED_BYTECODES_TREE_HEIGHT },
265 { C::bc_retrieval_retrieved_bytecodes_merkle_separator, DOM_SEP__RETRIEVED_BYTECODES_MERKLE },
266 { C::bc_retrieval_remaining_bytecodes_inv, FF(MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS).invert() },
267 { C::bc_retrieval_error, 1 },
268 } });
269
270 check_relation<bc_retrieval>(trace);
271
272 // mutate the current_class_id and confirm that a violation as it should be 0
273 trace.set(C::bc_retrieval_current_class_id, 1, 99);
275 (check_interaction<BytecodeTraceBuilder, lookup_bc_retrieval_contract_instance_retrieval_settings>(trace)),
276 "Failed.*LOOKUP_BC_RETRIEVAL_CONTRACT_INSTANCE_RETRIEVAL.*Could not find tuple in destination.");
277
278 trace.set(C::contract_instance_retrieval_current_class_id, 1, 99);
283
284 // reset
285 trace.set(C::bc_retrieval_current_class_id, 1, 0);
286 trace.set(C::contract_instance_retrieval_current_class_id, 1, 0);
287
288 // mutate the bytecode_id and confirm that it is a violation
289 trace.set(C::bc_retrieval_bytecode_id, 1, 99);
290 EXPECT_THROW_WITH_MESSAGE(check_relation<bc_retrieval>(trace),
292 // reset
293 trace.set(C::bc_retrieval_bytecode_id, 1, 0);
294}
295
296class BytecodeRetrievalConstrainingTestFewerMocks : public BytecodeRetrievalConstrainingTest {
297 public:
298 EventEmitter<simulation::Poseidon2HashEvent> hash_event_emitter;
299 EventEmitter<simulation::Poseidon2PermutationEvent> perm_event_emitter;
300 EventEmitter<simulation::Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
301 EventEmitter<simulation::MerkleCheckEvent> merkle_check_emitter;
302 EventEmitter<simulation::RangeCheckEvent> range_check_emitter;
303 EventEmitter<simulation::FieldGreaterThanEvent> field_gt_emitter;
304 EventEmitter<simulation::IndexedTreeCheckEvent> indexed_tree_check_event_emitter;
305
306 StrictMock<MockGreaterThan> mock_gt;
307 StrictMock<MockExecutionIdManager> mock_execution_id_manager;
308
309 Poseidon2TraceBuilder poseidon2_builder;
310
312 Poseidon2(mock_execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter);
313 MerkleCheck merkle_check = MerkleCheck(poseidon2, merkle_check_emitter);
314 RangeCheck range_check = RangeCheck(range_check_emitter);
315 FieldGreaterThan field_gt = FieldGreaterThan(range_check, field_gt_emitter);
316 IndexedTreeCheck indexed_tree_check = IndexedTreeCheck(
317 poseidon2, merkle_check, field_gt, DOM_SEP__RETRIEVED_BYTECODES_MERKLE, indexed_tree_check_event_emitter);
318
319 RetrievedBytecodesTreeCheck retrieved_bytecodes_tree_check =
320 RetrievedBytecodesTreeCheck(indexed_tree_check, simulation::build_retrieved_bytecodes_tree());
321
322 BytecodeTraceBuilder builder;
323 ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder;
324 ClassIdDerivationTraceBuilder class_id_builder;
325 IndexedTreeCheckTraceBuilder indexed_tree_check_builder;
326 FieldGreaterThanTraceBuilder field_gt_builder;
327 PrecomputedTraceBuilder precomputed_builder;
328};
329
330TEST_F(BytecodeRetrievalConstrainingTestFewerMocks, SuccessfulRetrievalFewerMocks)
331{
332 TestTraceContainer trace = init_trace();
333
334 FF nullifier_tree_root = FF::random_element();
335 FF public_data_tree_root = FF::random_element();
336
337 ContractInstance instance = random_contract_instance();
338 uint32_t bytecode_size = 20;
339 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
340 std::vector<FF> bytecode_fields = simulation::encode_bytecode(klass.packed_bytecode);
341 std::vector<FF> hash_input = { simulation::compute_public_bytecode_first_field(klass.packed_bytecode.size()) };
342 hash_input.reserve(1 + bytecode_fields.size());
343 hash_input.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
344 // Compute the bytecode commitment separately
345 FF bytecode_commitment = poseidon2.hash(hash_input);
346 builder.process_decomposition({ { .bytecode_id = bytecode_commitment,
347 .bytecode = std::make_shared<std::vector<uint8_t>>(klass.packed_bytecode) } },
348 trace);
349 trace.set(1, { { { C::bc_decomposition_sel_packed_read_0_, 1 } } });
350 builder.process_hashing({ { .bytecode_id = bytecode_commitment,
351 .bytecode_length_in_bytes = bytecode_size,
352 .bytecode_fields = bytecode_fields } },
353 trace);
354 // Compute the class id separately to produce the hash event, and replace the mocked value
355 FF class_id = poseidon2.hash(
356 { DOM_SEP__CONTRACT_CLASS_ID, klass.artifact_hash, klass.private_functions_root, bytecode_commitment });
357 instance.current_contract_class_id = class_id;
358 klass.id = class_id;
360 .address = instance.deployer,
361 .contract_instance = { instance },
362 .nullifier_tree_root = nullifier_tree_root,
363 .public_data_tree_root = public_data_tree_root,
364 .exists = true,
365 } },
366 trace);
367
368 class_id_builder.process({ { .class_id = klass.id,
369 .artifact_hash = klass.artifact_hash,
370 .private_functions_root = klass.private_functions_root,
371 .public_bytecode_commitment = bytecode_commitment } },
372 trace);
373
374 AppendOnlyTreeSnapshot snapshot_before = retrieved_bytecodes_tree_check.get_snapshot();
375
376 // Read the tree of the retrieved bytecodes
377 retrieved_bytecodes_tree_check.contains(instance.current_contract_class_id);
378
379 // Insertion in the retrieved bytecodes tree
380 retrieved_bytecodes_tree_check.insert(instance.current_contract_class_id);
381
382 AppendOnlyTreeSnapshot snapshot_after = retrieved_bytecodes_tree_check.get_snapshot();
383
385
386 // Build a bytecode retrieval event where instance exists
387 builder.process_retrieval({ {
388 .bytecode_id = bytecode_commitment, // bytecode_id equals commitment
389 .address = instance.deployer,
390 .current_class_id = instance.current_contract_class_id,
391 .contract_class = klass,
392 .nullifier_tree_root = nullifier_tree_root,
393 .public_data_tree_root = public_data_tree_root,
394 .retrieved_bytecodes_snapshot_before = snapshot_before,
395 .retrieved_bytecodes_snapshot_after = snapshot_after,
396 .is_new_class = true,
397 } },
398 trace);
399
403
404 check_relation<bc_retrieval>(trace);
405 check_relation<bb::avm2::bc_decomposition<FF>>(trace);
406 check_relation<bb::avm2::bc_hashing<FF>>(trace);
407 check_relation<bb::avm2::contract_instance_retrieval<FF>>(trace);
408 check_relation<bb::avm2::class_id_derivation<FF>>(trace);
409 check_relation<bb::avm2::indexed_tree_check<FF>>(trace);
410 check_all_interactions<BytecodeTraceBuilder>(trace);
411 check_all_interactions<ClassIdDerivationTraceBuilder>(trace);
412}
413
414TEST_F(BytecodeRetrievalConstrainingTestFewerMocks, SuccessfulRepeatedRetrievalFewerMocks)
415{
416 TestTraceContainer trace = init_trace();
417
418 FF nullifier_tree_root = FF::random_element();
419 FF public_data_tree_root = FF::random_element();
420
421 ContractInstance instance = random_contract_instance();
422 uint32_t bytecode_size = 20;
423 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
424 std::vector<FF> bytecode_fields = simulation::encode_bytecode(klass.packed_bytecode);
425 std::vector<FF> hash_input = { simulation::compute_public_bytecode_first_field(klass.packed_bytecode.size()) };
426 hash_input.reserve(1 + bytecode_fields.size());
427 hash_input.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
428 // Compute the bytecode commitment separately
429 FF bytecode_commitment = poseidon2.hash(hash_input);
430 builder.process_decomposition({ { .bytecode_id = bytecode_commitment,
431 .bytecode = std::make_shared<std::vector<uint8_t>>(klass.packed_bytecode) } },
432 trace);
433 trace.set(1, { { { C::bc_decomposition_sel_packed_read_0_, 1 } } });
434 builder.process_hashing({ { .bytecode_id = bytecode_commitment,
435 .bytecode_length_in_bytes = bytecode_size,
436 .bytecode_fields = bytecode_fields } },
437 trace);
438
439 // Compute the class id separately to produce the hash event, and replace the mocked value
440 FF class_id = poseidon2.hash(
441 { DOM_SEP__CONTRACT_CLASS_ID, klass.artifact_hash, klass.private_functions_root, bytecode_commitment });
442 instance.current_contract_class_id = class_id;
443 klass.id = class_id;
445 .address = instance.deployer,
446 .contract_instance = { instance },
447 .nullifier_tree_root = nullifier_tree_root,
448 .public_data_tree_root = public_data_tree_root,
449 .exists = true,
450 } },
451 trace);
452 class_id_builder.process({ { .class_id = klass.id,
453 .artifact_hash = klass.artifact_hash,
454 .private_functions_root = klass.private_functions_root,
455 .public_bytecode_commitment = bytecode_commitment } },
456 trace);
457
458 AppendOnlyTreeSnapshot snapshot_before = retrieved_bytecodes_tree_check.get_snapshot();
459
460 // Read the tree of the retrieved bytecodes
461 retrieved_bytecodes_tree_check.contains(instance.current_contract_class_id);
462
463 // Insertion in the retrieved bytecodes tree
464 retrieved_bytecodes_tree_check.insert(instance.current_contract_class_id);
465
466 AppendOnlyTreeSnapshot snapshot_after = retrieved_bytecodes_tree_check.get_snapshot();
467
468 // Retrieve the same again:
469
470 // Read the tree of the retrieved bytecodes
471 retrieved_bytecodes_tree_check.contains(instance.current_contract_class_id);
472
473 // 'Insertion' in the retrieved bytecodes tree (shouldn't write)
474 retrieved_bytecodes_tree_check.insert(instance.current_contract_class_id);
475
477
478 // Build a bytecode retrieval event where instance exists
479 builder.process_retrieval({ {
480 .bytecode_id = bytecode_commitment, // bytecode_id equals commitment
481 .address = instance.deployer,
482 .current_class_id = instance.current_contract_class_id,
483 .contract_class = klass,
484 .nullifier_tree_root = nullifier_tree_root,
485 .public_data_tree_root = public_data_tree_root,
486 .retrieved_bytecodes_snapshot_before = snapshot_before,
487 .retrieved_bytecodes_snapshot_after = snapshot_after,
488 .is_new_class = true,
489 },
490 {
491 .bytecode_id = bytecode_commitment, // bytecode_id equals commitment
492 .address = instance.deployer,
493 .current_class_id = instance.current_contract_class_id,
494 .contract_class = klass,
495 .nullifier_tree_root = nullifier_tree_root,
496 .public_data_tree_root = public_data_tree_root,
497 .retrieved_bytecodes_snapshot_before = snapshot_after,
498 .retrieved_bytecodes_snapshot_after = snapshot_after,
499 .is_new_class = false,
500 } },
501 trace);
502
506
507 check_relation<bc_retrieval>(trace);
508 check_relation<bb::avm2::bc_decomposition<FF>>(trace);
509 check_relation<bb::avm2::bc_hashing<FF>>(trace);
510 check_relation<bb::avm2::contract_instance_retrieval<FF>>(trace);
511 check_relation<bb::avm2::class_id_derivation<FF>>(trace);
512 check_relation<bb::avm2::indexed_tree_check<FF>>(trace);
513 check_all_interactions<BytecodeTraceBuilder>(trace);
514 check_all_interactions<ClassIdDerivationTraceBuilder>(trace);
515
516 // We cannot claim the second retrieval refers to a new class:
517 // (1) The lookup into the transient tree will have leaf_not_exists == 0 at the root, which is
518 // constrained in execution to either be continuous or correctly transitioned when adding a bytecode:
519 trace.set(C::bc_retrieval_is_new_class, 1, 1);
520 EXPECT_THROW_WITH_MESSAGE(check_all_interactions<BytecodeTraceBuilder>(trace), "IS_NEW_CLASS_CHECK");
521 // (2) Attempting to maliciously set not_exists == 1 will fail the transient tree's leaf checks:
522 trace.set(C::indexed_tree_check_not_exists, 2, 1);
523 trace.set(C::indexed_tree_check_exists, 2, 0);
524 check_all_interactions<BytecodeTraceBuilder>(trace);
525 check_relation<bc_retrieval>(trace);
529}
530
531} // namespace
532} // namespace bb::avm2::constraining
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
Definition assert.hpp:224
StrictMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
EventEmitter< Poseidon2PermutationEvent > perm_event_emitter
EventEmitter< Poseidon2HashEvent > hash_event_emitter
Poseidon2TraceBuilder poseidon2_builder
StrictMock< MockExecutionIdManager > mock_execution_id_manager
FieldGreaterThan field_gt
IndexedTreeCheckTraceBuilder indexed_tree_check_builder
ClassIdDerivationTraceBuilder class_id_builder
EventEmitter< simulation::MerkleCheckEvent > merkle_check_emitter
ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder
MerkleCheck merkle_check
RetrievedBytecodesTreeCheck retrieved_bytecodes_tree_check
EventEmitter< simulation::FieldGreaterThanEvent > field_gt_emitter
IndexedTreeCheck indexed_tree_check
EventEmitter< simulation::RangeCheckEvent > range_check_emitter
EventEmitter< simulation::IndexedTreeCheckEvent > indexed_tree_check_event_emitter
RangeCheck range_check
static std::string get_subrelation_label(size_t index)
static constexpr size_t SR_BYTECODE_ID_IS_ZERO_IF_ERROR
bool contains(const FF &class_id) override
Checks whether a contract class ID exists in the retrieved bytecodes tree.
void insert(const FF &class_id) override
Inserts a contract class ID into the retrieved bytecodes tree.
AppendOnlyTreeSnapshot get_snapshot() const override
Returns the current tree snapshot.
void process(const simulation::EventEmitterInterface< simulation::ClassIdDerivationEvent >::Container &events, TraceContainer &trace)
Process class id derivation events and populate the relevant columns in the trace....
void process(const simulation::EventEmitterInterface< simulation::ContractInstanceRetrievalEvent >::Container &events, TraceContainer &trace)
Process the contract instance retrieval events and populate the relevant columns in the trace.
void process(const simulation::EventEmitterInterface< simulation::IndexedTreeCheckEvent >::Container &events, TraceContainer &trace)
Process generic indexed tree check events and populate the relevant columns in the trace.
void process_hash(const simulation::EventEmitterInterface< simulation::Poseidon2HashEvent >::Container &hash_events, TraceContainer &trace)
Processes the hash events for the Poseidon2 hash function. It populates the columns for the poseidon2...
void process_misc(TraceContainer &trace, const uint32_t num_rows=PRECOMPUTED_TRACE_SIZE)
Populate miscellaneous precomputed columns: first_row selector and idx (row index).
void process_sel_range_8(TraceContainer &trace)
Generate a selector column that activates the first 2^8 (256) rows.
void set(Column col, uint32_t row, const FF &value, bool use_atomic_limbs=false)
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
PrecomputedTraceBuilder precomputed_builder
Definition alu.test.cpp:120
FieldGreaterThanTraceBuilder field_gt_builder
Definition alu.test.cpp:122
AluTraceBuilder builder
Definition alu.test.cpp:124
TestTraceContainer trace
TEST_F(AvmRecursiveTests, TwoLayerAvmRecursion)
A test of the Two Layer AVM recursive verifier.
void check_interaction(tracegen::TestTraceContainer &trace)
void check_relation(const tracegen::TestTraceContainer &trace, Ts... subrelation)
RetrievedBytecodesTree build_retrieved_bytecodes_tree()
std::vector< FF > encode_bytecode(std::span< const uint8_t > bytecode)
Encodes the bytecode into a vector of field elements. Each field element represents 31 bytes of the b...
std::variant< IndexedTreeReadWriteEvent, CheckPointEventType > IndexedTreeCheckEvent
FF compute_public_bytecode_first_field(size_t bytecode_size)
ContractClass random_contract_class(size_t bytecode_size)
Definition fixtures.cpp:188
ContractInstance random_contract_instance()
Definition fixtures.cpp:162
TestTraceContainer empty_trace()
Definition fixtures.cpp:156
lookup_settings< lookup_bc_retrieval_retrieved_bytecodes_insertion_settings_ > lookup_bc_retrieval_retrieved_bytecodes_insertion_settings
lookup_settings< lookup_bc_retrieval_contract_instance_retrieval_settings_ > lookup_bc_retrieval_contract_instance_retrieval_settings
AvmFlavorSettings::FF FF
Definition field.hpp:10
lookup_settings< lookup_bc_retrieval_class_id_derivation_settings_ > lookup_bc_retrieval_class_id_derivation_settings
lookup_settings< lookup_bc_retrieval_is_new_class_check_settings_ > lookup_bc_retrieval_is_new_class_check_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept