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;
68 uint32_t bytecode_size = 20;
72 hash_input.reserve(1 + bytecode_fields.size());
73 hash_input.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
76 builder.process_hashing({ { .bytecode_id = bytecode_commitment,
77 .bytecode_length = bytecode_size,
78 .bytecode_fields = bytecode_fields } },
80 contract_instance_retrieval_builder.
process({ {
83 .nullifier_tree_root = nullifier_root,
84 .public_data_tree_root = public_data_tree_root,
88 ContractClassWithCommitment klass_with_commitment = {
89 .id =
instance.current_contract_class_id,
90 .artifact_hash = klass.artifact_hash,
91 .private_functions_root = klass.private_functions_root,
92 .packed_bytecode = klass.packed_bytecode,
93 .public_bytecode_commitment = bytecode_commitment,
95 class_id_builder.process({ { .klass = klass_with_commitment } },
trace);
97 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
102 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
108 retrieved_bytecodes_tree_check_builder.process(
109 { RetrievedBytecodesTreeCheckEvent{
110 .class_id =
instance.current_contract_class_id,
111 .prev_snapshot = snapshot_before,
112 .next_snapshot = snapshot_after,
119 retrieved_bytecodes_tree_check_builder.process(
120 { RetrievedBytecodesTreeCheckEvent{
121 .class_id =
instance.current_contract_class_id,
122 .prev_snapshot = snapshot_before,
123 .next_snapshot = snapshot_after,
132 .bytecode_id = bytecode_commitment,
134 .current_class_id =
instance.current_contract_class_id,
135 .contract_class = klass,
136 .nullifier_root = nullifier_root,
137 .public_data_tree_root = public_data_tree_root,
138 .retrieved_bytecodes_snapshot_before = snapshot_before,
139 .retrieved_bytecodes_snapshot_after = snapshot_after,
140 .is_new_class =
true,
144 check_relation<bc_retrieval>(trace);
152TEST(BytecodeRetrievalConstrainingTest, TooManyBytecodes)
154 TestTraceContainer
trace;
162 uint32_t bytecode_size = 20;
165 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
167 .next_available_leaf_index =
171 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
173 .next_available_leaf_index =
181 .current_class_id =
instance.current_contract_class_id,
182 .nullifier_root = nullifier_root,
183 .public_data_tree_root = public_data_tree_root,
184 .retrieved_bytecodes_snapshot_before = snapshot_before,
185 .retrieved_bytecodes_snapshot_after = snapshot_after,
186 .is_new_class =
true,
191 check_relation<bc_retrieval>(trace);
194TEST(BytecodeRetrievalConstrainingTest, NonExistentInstance)
197 TestTraceContainer
trace;
207 { C::bc_retrieval_sel, 1 },
208 { C::bc_retrieval_instance_exists, 0 },
209 { C::bc_retrieval_current_class_id, 0 },
210 { C::bc_retrieval_artifact_hash, 0 },
211 { C::bc_retrieval_private_functions_root, 0 },
212 { C::bc_retrieval_bytecode_id, 0 },
214 { C::bc_retrieval_prev_retrieved_bytecodes_tree_size, 1 },
215 { C::bc_retrieval_next_retrieved_bytecodes_tree_size, 1 },
217 { C::bc_retrieval_error, 1 },
220 check_relation<bc_retrieval>(trace);
223 trace.
set(C::bc_retrieval_current_class_id, 1, 99);
225 "CURRENT_CLASS_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST");
227 trace.
set(C::bc_retrieval_current_class_id, 1, 0);
230 trace.
set(C::bc_retrieval_artifact_hash, 1, 99);
233 trace.
set(C::bc_retrieval_artifact_hash, 1, 0);
236 trace.
set(C::bc_retrieval_private_functions_root, 1, 99);
239 trace.
set(C::bc_retrieval_private_functions_root, 1, 0);
242 trace.
set(C::bc_retrieval_bytecode_id, 1, 99);
245 trace.
set(C::bc_retrieval_bytecode_id, 1, 0);
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
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
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the 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
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
IndexedLeaf< ClassIdLeafValue > RetrievedBytecodesTreeLeafPreimage
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)
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
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept