Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
graph_description_pedersen.test.cpp
Go to the documentation of this file.
10
11using namespace cdg;
12using namespace bb;
13
14namespace {
16}
17
18template <typename Builder> class BoomerangStdlibPedersen : public testing::Test {
20
22 using fr_ct = typename _curve::ScalarField;
26
27 public:
29 {
30 if constexpr (IsMegaBuilder<Builder>) {
32 auto res = tool.analyze_circuit();
33 auto cc = res.first;
34 auto variables_in_one_gate = res.second;
35 EXPECT_EQ(cc.size(), 1);
36 EXPECT_EQ(variables_in_one_gate.size(), 0);
37 if (variables_in_one_gate.size() > 0) {
38 auto first_element =
39 std::vector<uint32_t>(variables_in_one_gate.begin(), variables_in_one_gate.end())[0];
40 tool.print_variable_info(first_element);
41 }
42 }
43 if constexpr (IsUltraBuilder<Builder>) {
45 auto res = tool.analyze_circuit();
46 auto cc = res.first;
47 auto variables_in_one_gate = res.second;
48 EXPECT_EQ(cc.size(), 1);
49 EXPECT_EQ(variables_in_one_gate.size(), 0);
50 if (variables_in_one_gate.size() > 0) {
51 auto first_element =
52 std::vector<uint32_t>(variables_in_one_gate.begin(), variables_in_one_gate.end())[0];
53 tool.print_variable_info(first_element);
54 }
55 }
56 }
57 static void test_pedersen_two()
58 {
60
61 fr left_in = fr::random_element();
62 fr right_in = fr::random_element();
63
64 // ensure left has skew 1, right has skew 0
65 if ((left_in.from_montgomery_form().data[0] & 1) == 1) {
66 left_in += fr::one();
67 }
68 if ((right_in.from_montgomery_form().data[0] & 1) == 0) {
69 right_in += fr::one();
70 }
71
72 fr_ct left = public_witness_ct(&builder, left_in);
73 fr_ct right = witness_ct(&builder, right_in);
74
75 builder.fix_witness(left.witness_index, left.get_value());
76 builder.fix_witness(right.witness_index, right.get_value());
77
78 fr_ct out = pedersen_hash::hash({ left, right });
79 out.fix_witness();
80
82 }
83
84 static void test_pedersen_large()
85 {
87 fr left_in = fr::random_element();
88 fr right_in = fr::random_element();
89 // ensure left has skew 1, right has skew 0
90 if ((left_in.from_montgomery_form().data[0] & 1) == 1) {
91 left_in += fr::one();
92 }
93 if ((right_in.from_montgomery_form().data[0] & 1) == 0) {
94 right_in += fr::one();
95 }
96 fr_ct left = witness_ct(&builder, left_in);
97 builder.update_used_witnesses(left.witness_index);
98 fr_ct right = witness_ct(&builder, right_in);
99 for (size_t i = 0; i < 256; ++i) {
100 left = pedersen_hash::hash({ left, right });
101 }
102 left.fix_witness();
103 builder.set_public_input(left.witness_index);
104 bool result = CircuitChecker::check(builder);
105 EXPECT_EQ(result, true);
107 }
108
109 static void test_hash_eight()
110 {
112
114 inputs.reserve(8);
116
117 for (size_t i = 0; i < 8; ++i) {
118 inputs.emplace_back(bb::fr::random_element());
119 witness_inputs.emplace_back(witness_ct(&builder, inputs[i]));
120 }
121 std::vector<uint32_t> witness_indices;
122 for (auto& wi : witness_inputs) {
123 witness_indices.emplace_back(wi.witness_index);
124 }
125 // In a test we don't have additional constraints except for constraint for splitting inputs on 2 scalars for
126 // batch_mul and checking linear_identity. So we can put them into used_witnesses.
127 builder.update_used_witnesses(witness_indices);
128 constexpr size_t hash_idx = 10;
129 auto result = pedersen_hash::hash(witness_inputs, hash_idx);
130 result.fix_witness();
132 }
133
134 static void test_multi_hash()
135 {
137
138 for (size_t i = 0; i < 7; ++i) {
139 std::vector<fr> inputs;
140 inputs.push_back(bb::fr::random_element());
141 inputs.push_back(bb::fr::random_element());
142 inputs.push_back(bb::fr::random_element());
143 inputs.push_back(bb::fr::random_element());
144
145 if (i == 1) {
146 inputs[0] = fr(0);
147 }
148 if (i == 2) {
149 inputs[1] = fr(0);
150 inputs[2] = fr(0);
151 }
152 if (i == 3) {
153 inputs[3] = fr(0);
154 }
155 if (i == 4) {
156 inputs[0] = fr(0);
157 inputs[3] = fr(0);
158 }
159 if (i == 5) {
160 inputs[0] = fr(0);
161 inputs[1] = fr(0);
162 inputs[2] = fr(0);
163 inputs[3] = fr(0);
164 }
165 if (i == 6) {
166 inputs[1] = fr(1);
167 }
168 std::vector<fr_ct> witnesses;
169 for (auto input : inputs) {
170 witnesses.push_back(witness_ct(&builder, input));
171 }
172 // In a test we don't have additional constraints except for constraint for splitting inputs on 2 scalars
173 // for batch_mul and checking linear_identity. So we can put them into used_witnesses.
174 for (auto wit : witnesses) {
175 builder.update_used_witnesses(wit.witness_index);
176 }
177 fr_ct result = pedersen_hash::hash(witnesses);
178 result.fix_witness();
179 }
181 }
182
183 static void test_large_inputs()
184 {
186 std::vector<fr> native_inputs;
187 std::vector<fr_ct> witness_inputs;
188
189 constexpr size_t size = 200;
190 for (size_t i = 0; i < size; ++i) {
191 native_inputs.push_back(fr::random_element());
192 witness_inputs.push_back(witness_ct(&builder, native_inputs.back()));
193 }
194 // In a test we don't have additional constraints except for constraint for splitting inputs on 2 scalars for
195 // batch_mul and checking linear_identity. So we can put them into used_witnesses.
196 for (auto wi : witness_inputs) {
197 builder.update_used_witnesses(wi.witness_index);
198 }
199 auto result = pedersen_hash::hash(witness_inputs);
200 result.fix_witness();
202 }
203};
204
205using CircuitTypes = testing::Types<bb::UltraCircuitBuilder, bb::MegaCircuitBuilder>;
206
208
210{
211 TestFixture::test_pedersen_two();
212}
213
215{
216 TestFixture::test_pedersen_large();
217}
218
220{
221 TestFixture::test_hash_eight();
222}
223
225{
226 TestFixture::test_large_inputs();
227}
228
230{
231 TestFixture::test_multi_hash();
232}
static void analyze_circuit(Builder &builder)
typename _curve::byte_array_ct byte_array_ct
typename _curve::witness_ct witness_ct
typename stdlib::pedersen_hash< Builder > pedersen_hash
typename _curve::public_witness_ct public_witness_ct
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
Definition field.cpp:829
uint32_t witness_index
Definition field.hpp:132
stdlib class that evaluates in-circuit pedersen hashes, consistent with behavior in crypto::pedersen_...
Definition pedersen.hpp:23
std::pair< std::vector< ConnectedComponent >, std::unordered_set< uint32_t > > analyze_circuit()
Definition graph.cpp:1659
void print_variable_info(const uint32_t real_idx)
this method prints all information about gates where variable was found
Definition graph.cpp:1620
AluTraceBuilder builder
Definition alu.test.cpp:123
TYPED_TEST(BoomerangStdlibPedersen, Small)
testing::Types< bb::UltraCircuitBuilder, bb::MegaCircuitBuilder > CircuitTypes
TYPED_TEST_SUITE(BoomerangStdlibPedersen, CircuitTypes)
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:190
Entry point for Barretenberg command-line interface.
field< Bn254FrParams > fr
Definition fr.hpp:174
Definition graph.cpp:12
StaticAnalyzer_< bb::fr, bb::MegaCircuitBuilder > MegaStaticAnalyzer
Definition graph.hpp:183
UltraStaticAnalyzer StaticAnalyzer
Definition graph.hpp:184
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static constexpr field one()
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field from_montgomery_form() const noexcept
field_t< CircuitBuilder > ScalarField
Definition bn254.hpp:33
byte_array< CircuitBuilder > byte_array_ct
Definition bn254.hpp:43
public_witness_t< CircuitBuilder > public_witness_ct
Definition bn254.hpp:42
witness_t< CircuitBuilder > witness_ct
Definition bn254.hpp:41