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.insert(hash_input.end(), bytecode_fields.begin(), bytecode_fields.end());
75 builder.process_hashing({ { .bytecode_id = bytecode_commitment,
76 .bytecode_length = bytecode_size,
77 .bytecode_fields = bytecode_fields } },
79 contract_instance_retrieval_builder.
process({ {
82 .nullifier_tree_root = nullifier_root,
83 .public_data_tree_root = public_data_tree_root,
87 ContractClassWithCommitment klass_with_commitment = {
88 .id =
instance.current_contract_class_id,
89 .artifact_hash = klass.artifact_hash,
90 .private_functions_root = klass.private_functions_root,
91 .packed_bytecode = klass.packed_bytecode,
92 .public_bytecode_commitment = bytecode_commitment,
94 class_id_builder.process({ { .klass = klass_with_commitment } },
trace);
96 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
101 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
107 retrieved_bytecodes_tree_check_builder.process(
108 { RetrievedBytecodesTreeCheckEvent{
109 .class_id =
instance.current_contract_class_id,
110 .prev_snapshot = snapshot_before,
111 .next_snapshot = snapshot_after,
118 retrieved_bytecodes_tree_check_builder.process(
119 { RetrievedBytecodesTreeCheckEvent{
120 .class_id =
instance.current_contract_class_id,
121 .prev_snapshot = snapshot_before,
122 .next_snapshot = snapshot_after,
131 .bytecode_id = bytecode_commitment,
133 .current_class_id =
instance.current_contract_class_id,
134 .contract_class = klass,
135 .nullifier_root = nullifier_root,
136 .public_data_tree_root = public_data_tree_root,
137 .retrieved_bytecodes_snapshot_before = snapshot_before,
138 .retrieved_bytecodes_snapshot_after = snapshot_after,
139 .is_new_class =
true,
143 check_relation<bc_retrieval>(trace);
151TEST(BytecodeRetrievalConstrainingTest, TooManyBytecodes)
153 TestTraceContainer
trace;
161 uint32_t bytecode_size = 20;
164 AppendOnlyTreeSnapshot snapshot_before = AppendOnlyTreeSnapshot{
166 .next_available_leaf_index =
170 AppendOnlyTreeSnapshot snapshot_after = AppendOnlyTreeSnapshot{
172 .next_available_leaf_index =
180 .current_class_id =
instance.current_contract_class_id,
181 .nullifier_root = nullifier_root,
182 .public_data_tree_root = public_data_tree_root,
183 .retrieved_bytecodes_snapshot_before = snapshot_before,
184 .retrieved_bytecodes_snapshot_after = snapshot_after,
185 .is_new_class =
true,
190 check_relation<bc_retrieval>(trace);
193TEST(BytecodeRetrievalConstrainingTest, NonExistentInstance)
196 TestTraceContainer
trace;
206 { C::bc_retrieval_sel, 1 },
207 { C::bc_retrieval_instance_exists, 0 },
208 { C::bc_retrieval_current_class_id, 0 },
209 { C::bc_retrieval_artifact_hash, 0 },
210 { C::bc_retrieval_private_functions_root, 0 },
211 { C::bc_retrieval_bytecode_id, 0 },
213 { C::bc_retrieval_prev_retrieved_bytecodes_tree_size, 1 },
214 { C::bc_retrieval_next_retrieved_bytecodes_tree_size, 1 },
216 { C::bc_retrieval_error, 1 },
219 check_relation<bc_retrieval>(trace);
222 trace.
set(C::bc_retrieval_current_class_id, 1, 99);
224 "CURRENT_CLASS_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST");
226 trace.
set(C::bc_retrieval_current_class_id, 1, 0);
229 trace.
set(C::bc_retrieval_artifact_hash, 1, 99);
232 trace.
set(C::bc_retrieval_artifact_hash, 1, 0);
235 trace.
set(C::bc_retrieval_private_functions_root, 1, 99);
238 trace.
set(C::bc_retrieval_private_functions_root, 1, 0);
241 trace.
set(C::bc_retrieval_bytecode_id, 1, 99);
244 trace.
set(C::bc_retrieval_bytecode_id, 1, 0);
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 GENERATOR_INDEX__PUBLIC_BYTECODE
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
#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
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept