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
17
18namespace bb::avm2::constraining {
19namespace {
20
23using tracegen::BytecodeTraceBuilder;
24using tracegen::TestTraceContainer;
25
27using C = Column;
28using bc_retrieval = bb::avm2::bc_retrieval<FF>;
29
30void init_trace(TestTraceContainer& trace)
31{
32 // Add first row.
33 trace.set(C::precomputed_first_row, 0, 1);
34}
35
36TEST(BytecodeRetrievalConstrainingTest, EmptyRow)
37{
38 check_relation<bc_retrieval>(testing::empty_trace());
39}
40
41TEST(BytecodeRetrievalConstrainingTest, SuccessfulRetrieval)
42{
43 TestTraceContainer trace;
44 init_trace(trace);
45 BytecodeTraceBuilder builder;
46
47 FF nullifier_root = FF::random_element();
48 FF public_data_tree_root = FF::random_element();
49
50 ContractInstance instance = random_contract_instance();
51 uint32_t bytecode_size = 20;
52 ContractClass klass = random_contract_class(/*bytecode_size=*/bytecode_size);
53
54 // Build a bytecode retrieval event where instance exists
55 builder.process_retrieval({ { .bytecode_id = klass.public_bytecode_commitment, // bytecode_id equals commitment
56 .address = instance.deployer_addr,
57 .current_class_id = instance.current_class_id,
58 .contract_class = klass,
59 .nullifier_root = nullifier_root,
60 .public_data_tree_root = public_data_tree_root,
61 .error = false } },
62 trace);
63
64 check_relation<bc_retrieval>(trace);
65}
66
67TEST(BytecodeRetrievalConstrainingTest, NonExistentInstance)
68{
69
70 TestTraceContainer trace;
71 init_trace(trace);
72
73 FF contract_address = FF::random_element();
74
75 // Manually set up a row where instance_exists = 0
76 // All other fields should be forced to 0 by constraints
77 trace.set(1,
78 { {
79 { C::bc_retrieval_sel, 1 },
80 { C::bc_retrieval_instance_exists, 0 },
81 { C::bc_retrieval_current_class_id, 0 },
82 { C::bc_retrieval_artifact_hash, 0 },
83 { C::bc_retrieval_private_function_root, 0 },
84 { C::bc_retrieval_bytecode_id, 0 },
85 { C::bc_retrieval_address, contract_address },
86 { C::bc_retrieval_error, 1 },
87 } });
88
89 check_relation<bc_retrieval>(trace);
90
91 // mutate the current_class_id and confirm that a violation as it should be 0
92 trace.set(C::bc_retrieval_current_class_id, 1, 99);
93 EXPECT_THROW_WITH_MESSAGE(check_relation<bc_retrieval>(trace),
94 "CURRENT_CLASS_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST");
95 // reset
96 trace.set(C::bc_retrieval_current_class_id, 1, 0);
97
98 // mutate the artifact_hash and confirm that it is a violation
99 trace.set(C::bc_retrieval_artifact_hash, 1, 99);
100 EXPECT_THROW_WITH_MESSAGE(check_relation<bc_retrieval>(trace), "ARTIFACT_HASH_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST");
101 // reset
102 trace.set(C::bc_retrieval_artifact_hash, 1, 0);
103
104 // mutate the private_function_root and confirm that it is a violation
105 trace.set(C::bc_retrieval_private_function_root, 1, 99);
106 EXPECT_THROW_WITH_MESSAGE(check_relation<bc_retrieval>(trace),
107 "PRIVATE_FUNCTION_ROOT_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST");
108 // reset
109 trace.set(C::bc_retrieval_private_function_root, 1, 0);
110
111 // mutate the bytecode_id and confirm that it is a violation
112 trace.set(C::bc_retrieval_bytecode_id, 1, 99);
113 EXPECT_THROW_WITH_MESSAGE(check_relation<bc_retrieval>(trace), "BYTECODE_ID_IS_ZERO_IF_INSTANCE_DOES_NOT_EXIST");
114 // reset
115 trace.set(C::bc_retrieval_bytecode_id, 1, 0);
116}
117
118} // namespace
119} // namespace bb::avm2::constraining
void set(Column col, uint32_t row, const FF &value)
AluTraceBuilder builder
Definition alu.test.cpp:123
TestTraceContainer trace
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
Definition macros.hpp:7
TEST(TxExecutionConstrainingTest, WriteTreeValue)
Definition tx.test.cpp:508
ContractClass random_contract_class(size_t bytecode_size)
Definition fixtures.cpp:174
ContractInstance random_contract_instance()
Definition fixtures.cpp:158
TestTraceContainer empty_trace()
Definition fixtures.cpp:153
typename Flavor::FF FF