Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
class_id_derivation.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
21
22namespace bb::avm2::constraining {
23namespace {
24
25using ::testing::StrictMock;
26
27using tracegen::BytecodeTraceBuilder;
28using tracegen::ClassIdDerivationTraceBuilder;
29using tracegen::Poseidon2TraceBuilder;
30using tracegen::TestTraceContainer;
31
32using simulation::ClassIdDerivation;
33using simulation::ClassIdDerivationEvent;
35using simulation::EventEmitter;
36using simulation::MockExecutionIdManager;
37using simulation::MockGreaterThan;
38using simulation::NoopEventEmitter;
39using simulation::Poseidon2;
40using simulation::Poseidon2HashEvent;
41using simulation::Poseidon2PermutationEvent;
42using simulation::Poseidon2PermutationMemoryEvent;
43using simulation::PurePoseidon2;
44
46using C = Column;
47using class_id_derivation_relation = bb::avm2::class_id_derivation<FF>;
48
49ContractClassWithCommitment generate_contract_class()
50{
51 return ContractClassWithCommitment{
52 .id = FF::random_element(),
53 .artifact_hash = FF::random_element(),
54 .private_functions_root = FF::random_element(),
55 .packed_bytecode = {},
56 .public_bytecode_commitment = FF::random_element(),
57 };
58}
59
60TEST(ClassIdDerivationConstrainingTest, EmptyRow)
61{
62 check_relation<class_id_derivation_relation>(testing::empty_trace());
63}
64
65TEST(ClassIdDerivationConstrainingTest, Basic)
66{
67 TestTraceContainer trace;
68 ClassIdDerivationTraceBuilder builder;
69
70 auto klass = generate_contract_class();
71 FF class_id =
72 compute_contract_class_id(klass.artifact_hash, klass.private_functions_root, klass.public_bytecode_commitment);
73 klass.id = class_id;
74
75 builder.process({ { .klass = klass } }, trace);
76
77 check_relation<class_id_derivation_relation>(trace);
78}
79
80TEST(ClassIdDerivationPoseidonTest, WithHashInteraction)
81{
82 EventEmitter<Poseidon2HashEvent> hash_event_emitter;
83 NoopEventEmitter<Poseidon2PermutationEvent> perm_event_emitter;
84 NoopEventEmitter<Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
85 StrictMock<MockExecutionIdManager> execution_id_manager;
86 StrictMock<MockGreaterThan> mock_gt;
89
90 EventEmitter<ClassIdDerivationEvent> event_emitter;
92
93 auto klass = generate_contract_class();
94 FF class_id =
95 compute_contract_class_id(klass.artifact_hash, klass.private_functions_root, klass.public_bytecode_commitment);
96 klass.id = class_id;
97
98 TestTraceContainer trace({
99 { { C::precomputed_first_row, 1 } },
100 });
101
102 ClassIdDerivationTraceBuilder builder;
103 Poseidon2TraceBuilder poseidon2_builder;
104
105 class_id_derivation.assert_derivation(klass);
106
108 builder.process({ { .klass = klass } }, trace);
109
110 check_interaction<ClassIdDerivationTraceBuilder,
113}
114
115// TODO: This should probably be refined and moved to bc_retrieval test file once that exists
116TEST(ClassIdDerivationPoseidonTest, WithRetrievalInteraction)
117{
118 PurePoseidon2 poseidon2 = PurePoseidon2();
119
120 EventEmitter<ClassIdDerivationEvent> event_emitter;
121 ClassIdDerivation class_id_derivation(poseidon2, event_emitter);
122
123 auto klass = generate_contract_class();
124 FF class_id =
125 compute_contract_class_id(klass.artifact_hash, klass.private_functions_root, klass.public_bytecode_commitment);
126 klass.id = class_id;
127
128 TestTraceContainer trace({
129 { { C::precomputed_first_row, 1 } },
130 });
131
132 ClassIdDerivationTraceBuilder builder;
133 BytecodeTraceBuilder bc_trace_builder;
134
135 class_id_derivation.assert_derivation(klass);
136 builder.process({ { .klass = klass } }, trace);
137
138 // Create a basic ContractClass without commitment for the retrieval event
139 ContractClass klass_without_commitment = {
140 .id = klass.id,
141 .artifact_hash = klass.artifact_hash,
142 .private_functions_root = klass.private_functions_root,
143 .packed_bytecode = klass.packed_bytecode,
144 };
145
146 bc_trace_builder.process_retrieval({ { .bytecode_id = klass.public_bytecode_commitment,
147 .address = 1,
148 .current_class_id = klass.id,
149 .contract_class = klass_without_commitment,
150 .nullifier_root = 3 } },
151 trace);
152
153 check_interaction<BytecodeTraceBuilder, lookup_bc_retrieval_class_id_derivation_settings>(trace);
154}
155
156} // namespace
157} // namespace bb::avm2::constraining
StrictMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
EventEmitter< Poseidon2PermutationEvent > perm_event_emitter
EventEmitter< Poseidon2HashEvent > hash_event_emitter
Poseidon2TraceBuilder poseidon2_builder
StrictMock< MockClassIdDerivation > class_id_derivation
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 process_hash(const simulation::EventEmitterInterface< simulation::Poseidon2HashEvent >::Container &hash_events, TraceContainer &trace)
Implements a parallelized batch insertion indexed tree Accepts template argument of the type of store...
AluTraceBuilder builder
Definition alu.test.cpp:124
ExecutionIdManager execution_id_manager
EventEmitter< DataCopyEvent > event_emitter
TestTraceContainer trace
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
Definition tx.test.cpp:441
FF compute_contract_class_id(const FF &artifact_hash, const FF &private_fn_root, const FF &public_bytecode_commitment)
TestTraceContainer empty_trace()
Definition fixtures.cpp:153
lookup_settings< lookup_class_id_derivation_class_id_poseidon2_1_settings_ > lookup_class_id_derivation_class_id_poseidon2_1_settings
lookup_settings< lookup_class_id_derivation_class_id_poseidon2_0_settings_ > lookup_class_id_derivation_class_id_poseidon2_0_settings
static field random_element(numeric::RNG *engine=nullptr) noexcept