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
44
45namespace bb::avm2::constraining {
46namespace {
47using ::testing::StrictMock;
48
51using tracegen::BytecodeTraceBuilder;
52using tracegen::ClassIdDerivationTraceBuilder;
53using tracegen::ContractInstanceRetrievalTraceBuilder;
54using tracegen::FieldGreaterThanTraceBuilder;
55using tracegen::Poseidon2TraceBuilder;
56using tracegen::PrecomputedTraceBuilder;
57using tracegen::RetrievedBytecodesTreeCheckTraceBuilder;
58using tracegen::TestTraceContainer;
59
60using simulation::ClassIdLeafValue;
61using simulation::EventEmitter;
62using simulation::FieldGreaterThan;
63using simulation::MerkleCheck;
64using simulation::MockExecutionIdManager;
65using simulation::MockGreaterThan;
66using simulation::Poseidon2;
67using simulation::Poseidon2HashEvent;
68using simulation::Poseidon2PermutationEvent;
69using simulation::Poseidon2PermutationMemoryEvent;
70using simulation::RangeCheck;
71using simulation::RetrievedBytecodesTreeCheck;
72using simulation::RetrievedBytecodesTreeCheckEvent;
74
76using C = Column;
77using bc_retrieval = bb::avm2::bc_retrieval<FF>;
79
80class BytecodeRetrievalConstrainingTest : public ::testing::Test {
81 public:
82 static TestTraceContainer init_trace()
83 {
84 // Add first row.
85 TestTraceContainer trace({
86 { { C::precomputed_first_row, 1 } },
87 });
88 return trace;
89 }
90};
91
92TEST_F(BytecodeRetrievalConstrainingTest, EmptyRow)
93{
94 check_relation<bc_retrieval>(testing::empty_trace());
95}
96
97TEST_F(BytecodeRetrievalConstrainingTest, SuccessfulRetrieval)
98{
99 TestTraceContainer trace = init_trace();
100 BytecodeTraceBuilder builder;
101 ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder;
102 ClassIdDerivationTraceBuilder class_id_builder;
103 RetrievedBytecodesTreeCheckTraceBuilder retrieved_bytecodes_tree_check_builder;
104
105 FF nullifier_root = FF::random_element();
106 FF public_data_tree_root = FF::random_element();
107
108 ContractInstance instance = random_contract_instance();
109 uint32_t bytecode_size = 20;
110 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
111 std::vector<FF> bytecode_fields = simulation::encode_bytecode(klass.packed_bytecode);
112 std::vector<FF> hash_input = { simulation::compute_public_bytecode_first_field(klass.packed_bytecode.size()) };
113 hash_input.reserve(1 + bytecode_fields.size());
114 hash_input.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
115 // Compute the bytecode commitment separately
116 FF bytecode_commitment = RawPoseidon2::hash(hash_input);
117 builder.process_hashing({ { .bytecode_id = bytecode_commitment,
118 .bytecode_length = bytecode_size,
119 .bytecode_fields = bytecode_fields } },
120 trace);
122 .address = instance.deployer,
123 .contract_instance = { instance },
124 .nullifier_tree_root = nullifier_root,
125 .public_data_tree_root = public_data_tree_root,
126 .exists = true,
127 } },
128 trace);
129 class_id_builder.process({ { .class_id = instance.current_contract_class_id,
130 .artifact_hash = klass.artifact_hash,
131 .private_functions_root = klass.private_functions_root,
132 .public_bytecode_commitment = bytecode_commitment } },
133 trace);
134
135 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
137 .next_available_leaf_index = AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE,
138 };
139
140 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
141 .root = FF(42),
142 .next_available_leaf_index = AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE + 1,
143 };
144
146 { // Read the tree of the retrieved bytecodes
147 RetrievedBytecodesTreeCheckEvent{
148 .class_id = instance.current_contract_class_id,
149 .prev_snapshot = snapshot_before,
150 .next_snapshot = snapshot_before,
151 .low_leaf_preimage = RetrievedBytecodesTreeLeafPreimage(ClassIdLeafValue(0), 0, 0),
152 .low_leaf_index = 0,
153 },
154 // Insertion in the retrieved bytecodes tree
155 RetrievedBytecodesTreeCheckEvent{
156 .class_id = instance.current_contract_class_id,
157 .prev_snapshot = snapshot_before,
158 .next_snapshot = snapshot_after,
159 .low_leaf_preimage = RetrievedBytecodesTreeLeafPreimage(ClassIdLeafValue(0), 0, 0),
160 .low_leaf_index = 0,
161 .write = true,
162 } },
163 trace);
164
165 // Build a bytecode retrieval event where instance exists
166 builder.process_retrieval({ {
167 .bytecode_id = bytecode_commitment, // bytecode_id equals commitment
168 .address = instance.deployer,
169 .current_class_id = instance.current_contract_class_id,
170 .contract_class = klass,
171 .nullifier_root = nullifier_root,
172 .public_data_tree_root = public_data_tree_root,
173 .retrieved_bytecodes_snapshot_before = snapshot_before,
174 .retrieved_bytecodes_snapshot_after = snapshot_after,
175 .is_new_class = true,
176 } },
177 trace);
178
179 check_relation<bc_retrieval>(trace);
180 check_interaction<BytecodeTraceBuilder,
185}
186
187TEST_F(BytecodeRetrievalConstrainingTest, TooManyBytecodes)
188{
189 TestTraceContainer trace = init_trace();
190 BytecodeTraceBuilder builder;
191
192 FF nullifier_root = FF::random_element();
193 FF public_data_tree_root = FF::random_element();
194
195 ContractInstance instance = random_contract_instance();
196 uint32_t bytecode_size = 20;
197 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
198
199 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
200 .root = FF(42),
201 .next_available_leaf_index =
203 };
204
205 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
206 .root = FF(42),
207 .next_available_leaf_index =
209 };
210
211 // Build a bytecode retrieval event where instance exists
212 builder.process_retrieval({ {
213 .bytecode_id = 0, // bytecode_id equals commitment
214 .address = instance.deployer,
215 .current_class_id = instance.current_contract_class_id,
216 .nullifier_root = nullifier_root,
217 .public_data_tree_root = public_data_tree_root,
218 .retrieved_bytecodes_snapshot_before = snapshot_before,
219 .retrieved_bytecodes_snapshot_after = snapshot_after,
220 .is_new_class = true,
222 } },
223 trace);
224
225 check_relation<bc_retrieval>(trace);
226}
227
228TEST_F(BytecodeRetrievalConstrainingTest, NonExistentInstance)
229{
230
231 ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder;
232 TestTraceContainer trace = init_trace();
234
235 // Instance retrieval enforces current_class_id = 0 when exists = 0:
237 .address = contract_address,
238 .exists = false,
239 } },
240 trace);
241
242 // Manually set up a row where instance_exists = 0
243 // All other fields should be forced to 0 by constraints
244 trace.set(
245 1,
246 { {
247 { C::bc_retrieval_sel, 1 },
248 { C::bc_retrieval_instance_exists, 0 },
249 { C::bc_retrieval_current_class_id, 0 },
250 { C::bc_retrieval_artifact_hash, 0 },
251 { C::bc_retrieval_private_functions_root, 0 },
252 { C::bc_retrieval_bytecode_id, 0 },
253 { C::bc_retrieval_address, contract_address },
254 { C::bc_retrieval_prev_retrieved_bytecodes_tree_size, 1 },
255 { C::bc_retrieval_next_retrieved_bytecodes_tree_size, 1 },
256 { C::bc_retrieval_remaining_bytecodes_inv, FF(MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS).invert() },
257 { C::bc_retrieval_error, 1 },
258 } });
259
260 check_relation<bc_retrieval>(trace);
261
262 // mutate the current_class_id and confirm that a violation as it should be 0
263 trace.set(C::bc_retrieval_current_class_id, 1, 99);
265 (check_interaction<BytecodeTraceBuilder, lookup_bc_retrieval_contract_instance_retrieval_settings>(trace)),
266 "Failed.*LOOKUP_BC_RETRIEVAL_CONTRACT_INSTANCE_RETRIEVAL.*Could not find tuple in destination.");
267
268 trace.set(C::contract_instance_retrieval_current_class_id, 1, 99);
270 , "INSTANCE_MEMBER_CLASS_ID_IS_ZERO_IF_DNE");
271
272 // reset
273 trace.set(C::bc_retrieval_current_class_id, 1, 0);
274 trace.set(C::contract_instance_retrieval_current_class_id, 1, 0);
275
276 // mutate the bytecode_id and confirm that it is a violation
277 trace.set(C::bc_retrieval_bytecode_id, 1, 99);
278 EXPECT_THROW_WITH_MESSAGE(check_relation<bc_retrieval>(trace), "BYTECODE_ID_IS_ZERO_IF_ERROR");
279 // reset
280 trace.set(C::bc_retrieval_bytecode_id, 1, 0);
281}
282
283class BytecodeRetrievalConstrainingTestFewerMocks : public BytecodeRetrievalConstrainingTest {
284 public:
285 EventEmitter<simulation::Poseidon2HashEvent> hash_event_emitter;
286 EventEmitter<simulation::Poseidon2PermutationEvent> perm_event_emitter;
287 EventEmitter<simulation::Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
288 EventEmitter<simulation::MerkleCheckEvent> merkle_check_emitter;
289 EventEmitter<simulation::RangeCheckEvent> range_check_emitter;
290 EventEmitter<simulation::FieldGreaterThanEvent> field_gt_emitter;
291 EventEmitter<simulation::RetrievedBytecodesTreeCheckEvent> retrieved_bytecodes_tree_check_emitter;
292
293 StrictMock<MockGreaterThan> mock_gt;
294 StrictMock<MockExecutionIdManager> mock_execution_id_manager;
295
296 Poseidon2TraceBuilder poseidon2_builder;
297
299 Poseidon2(mock_execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter);
300 MerkleCheck merkle_check = MerkleCheck(poseidon2, merkle_check_emitter);
301 RangeCheck range_check = RangeCheck(range_check_emitter);
302 FieldGreaterThan field_gt = FieldGreaterThan(range_check, field_gt_emitter);
303
304 RetrievedBytecodesTreeCheck retrieved_bytecodes_tree_check =
305 RetrievedBytecodesTreeCheck(poseidon2,
306 merkle_check,
307 field_gt,
309 retrieved_bytecodes_tree_check_emitter);
310
311 BytecodeTraceBuilder builder;
312 ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder;
313 ClassIdDerivationTraceBuilder class_id_builder;
314 RetrievedBytecodesTreeCheckTraceBuilder retrieved_bytecodes_tree_check_builder;
315 FieldGreaterThanTraceBuilder field_gt_builder;
316 PrecomputedTraceBuilder precomputed_builder;
317};
318
319TEST_F(BytecodeRetrievalConstrainingTestFewerMocks, SuccessfulRetrievalFewerMocks)
320{
321 TestTraceContainer trace = init_trace();
322
323 FF nullifier_root = FF::random_element();
324 FF public_data_tree_root = FF::random_element();
325
326 ContractInstance instance = random_contract_instance();
327 uint32_t bytecode_size = 20;
328 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
329 std::vector<FF> bytecode_fields = simulation::encode_bytecode(klass.packed_bytecode);
330 std::vector<FF> hash_input = { simulation::compute_public_bytecode_first_field(klass.packed_bytecode.size()) };
331 hash_input.reserve(1 + bytecode_fields.size());
332 hash_input.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
333 // Compute the bytecode commitment separately
334 FF bytecode_commitment = poseidon2.hash(hash_input);
335 builder.process_decomposition({ { .bytecode_id = bytecode_commitment,
336 .bytecode = std::make_shared<std::vector<uint8_t>>(klass.packed_bytecode) } },
337 trace);
338 trace.set(1, { { { C::bc_decomposition_sel_packed_read_0_, 1 } } });
339 builder.process_hashing({ { .bytecode_id = bytecode_commitment,
340 .bytecode_length = bytecode_size,
341 .bytecode_fields = bytecode_fields } },
342 trace);
343 // Compute the class id separately to produce the hash event, and replace the mocked value
345 { DOM_SEP__CONTRACT_CLASS_ID, klass.artifact_hash, klass.private_functions_root, bytecode_commitment });
346 instance.current_contract_class_id = class_id;
347 klass.id = class_id;
349 .address = instance.deployer,
350 .contract_instance = { instance },
351 .nullifier_tree_root = nullifier_root,
352 .public_data_tree_root = public_data_tree_root,
353 .exists = true,
354 } },
355 trace);
356
357 class_id_builder.process({ { .class_id = klass.id,
358 .artifact_hash = klass.artifact_hash,
359 .private_functions_root = klass.private_functions_root,
360 .public_bytecode_commitment = bytecode_commitment } },
361 trace);
362
363 AppendOnlyTreeSnapshot snapshot_before = retrieved_bytecodes_tree_check.get_snapshot();
364
365 // Read the tree of the retrieved bytecodes
366 retrieved_bytecodes_tree_check.contains(instance.current_contract_class_id);
367
368 // Insertion in the retrieved bytecodes tree
369 retrieved_bytecodes_tree_check.insert(instance.current_contract_class_id);
370
371 AppendOnlyTreeSnapshot snapshot_after = retrieved_bytecodes_tree_check.get_snapshot();
372
374
375 // Build a bytecode retrieval event where instance exists
376 builder.process_retrieval({ {
377 .bytecode_id = bytecode_commitment, // bytecode_id equals commitment
378 .address = instance.deployer,
379 .current_class_id = instance.current_contract_class_id,
380 .contract_class = klass,
381 .nullifier_root = nullifier_root,
382 .public_data_tree_root = public_data_tree_root,
383 .retrieved_bytecodes_snapshot_before = snapshot_before,
384 .retrieved_bytecodes_snapshot_after = snapshot_after,
385 .is_new_class = true,
386 } },
387 trace);
388
392
393 check_relation<bc_retrieval>(trace);
394 check_relation<bb::avm2::bc_decomposition<FF>>(trace);
395 check_relation<bb::avm2::bc_hashing<FF>>(trace);
396 check_relation<bb::avm2::contract_instance_retrieval<FF>>(trace);
397 check_relation<bb::avm2::class_id_derivation<FF>>(trace);
398 check_relation<bb::avm2::retrieved_bytecodes_tree_check<FF>>(trace);
399 check_all_interactions<BytecodeTraceBuilder>(trace);
400 check_all_interactions<ClassIdDerivationTraceBuilder>(trace);
401}
402
403TEST_F(BytecodeRetrievalConstrainingTestFewerMocks, SuccessfulRepeatedRetrievalFewerMocks)
404{
405 TestTraceContainer trace = init_trace();
406
407 FF nullifier_root = FF::random_element();
408 FF public_data_tree_root = FF::random_element();
409
410 ContractInstance instance = random_contract_instance();
411 uint32_t bytecode_size = 20;
412 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
413 std::vector<FF> bytecode_fields = simulation::encode_bytecode(klass.packed_bytecode);
414 std::vector<FF> hash_input = { simulation::compute_public_bytecode_first_field(klass.packed_bytecode.size()) };
415 hash_input.reserve(1 + bytecode_fields.size());
416 hash_input.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
417 // Compute the bytecode commitment separately
418 FF bytecode_commitment = poseidon2.hash(hash_input);
419 builder.process_decomposition({ { .bytecode_id = bytecode_commitment,
420 .bytecode = std::make_shared<std::vector<uint8_t>>(klass.packed_bytecode) } },
421 trace);
422 trace.set(1, { { { C::bc_decomposition_sel_packed_read_0_, 1 } } });
423 builder.process_hashing({ { .bytecode_id = bytecode_commitment,
424 .bytecode_length = bytecode_size,
425 .bytecode_fields = bytecode_fields } },
426 trace);
427
428 // Compute the class id separately to produce the hash event, and replace the mocked value
430 { DOM_SEP__CONTRACT_CLASS_ID, klass.artifact_hash, klass.private_functions_root, bytecode_commitment });
431 instance.current_contract_class_id = class_id;
432 klass.id = class_id;
434 .address = instance.deployer,
435 .contract_instance = { instance },
436 .nullifier_tree_root = nullifier_root,
437 .public_data_tree_root = public_data_tree_root,
438 .exists = true,
439 } },
440 trace);
441 class_id_builder.process({ { .class_id = klass.id,
442 .artifact_hash = klass.artifact_hash,
443 .private_functions_root = klass.private_functions_root,
444 .public_bytecode_commitment = bytecode_commitment } },
445 trace);
446
447 AppendOnlyTreeSnapshot snapshot_before = retrieved_bytecodes_tree_check.get_snapshot();
448
449 // Read the tree of the retrieved bytecodes
450 retrieved_bytecodes_tree_check.contains(instance.current_contract_class_id);
451
452 // Insertion in the retrieved bytecodes tree
453 retrieved_bytecodes_tree_check.insert(instance.current_contract_class_id);
454
455 AppendOnlyTreeSnapshot snapshot_after = retrieved_bytecodes_tree_check.get_snapshot();
456
457 // Retrieve the same again:
458
459 // Read the tree of the retrieved bytecodes
460 retrieved_bytecodes_tree_check.contains(instance.current_contract_class_id);
461
462 // 'Insertion' in the retrieved bytecodes tree (shouldn't write)
463 retrieved_bytecodes_tree_check.insert(instance.current_contract_class_id);
464
466
467 // Build a bytecode retrieval event where instance exists
468 builder.process_retrieval({ {
469 .bytecode_id = bytecode_commitment, // bytecode_id equals commitment
470 .address = instance.deployer,
471 .current_class_id = instance.current_contract_class_id,
472 .contract_class = klass,
473 .nullifier_root = nullifier_root,
474 .public_data_tree_root = public_data_tree_root,
475 .retrieved_bytecodes_snapshot_before = snapshot_before,
476 .retrieved_bytecodes_snapshot_after = snapshot_after,
477 .is_new_class = true,
478 },
479 {
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_root = nullifier_root,
485 .public_data_tree_root = public_data_tree_root,
486 .retrieved_bytecodes_snapshot_before = snapshot_after,
487 .retrieved_bytecodes_snapshot_after = snapshot_after,
488 .is_new_class = false,
489 } },
490 trace);
491
495
496 check_relation<bc_retrieval>(trace);
497 check_relation<bb::avm2::bc_decomposition<FF>>(trace);
498 check_relation<bb::avm2::bc_hashing<FF>>(trace);
499 check_relation<bb::avm2::contract_instance_retrieval<FF>>(trace);
500 check_relation<bb::avm2::class_id_derivation<FF>>(trace);
501 check_relation<bb::avm2::retrieved_bytecodes_tree_check<FF>>(trace);
502 check_all_interactions<BytecodeTraceBuilder>(trace);
503 check_all_interactions<ClassIdDerivationTraceBuilder>(trace);
504
505 // We cannot claim the second retrieval refers to a new class:
506 // (1) The lookup into the transient tree will have leaf_not_exists == 0 at the root, which is
507 // constrained in execution to either be continuous or correctly transitioned when adding a bytecode:
508 trace.set(C::bc_retrieval_is_new_class, 1, 1);
509 EXPECT_THROW_WITH_MESSAGE(check_all_interactions<BytecodeTraceBuilder>(trace), "IS_NEW_CLASS_CHECK");
510 // (2) Attempting to maliciously set leaf_not_exists == 1 will fail the transient tree's leaf checks:
511 trace.set(C::retrieved_bytecodes_tree_check_leaf_not_exists, 2, 1);
512 check_all_interactions<BytecodeTraceBuilder>(trace);
513 check_relation<bc_retrieval>(trace);
515}
516
517} // namespace
518} // namespace bb::avm2::constraining
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
Definition assert.hpp:193
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define AVM_RETRIEVED_BYTECODES_TREE_INITIAL_ROOT
#define AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE
#define MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS
#define DOM_SEP__CONTRACT_CLASS_ID
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
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
EventEmitter< simulation::RetrievedBytecodesTreeCheckEvent > retrieved_bytecodes_tree_check_emitter
EventEmitter< simulation::RangeCheckEvent > range_check_emitter
RetrievedBytecodesTreeCheckTraceBuilder retrieved_bytecodes_tree_check_builder
RangeCheck range_check
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)
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)
void process(const simulation::EventEmitterInterface< simulation::RetrievedBytecodesTreeCheckEvent >::Container &events, TraceContainer &trace)
void set(Column col, uint32_t row, const FF &value)
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
void check_interaction(tracegen::TestTraceContainer &trace)
TEST_F(AvmRecursiveTests, TwoLayerAvmRecursionFailsWithWrongPIs)
void check_relation(const tracegen::TestTraceContainer &trace, Ts... subrelation)
IndexedLeaf< ClassIdLeafValue > RetrievedBytecodesTreeLeafPreimage
RetrievedBytecodesTree build_retrieved_bytecodes_tree()
std::vector< FF > encode_bytecode(std::span< const uint8_t > bytecode)
FF compute_public_bytecode_first_field(size_t bytecode_size)
ContractClass random_contract_class(size_t bytecode_size)
Definition fixtures.cpp:175
ContractInstance random_contract_instance()
Definition fixtures.cpp:159
TestTraceContainer empty_trace()
Definition fixtures.cpp:153
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