Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
pedersen.test.cpp
Go to the documentation of this file.
8#include "pedersen.hpp"
9
10using namespace bb;
11namespace {
13}
14
15template <typename Builder> class StdlibPedersen : public testing::Test {
17
19 using fr_ct = typename _curve::ScalarField;
23
24 public:
25 static void test_pedersen()
26 {
27
29
30 fr left_in = fr::random_element();
31 fr right_in = fr::random_element();
32
33 // ensure left has skew 1, right has skew 0
34 if ((left_in.from_montgomery_form().data[0] & 1) == 1) {
35 left_in += fr::one();
36 }
37 if ((right_in.from_montgomery_form().data[0] & 1) == 0) {
38 right_in += fr::one();
39 }
40
41 fr_ct left = public_witness_ct(&builder, left_in);
42 fr_ct right = witness_ct(&builder, right_in);
43
44 builder.fix_witness(left.witness_index, left.get_value());
45 builder.fix_witness(right.witness_index, right.get_value());
46
47 fr_ct out = pedersen_hash::hash({ left, right });
48
49 info("num gates = ", builder.get_estimated_num_finalized_gates());
50
51 bool result = CircuitChecker::check(builder);
52 EXPECT_EQ(result, true);
53
54 fr hash_native = crypto::pedersen_hash::hash({ left.get_value(), right.get_value() });
55 EXPECT_EQ(out.get_value(), hash_native);
56 }
57
59 {
61
62 fr zero_fr = fr::zero();
63 fr one_fr = fr::one();
64 fr r_minus_one_fr = fr::modulus - 1;
65 fr r_minus_two_fr = fr::modulus - 2;
66 fr r_fr = fr::modulus;
67
68 fr_ct zero = witness_ct(&builder, zero_fr);
69 fr_ct one = witness_ct(&builder, one_fr);
70 fr_ct r_minus_one = witness_ct(&builder, r_minus_one_fr);
71 fr_ct r_minus_two = witness_ct(&builder, r_minus_two_fr);
72 fr_ct r = witness_ct(&builder, r_fr);
73
74 fr_ct out_1_with_zero = pedersen_hash::hash({ zero, one });
75 fr_ct out_1_with_r = pedersen_hash::hash({ r, one });
76 fr_ct out_2 = pedersen_hash::hash({ r_minus_one, r_minus_two });
77 fr_ct out_with_zero = pedersen_hash::hash({ out_1_with_zero, out_2 });
78 fr_ct out_with_r = pedersen_hash::hash({ out_1_with_r, out_2 });
79
80 info("num gates = ", builder.get_estimated_num_finalized_gates());
81
82 bool result = CircuitChecker::check(builder);
83 EXPECT_EQ(result, true);
84
85 EXPECT_EQ(bool(out_1_with_zero.get_value() == out_1_with_r.get_value()), true);
86
87 fr hash_native_1_with_zero = crypto::pedersen_hash::hash({ zero.get_value(), one.get_value() });
88 fr hash_native_1_with_r = crypto::pedersen_hash::hash({ r.get_value(), one.get_value() });
89 fr hash_native_2 = crypto::pedersen_hash::hash({ r_minus_one.get_value(), r_minus_two.get_value() });
90 fr hash_native_with_zero = crypto::pedersen_hash::hash({ out_1_with_zero.get_value(), out_2.get_value() });
91 fr hash_native_with_r = crypto::pedersen_hash::hash({ out_1_with_r.get_value(), out_2.get_value() });
92
93 EXPECT_EQ(out_1_with_zero.get_value(), hash_native_1_with_zero);
94 EXPECT_EQ(out_1_with_r.get_value(), hash_native_1_with_r);
95 EXPECT_EQ(out_2.get_value(), hash_native_2);
96 EXPECT_EQ(out_with_zero.get_value(), hash_native_with_zero);
97 EXPECT_EQ(out_with_r.get_value(), hash_native_with_r);
98 EXPECT_EQ(hash_native_with_zero, hash_native_with_r);
99 }
100
102 {
104
105 fr left_in = fr::random_element();
106 fr right_in = fr::random_element();
107 // ensure left has skew 1, right has skew 0
108 if ((left_in.from_montgomery_form().data[0] & 1) == 1) {
109 left_in += fr::one();
110 }
111 if ((right_in.from_montgomery_form().data[0] & 1) == 0) {
112 right_in += fr::one();
113 }
114 fr_ct left = witness_ct(&builder, left_in);
115 fr_ct right = witness_ct(&builder, right_in);
116
117 for (size_t i = 0; i < 256; ++i) {
118 left = pedersen_hash::hash({ left, right });
119 }
120
121 builder.set_public_input(left.witness_index);
122
123 info("num gates = ", builder.get_estimated_num_finalized_gates());
124
125 bool result = CircuitChecker::check(builder);
126 EXPECT_EQ(result, true);
127 }
128
130 {
131 const size_t num_input_bytes = 351;
132
134
135 std::vector<uint8_t> input;
136 input.reserve(num_input_bytes);
137 for (size_t i = 0; i < num_input_bytes; ++i) {
138 input.push_back(engine.get_random_uint8());
139 }
140
141 fr expected = crypto::pedersen_hash::hash_buffer(input);
142
143 byte_array_ct circuit_input(&builder, input);
144 auto result = pedersen_hash::hash_buffer(circuit_input);
145
146 EXPECT_EQ(result.get_value(), expected);
147
148 info("num gates = ", builder.get_estimated_num_finalized_gates());
149
150 bool proof_result = CircuitChecker::check(builder);
151 EXPECT_EQ(proof_result, true);
152 }
153
154 static void test_multi_hash()
155 {
157
158 for (size_t i = 0; i < 7; ++i) {
159 std::vector<fr> inputs;
160 inputs.push_back(bb::fr::random_element());
161 inputs.push_back(bb::fr::random_element());
162 inputs.push_back(bb::fr::random_element());
163 inputs.push_back(bb::fr::random_element());
164
165 if (i == 1) {
166 inputs[0] = fr(0);
167 }
168 if (i == 2) {
169 inputs[1] = fr(0);
170 inputs[2] = fr(0);
171 }
172 if (i == 3) {
173 inputs[3] = fr(0);
174 }
175 if (i == 4) {
176 inputs[0] = fr(0);
177 inputs[3] = fr(0);
178 }
179 if (i == 5) {
180 inputs[0] = fr(0);
181 inputs[1] = fr(0);
182 inputs[2] = fr(0);
183 inputs[3] = fr(0);
184 }
185 if (i == 6) {
186 inputs[1] = fr(1);
187 }
188 std::vector<fr_ct> witnesses;
189 for (auto input : inputs) {
190 witnesses.push_back(witness_ct(&builder, input));
191 }
192
193 fr expected = crypto::pedersen_hash::hash(inputs);
194
195 fr_ct result = pedersen_hash::hash(witnesses);
196 EXPECT_EQ(result.get_value(), expected);
197 }
198
199 info("num gates = ", builder.get_estimated_num_finalized_gates());
200
201 bool proof_result = CircuitChecker::check(builder);
202 EXPECT_EQ(proof_result, true);
203 }
204
205 static void test_hash_eight()
206 {
208
210 inputs.reserve(8);
212
213 for (size_t i = 0; i < 8; ++i) {
214 inputs.emplace_back(bb::fr::random_element());
215 witness_inputs.emplace_back(witness_ct(&builder, inputs[i]));
216 }
217
218 constexpr size_t hash_idx = 10;
219 grumpkin::fq expected = crypto::pedersen_hash::hash(inputs, hash_idx);
220 auto result = pedersen_hash::hash(witness_inputs, hash_idx);
221
222 EXPECT_EQ(result.get_value(), expected);
223 }
224
226 {
228
229 std::vector<fr> inputs;
231
232 for (size_t i = 0; i < 8; ++i) {
233 inputs.push_back(bb::fr::random_element());
234 if (i % 2 == 1) {
235 witness_inputs.push_back(witness_ct(&builder, inputs[i]));
236 } else {
237 witness_inputs.push_back(fr_ct(&builder, inputs[i]));
238 }
239 }
240
241 fr expected = crypto::pedersen_hash::hash(inputs);
242 auto result = pedersen_hash::hash(witness_inputs);
243
244 EXPECT_EQ(result.get_value(), expected);
245 }
246};
247
248using CircuitTypes = testing::Types<bb::UltraCircuitBuilder>;
249
251
253{
254 using Builder = TypeParam;
257 auto builder = Builder();
258
259 const size_t num_inputs = 10;
260
262 std::vector<fr> inputs_native;
263
264 for (size_t i = 0; i < num_inputs; ++i) {
265 const auto element = fr::random_element(&engine);
266 inputs_native.emplace_back(element);
267 inputs.emplace_back(field_ct(witness_ct(&builder, element)));
268 }
269
270 auto result = stdlib::pedersen_hash<Builder>::hash(inputs);
271 auto expected = crypto::pedersen_hash::hash(inputs_native);
272
273 EXPECT_EQ(result.get_value(), expected);
274
275 bool proof_result = CircuitChecker::check(builder);
276 EXPECT_EQ(proof_result, true);
277}
278
280{
281 TestFixture::test_pedersen();
282};
283
285{
286 TestFixture::test_pedersen_edge_cases();
287};
288
290{
291 TestFixture::test_pedersen_large();
292};
293
295{
296 TestFixture::test_hash_byte_array();
297};
298
300{
301 TestFixture::test_multi_hash();
302};
303
305{
306 TestFixture::test_hash_eight();
307};
308
310{
311 TestFixture::test_hash_constants();
312};
static void test_pedersen_edge_cases()
typename _curve::witness_ct witness_ct
static void test_hash_eight()
static void test_hash_constants()
typename _curve::ScalarField fr_ct
static void test_hash_byte_array()
static void test_pedersen_large()
typename _curve::public_witness_ct public_witness_ct
typename stdlib::pedersen_hash< Builder > pedersen_hash
static void test_multi_hash()
typename _curve::byte_array_ct byte_array_ct
static void test_pedersen()
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
static Fq hash_buffer(const std::vector< uint8_t > &input, GeneratorContext context={})
Given an arbitrary length of bytes, convert them to fields and hash the result using the default gene...
Definition pedersen.cpp:88
static Fq hash(const std::vector< Fq > &inputs, GeneratorContext context={})
Given a vector of fields, generate a pedersen hash using generators from context.
Definition pedersen.cpp:78
virtual uint8_t get_random_uint8()=0
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
Definition field.cpp:827
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
static field_ct hash(const std::vector< field_ct > &in, GeneratorContext context={})
Definition pedersen.cpp:15
void info(Args... args)
Definition log.hpp:70
AluTraceBuilder builder
Definition alu.test.cpp:123
ECCVMCircuitBuilder Builder
numeric::RNG & engine
bn254::witness_ct witness_ct
stdlib::field_t< Builder > field_ct
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:190
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
field< Bn254FrParams > fr
Definition fr.hpp:174
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
testing::Types< bb::UltraCircuitBuilder > CircuitTypes
static constexpr field one()
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field from_montgomery_form() const noexcept
static constexpr field zero()
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
#define HEAVY_TYPED_TEST(x, y)
Definition test.hpp:11