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::FakePoseidon2;
37using simulation::MockExecutionIdManager;
38using simulation::MockGreaterThan;
39using simulation::NoopEventEmitter;
40using simulation::Poseidon2;
41using simulation::Poseidon2HashEvent;
42using simulation::Poseidon2PermutationEvent;
43using simulation::Poseidon2PermutationMemoryEvent;
44
46using C = Column;
47using class_id_derivation_relation = bb::avm2::class_id_derivation<FF>;
48
49ContractClass generate_contract_class()
50{
51 return ContractClass{ .artifact_hash = FF::random_element(),
52 .private_function_root = FF::random_element(),
53 .public_bytecode_commitment = FF::random_element(),
54 .packed_bytecode = {} };
55}
56
57TEST(ClassIdDerivationConstrainingTest, EmptyRow)
58{
59 check_relation<class_id_derivation_relation>(testing::empty_trace());
60}
61
62TEST(ClassIdDerivationConstrainingTest, Basic)
63{
64 TestTraceContainer trace;
65 ClassIdDerivationTraceBuilder builder;
66
67 auto klass = generate_contract_class();
68
69 FF class_id =
70 compute_contract_class_id(klass.artifact_hash, klass.private_function_root, klass.public_bytecode_commitment);
71
72 builder.process({ { .class_id = class_id, .klass = klass } }, trace);
73
74 check_relation<class_id_derivation_relation>(trace);
75}
76
77TEST(ClassIdDerivationPoseidonTest, WithHashInteraction)
78{
79 EventEmitter<Poseidon2HashEvent> hash_event_emitter;
80 NoopEventEmitter<Poseidon2PermutationEvent> perm_event_emitter;
81 NoopEventEmitter<Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
82 StrictMock<MockExecutionIdManager> execution_id_manager;
83 StrictMock<MockGreaterThan> mock_gt;
86
87 EventEmitter<ClassIdDerivationEvent> event_emitter;
88 ClassIdDerivation class_id_derivation(poseidon2, event_emitter);
89
90 auto klass = generate_contract_class();
91 FF class_id =
92 compute_contract_class_id(klass.artifact_hash, klass.private_function_root, klass.public_bytecode_commitment);
93
94 TestTraceContainer trace({
95 { { C::precomputed_first_row, 1 } },
96 });
97
98 ClassIdDerivationTraceBuilder builder;
99 Poseidon2TraceBuilder poseidon2_builder;
100
101 class_id_derivation.assert_derivation(class_id, klass);
102
103 poseidon2_builder.process_hash(hash_event_emitter.dump_events(), trace);
104 builder.process({ { .class_id = class_id, .klass = klass } }, trace);
105
106 check_interaction<ClassIdDerivationTraceBuilder,
109}
110
111// TODO: This should probably be refined and moved to bc_retrieval test file once that exists
112TEST(ClassIdDerivationPoseidonTest, WithRetrievalInteraction)
113{
114 FakePoseidon2 poseidon2 = FakePoseidon2();
115
116 EventEmitter<ClassIdDerivationEvent> event_emitter;
117 ClassIdDerivation class_id_derivation(poseidon2, event_emitter);
118
119 auto klass = generate_contract_class();
120 FF class_id =
121 compute_contract_class_id(klass.artifact_hash, klass.private_function_root, klass.public_bytecode_commitment);
122
123 TestTraceContainer trace({
124 { { C::precomputed_first_row, 1 } },
125 });
126
127 ClassIdDerivationTraceBuilder builder;
128 BytecodeTraceBuilder bc_trace_builder;
129
130 class_id_derivation.assert_derivation(class_id, klass);
131 builder.process({ { .class_id = class_id, .klass = klass } }, trace);
132
133 bc_trace_builder.process_retrieval({ { .bytecode_id = klass.public_bytecode_commitment,
134 .address = 1,
135 .current_class_id = class_id,
136 .contract_class = klass,
137 .nullifier_root = 3 } },
138 trace);
139
140 check_interaction<BytecodeTraceBuilder, lookup_bc_retrieval_class_id_derivation_settings>(trace);
141}
142
143} // namespace
144} // namespace bb::avm2::constraining
Implements a parallelized batch insertion indexed tree Accepts template argument of the type of store...
AluTraceBuilder builder
Definition alu.test.cpp:123
ExecutionIdManager execution_id_manager
EventEmitter< DataCopyEvent > event_emitter
TestTraceContainer trace
NoopEventEmitter< Poseidon2PermutationEvent > perm_event_emitter
NoopEventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
NiceMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2HashEvent > hash_event_emitter
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
Definition tx.test.cpp:508
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
typename Flavor::FF FF