1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
29using tracegen::BytecodeTraceBuilder;
30using tracegen::ClassIdDerivationTraceBuilder;
31using tracegen::ContractInstanceRetrievalTraceBuilder;
32using tracegen::RetrievedBytecodesTreeCheckTraceBuilder;
33using tracegen::TestTraceContainer;
35using simulation::ClassIdLeafValue;
36using simulation::RetrievedBytecodesTreeCheckEvent;
44void init_trace(TestTraceContainer&
trace)
47 trace.
set(C::precomputed_first_row, 0, 1);
50TEST(BytecodeRetrievalConstrainingTest, EmptyRow)
55TEST(BytecodeRetrievalConstrainingTest, SuccessfulRetrieval)
57 TestTraceContainer
trace;
60 ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder;
61 ClassIdDerivationTraceBuilder class_id_builder;
62 RetrievedBytecodesTreeCheckTraceBuilder retrieved_bytecodes_tree_check_builder;
64 FF nullifier_root = FF::random_element();
65 FF public_data_tree_root = FF::random_element();
68 uint32_t bytecode_size = 20;
72 hash_input.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
75 builder.process_hashing({ { .bytecode_id = klass.public_bytecode_commitment,
76 .bytecode_length = bytecode_size,
77 .bytecode_fields = bytecode_fields } },
79 contract_instance_retrieval_builder.
process({ {
80 .address = instance.deployer_addr,
81 .contract_instance = { instance },
82 .nullifier_tree_root = nullifier_root,
83 .public_data_tree_root = public_data_tree_root,
87 class_id_builder.process({ { .class_id = instance.current_class_id, .klass = klass } },
trace);
89 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
94 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
100 retrieved_bytecodes_tree_check_builder.process(
101 { RetrievedBytecodesTreeCheckEvent{
102 .class_id = instance.current_class_id,
103 .prev_snapshot = snapshot_before,
104 .next_snapshot = snapshot_after,
111 retrieved_bytecodes_tree_check_builder.process(
112 { RetrievedBytecodesTreeCheckEvent{
113 .class_id = instance.current_class_id,
114 .prev_snapshot = snapshot_before,
115 .next_snapshot = snapshot_after,
124 .bytecode_id = klass.public_bytecode_commitment,
125 .address = instance.deployer_addr,
126 .current_class_id = instance.current_class_id,
127 .contract_class = klass,
128 .nullifier_root = nullifier_root,
129 .public_data_tree_root = public_data_tree_root,
130 .retrieved_bytecodes_snapshot_before = snapshot_before,
131 .retrieved_bytecodes_snapshot_after = snapshot_after,
132 .is_new_class =
true,
136 check_relation<bc_retrieval>(
trace);
144TEST(BytecodeRetrievalConstrainingTest, TooManyBytecodes)
146 TestTraceContainer
trace;
150 FF nullifier_root = FF::random_element();
151 FF public_data_tree_root = FF::random_element();
154 uint32_t bytecode_size = 20;
157 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
159 .nextAvailableLeafIndex =
163 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
165 .nextAvailableLeafIndex =
172 .address = instance.deployer_addr,
173 .current_class_id = instance.current_class_id,
174 .nullifier_root = nullifier_root,
175 .public_data_tree_root = public_data_tree_root,
176 .retrieved_bytecodes_snapshot_before = snapshot_before,
177 .retrieved_bytecodes_snapshot_after = snapshot_after,
178 .is_new_class =
true,
183 check_relation<bc_retrieval>(
trace);
186TEST(BytecodeRetrievalConstrainingTest, NonExistentInstance)
189 TestTraceContainer
trace;
199 { C::bc_retrieval_sel, 1 },
200 { C::bc_retrieval_instance_exists, 0 },
201 { C::bc_retrieval_current_class_id, 0 },
202 { C::bc_retrieval_artifact_hash, 0 },
203 { C::bc_retrieval_private_function_root, 0 },
204 { C::bc_retrieval_bytecode_id, 0 },
206 { C::bc_retrieval_prev_retrieved_bytecodes_tree_size, 1 },
207 { C::bc_retrieval_next_retrieved_bytecodes_tree_size, 1 },
209 { C::bc_retrieval_error, 1 },
212 check_relation<bc_retrieval>(
trace);
215 trace.
set(C::bc_retrieval_current_class_id, 1, 99);
217 "CURRENT_CLASS_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST");
219 trace.
set(C::bc_retrieval_current_class_id, 1, 0);
222 trace.
set(C::bc_retrieval_artifact_hash, 1, 99);
225 trace.
set(C::bc_retrieval_artifact_hash, 1, 0);
228 trace.
set(C::bc_retrieval_private_function_root, 1, 99);
231 trace.
set(C::bc_retrieval_private_function_root, 1, 0);
234 trace.
set(C::bc_retrieval_bytecode_id, 1, 99);
237 trace.
set(C::bc_retrieval_bytecode_id, 1, 0);
#define AVM_RETRIEVED_BYTECODES_TREE_INITIAL_ROOT
#define AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE
#define MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS
#define GENERATOR_INDEX__PUBLIC_BYTECODE
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::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.
AztecAddress contract_address
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
IndexedLeaf< ClassIdLeafValue > RetrievedBytecodesTreeLeafPreimage
std::vector< FF > encode_bytecode(std::span< const uint8_t > bytecode)
ContractClass random_contract_class(size_t bytecode_size)
ContractInstance random_contract_instance()
TestTraceContainer empty_trace()
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
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