Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
graph_description_poseidon2s_permutation.test.cpp
Go to the documentation of this file.
2
7
10
14using namespace bb;
15using namespace cdg;
16
17namespace {
19}
20
28using fr_ct = typename _curve::ScalarField;
30
43bool check_in_input_vector(const std::vector<field_t>& input_vector, const uint32_t& real_var_index)
44{
45 for (const auto& elem : input_vector) {
46 if (elem.witness_index == real_var_index) {
47 return true;
48 }
49 }
50 return false;
51}
52
60void test_poseidon2s_circuit(size_t num_inputs = 5)
61{
62 auto builder = Builder();
64
65 for (size_t i = 0; i < num_inputs; ++i) {
66 auto element = fr::random_element(&engine);
67 inputs.emplace_back(field_t(witness_t(&builder, element)));
68 }
69
70 for (auto& elem : inputs) {
71 elem.fix_witness();
72 }
73 [[maybe_unused]] auto result = stdlib::poseidon2<Builder>::hash(builder, inputs);
74 auto graph = StaticAnalyzer(builder);
75 auto connected_components = graph.find_connected_components();
76 EXPECT_EQ(connected_components.size(), 1);
77 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
78 std::unordered_set<uint32_t> outputs{
79 result.witness_index, result.witness_index + 1, result.witness_index + 2, result.witness_index + 3
80 };
81 for (const auto& elem : variables_in_one_gate) {
82 EXPECT_EQ(outputs.contains(elem), true);
83 }
84}
85
94void test_poseidon2s_hash_repeated_pairs(size_t num_inputs = 5)
95{
97
98 fr left_in = fr::random_element();
99 fr right_in = fr::random_element();
100
101 fr_ct left = witness_ct(&builder, left_in);
102 fr_ct right = witness_ct(&builder, right_in);
103 right.fix_witness();
104 std::unordered_set<uint32_t> outputs{ left.witness_index };
105 // num_inputs - 1 iterations since the first hash hashes two elements
106 for (size_t i = 0; i < num_inputs - 1; ++i) {
107 left = stdlib::poseidon2<Builder>::hash(builder, { left, right });
108 outputs.insert(left.witness_index + 1);
109 outputs.insert(left.witness_index + 2);
110 outputs.insert(left.witness_index + 3);
111 }
112 left.fix_witness();
113
114 auto graph = StaticAnalyzer(builder);
115 auto connected_components = graph.find_connected_components();
116 EXPECT_EQ(connected_components.size(), 1);
117 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
118 for (const auto& elem : variables_in_one_gate) {
119 EXPECT_EQ(outputs.contains(elem), true);
120 }
121}
122
129TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_one_permutation)
130{
132 auto builder = Builder();
133
134 for (size_t i = 0; i < Params::t; ++i) {
135 const auto element = fr::random_element(&engine);
136 inputs[i] = field_t(witness_t(&builder, element));
137 }
138
139 auto poseidon2permutation = Permutation();
140 [[maybe_unused]] auto new_state = poseidon2permutation.permutation(&builder, inputs);
141 for (auto& elem : new_state) {
142 elem.fix_witness();
143 }
144
145 auto graph = StaticAnalyzer(builder);
146 auto connected_components = graph.find_connected_components();
147 EXPECT_EQ(connected_components.size(), 1);
148 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
149 EXPECT_EQ(variables_in_one_gate.size(), 0);
150}
151
158TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_two_permutations)
159{
160 // we want to check that 2 permutations for different inputs give different connected components
163 auto builder = Builder();
164
165 for (size_t i = 0; i < Params::t; ++i) {
166 const auto el1 = fr::random_element(&engine);
167 input1[i] = field_t(witness_t(&builder, el1));
168 const auto el2 = fr::random_element(&engine);
169 input2[i] = field_t(witness_t(&builder, el2));
170 }
171
172 auto poseidon2permutation = Permutation();
173 [[maybe_unused]] auto state1 = poseidon2permutation.permutation(&builder, input1);
174 [[maybe_unused]] auto state2 = poseidon2permutation.permutation(&builder, input2);
175 for (auto& elem : state1) {
176 elem.fix_witness();
177 }
178 for (auto& elem : state2) {
179 elem.fix_witness();
180 }
181 auto graph = StaticAnalyzer(builder);
182 auto connected_components = graph.find_connected_components();
183 EXPECT_EQ(connected_components.size(), 2);
184 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
185 EXPECT_EQ(variables_in_one_gate.size(), 0);
186}
187
191TEST(boomerang_poseidon2s, test_graph_for_poseidon2s)
192{
193 for (size_t num_inputs = 6; num_inputs < 100; num_inputs++) {
194 test_poseidon2s_circuit(num_inputs);
195 }
196}
197
201TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_for_one_input_size)
202{
204}
205
209TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_hash_repeated_pairs)
210{
212}
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
Represents a dynamic array of bytes in-circuit.
uint32_t witness_index
Definition field.hpp:132
AluTraceBuilder builder
Definition alu.test.cpp:123
numeric::RNG & engine
TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_one_permutation)
Test graph description for a single poseidon2 permutation.
stdlib::witness_t< Builder > witness_t
stdlib::Poseidon2Permutation< Params, Builder > Permutation
void test_poseidon2s_hash_repeated_pairs(size_t num_inputs=5)
Test graph description for repeated poseidon2 hash operations.
bool check_in_input_vector(const std::vector< field_t > &input_vector, const uint32_t &real_var_index)
Check if a variable index is present in the input vector.
stdlib::field_t< Builder > field_t
void test_poseidon2s_circuit(size_t num_inputs=5)
Test graph description for poseidon2 hash with random inputs.
typename _curve::witness_ct witness_ct
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:190
Entry point for Barretenberg command-line interface.
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
Definition graph.cpp:11
StaticAnalyzer_< bb::fr > StaticAnalyzer
Definition graph.hpp:201
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static field random_element(numeric::RNG *engine=nullptr) noexcept
field_t< CircuitBuilder > ScalarField
Definition bn254.hpp:33
byte_array< CircuitBuilder > byte_array_ct
Definition bn254.hpp:43
witness_t< CircuitBuilder > witness_ct
Definition bn254.hpp:41