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.get_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(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.get_variables_in_one_gate();
78 std::unordered_set<uint32_t> outputs{ result.get_witness_index(),
79 result.get_witness_index() + 1,
80 result.get_witness_index() + 2,
81 result.get_witness_index() + 3 };
82 for (const auto& elem : variables_in_one_gate) {
83 EXPECT_EQ(outputs.contains(elem), true);
84 }
85}
86
95void test_poseidon2s_hash_repeated_pairs(size_t num_inputs = 5)
96{
98
99 fr left_in = fr::random_element();
100 fr right_in = fr::random_element();
101
102 fr_ct left = witness_ct(&builder, left_in);
103 fr_ct right = witness_ct(&builder, right_in);
104 right.fix_witness();
105 std::unordered_set<uint32_t> outputs{ left.get_witness_index() };
106 // num_inputs - 1 iterations since the first hash hashes two elements
107 for (size_t i = 0; i < num_inputs - 1; ++i) {
108 left = stdlib::poseidon2<Builder>::hash({ left, right });
109 outputs.insert(left.get_witness_index() + 1);
110 outputs.insert(left.get_witness_index() + 2);
111 outputs.insert(left.get_witness_index() + 3);
112 }
113 left.fix_witness();
114
115 auto graph = StaticAnalyzer(builder);
116 auto connected_components = graph.find_connected_components();
117 EXPECT_EQ(connected_components.size(), 1);
118 auto variables_in_one_gate = graph.get_variables_in_one_gate();
119 for (const auto& elem : variables_in_one_gate) {
120 EXPECT_EQ(outputs.contains(elem), true);
121 }
122}
123
130TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_one_permutation)
131{
133 auto builder = Builder();
134
135 for (size_t i = 0; i < Params::t; ++i) {
136 const auto element = fr::random_element(&engine);
137 inputs[i] = field_t(witness_t(&builder, element));
138 }
139
140 auto poseidon2permutation = Permutation();
141 [[maybe_unused]] auto new_state = poseidon2permutation.permutation(&builder, inputs);
142 for (auto& elem : new_state) {
143 elem.fix_witness();
144 }
145
146 auto graph = StaticAnalyzer(builder);
147 auto connected_components = graph.find_connected_components();
148 EXPECT_EQ(connected_components.size(), 1);
149 auto variables_in_one_gate = graph.get_variables_in_one_gate();
150 EXPECT_EQ(variables_in_one_gate.size(), 0);
151}
152
159TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_two_permutations)
160{
161 // we want to check that 2 permutations for different inputs give different connected components
164 auto builder = Builder();
165
166 for (size_t i = 0; i < Params::t; ++i) {
167 const auto el1 = fr::random_element(&engine);
168 input1[i] = field_t(witness_t(&builder, el1));
169 const auto el2 = fr::random_element(&engine);
170 input2[i] = field_t(witness_t(&builder, el2));
171 }
172
173 auto poseidon2permutation = Permutation();
174 [[maybe_unused]] auto state1 = poseidon2permutation.permutation(&builder, input1);
175 [[maybe_unused]] auto state2 = poseidon2permutation.permutation(&builder, input2);
176 for (auto& elem : state1) {
177 elem.fix_witness();
178 }
179 for (auto& elem : state2) {
180 elem.fix_witness();
181 }
182 auto graph = StaticAnalyzer(builder);
183 auto connected_components = graph.find_connected_components();
184 EXPECT_EQ(connected_components.size(), 2);
185 auto variables_in_one_gate = graph.get_variables_in_one_gate();
186 EXPECT_EQ(variables_in_one_gate.size(), 0);
187}
188
192TEST(boomerang_poseidon2s, test_graph_for_poseidon2s)
193{
194 for (size_t num_inputs = 6; num_inputs < 100; num_inputs++) {
195 test_poseidon2s_circuit(num_inputs);
196 }
197}
198
202TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_for_one_input_size)
203{
205}
206
210TEST(boomerang_poseidon2s, test_graph_for_poseidon2s_hash_repeated_pairs)
211{
213}
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
Circuit form of Poseidon2 permutation from https://eprint.iacr.org/2023/323.
Represents a dynamic array of bytes in-circuit.
uint32_t get_witness_index() const
Get the witness index of the current field element.
Definition field.hpp:506
AluTraceBuilder builder
Definition alu.test.cpp:124
numeric::RNG & engine
stdlib::witness_t< Builder > witness_t
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
stdlib::Poseidon2Permutation< Builder > Permutation
void test_poseidon2s_circuit(size_t num_inputs=5)
Test graph description for poseidon2 hash with random inputs.
typename _curve::witness_ct witness_ct
AvmProvingInputs inputs
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:190
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
Definition graph.cpp:14
UltraStaticAnalyzer StaticAnalyzer
Definition graph.hpp:187
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