17template <
typename Builder>
class StdlibPedersen :
public testing::Test {
50 fr_ct out = pedersen_hash::hash({ left, right });
55 check_circuit_and_gate_count(
builder, 2897);
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 });
80 EXPECT_EQ(
bool(out_1_with_zero.
get_value() == out_1_with_r.get_value()),
true);
88 EXPECT_EQ(out_1_with_zero.
get_value(), hash_native_1_with_zero);
89 EXPECT_EQ(out_1_with_r.get_value(), hash_native_1_with_r);
90 EXPECT_EQ(out_2.get_value(), hash_native_2);
91 EXPECT_EQ(out_with_zero.get_value(), hash_native_with_zero);
92 EXPECT_EQ(out_with_r.get_value(), hash_native_with_r);
93 EXPECT_EQ(hash_native_with_zero, hash_native_with_r);
95 check_circuit_and_gate_count(
builder, 3482);
114 for (
size_t i = 0; i < 256; ++i) {
115 left = pedersen_hash::hash({ left, right });
120 check_circuit_and_gate_count(
builder, 40379);
127 for (
size_t i = 0; i < 7; ++i) {
128 std::vector<fr> inputs;
158 for (
auto input : inputs) {
164 fr_ct result = pedersen_hash::hash(witnesses);
171 check_circuit_and_gate_count(
builder, 9724);
173 check_circuit_and_gate_count(
builder, 9721);
185 for (
size_t i = 0; i < 8; ++i) {
190 constexpr size_t hash_idx = 10;
192 auto result = pedersen_hash::hash(witness_inputs, hash_idx);
194 EXPECT_EQ(result.get_value(), expected);
199 check_circuit_and_gate_count(
builder, 5417);
201 check_circuit_and_gate_count(
builder, 5414);
209 std::vector<fr> inputs;
212 for (
size_t i = 0; i < 8; ++i) {
222 auto result = pedersen_hash::hash(witness_inputs);
224 EXPECT_EQ(result.get_value(), expected);
229 check_circuit_and_gate_count(
builder, 3997);
231 check_circuit_and_gate_count(
builder, 3994);
238 std::vector<fr> empty_inputs_native;
242 auto stdlib_result = pedersen_hash::hash(empty_inputs);
244 EXPECT_EQ(stdlib_result.get_value(),
fr::zero());
250 check_circuit_and_gate_count(
builder, 0);
260 auto result = pedersen_hash::hash({ witness });
263 EXPECT_EQ(result.get_value(), expected);
265 check_circuit_and_gate_count(
builder, 2823);
271 std::vector<fr> native_inputs;
274 constexpr size_t size = 200;
275 for (
size_t i = 0; i < size; ++i) {
280 auto result = pedersen_hash::hash(witness_inputs);
283 EXPECT_EQ(result.get_value(), expected);
288 check_circuit_and_gate_count(
builder, 62376);
290 check_circuit_and_gate_count(
builder, 62373);
300 std::vector<fr> inputs;
303 for (
size_t i = 0; i < 5; ++i) {
310 for (
size_t hash_idx : { size_t(0), size_t(1), size_t(10), size_t(100), size_t(1000) }) {
312 GeneratorContext ctx{ hash_idx };
313 auto result = pedersen_hash::hash(witness_inputs, ctx);
316 EXPECT_EQ(result.get_value(), expected);
320 auto result_offset_0 = pedersen_hash::hash(witness_inputs, 0);
321 auto result_offset_1 = pedersen_hash::hash(witness_inputs, 1);
322 EXPECT_NE(result_offset_0.get_value(), result_offset_1.get_value());
326 GeneratorContext ctx_domain_a(0,
"domain_a");
327 GeneratorContext ctx_domain_b(0,
"domain_b");
328 GeneratorContext ctx_default(0);
330 auto result_domain_a = pedersen_hash::hash(witness_inputs, ctx_domain_a);
331 auto result_domain_b = pedersen_hash::hash(witness_inputs, ctx_domain_b);
332 auto result_default = pedersen_hash::hash(witness_inputs, ctx_default);
339 EXPECT_EQ(result_domain_a.get_value(), expected_domain_a);
340 EXPECT_EQ(result_domain_b.get_value(), expected_domain_b);
341 EXPECT_EQ(result_default.get_value(), expected_default);
344 EXPECT_NE(result_domain_a.get_value(), result_domain_b.get_value());
345 EXPECT_NE(result_domain_a.get_value(), result_default.get_value());
346 EXPECT_NE(result_domain_b.get_value(), result_default.get_value());
349 GeneratorContext ctx_offset_10(10,
"domain_test");
350 GeneratorContext ctx_offset_20(20,
"domain_test");
352 auto result_offset_10 = pedersen_hash::hash(witness_inputs, ctx_offset_10);
353 auto result_offset_20 = pedersen_hash::hash(witness_inputs, ctx_offset_20);
356 EXPECT_NE(result_offset_10.get_value(), result_offset_20.get_value());
361 check_circuit_and_gate_count(
builder, 21845);
363 check_circuit_and_gate_count(
builder, 21842);
371 std::vector<fr> inputs;
374 for (
size_t i = 0; i < 5; ++i) {
380 auto result1 = pedersen_hash::hash(witness_inputs);
381 auto result2 = pedersen_hash::hash(witness_inputs);
382 auto result3 = pedersen_hash::hash(witness_inputs);
385 EXPECT_EQ(result1.get_value(), result2.get_value());
386 EXPECT_EQ(result2.get_value(), result3.get_value());
390 EXPECT_EQ(result1.get_value(), expected);
395 check_circuit_and_gate_count(
builder, 6645);
397 check_circuit_and_gate_count(
builder, 6642);
402using CircuitTypes = testing::Types<bb::UltraCircuitBuilder, bb::MegaCircuitBuilder>;
413 const size_t num_inputs = 10;
416 std::vector<fr> inputs_native;
418 for (
size_t i = 0; i < num_inputs; ++i) {
420 inputs_native.emplace_back(element);
427 EXPECT_EQ(result.get_value(), expected);
432 check_circuit_and_gate_count(
builder, 5565);
434 check_circuit_and_gate_count(
builder, 5562);
440 TestFixture::test_pedersen_two();
445 TestFixture::test_pedersen_edge_cases();
450 TestFixture::test_pedersen_large();
455 TestFixture::test_multi_hash();
460 TestFixture::test_hash_eight();
465 TestFixture::test_hash_constants();
470 TestFixture::test_empty_input();
475 TestFixture::test_single_input();
480 TestFixture::test_large_inputs();
485 TestFixture::test_generator_contexts();
490 TestFixture::test_determinism();
static void test_pedersen_two()
static void test_pedersen_edge_cases()
typename stdlib::cycle_group< Builder > cycle_group
static void test_single_input()
typename _curve::witness_ct witness_ct
static void test_large_inputs()
static void test_hash_eight()
static void test_hash_constants()
static void test_empty_input()
typename _curve::ScalarField fr_ct
static void test_pedersen_large()
typename _curve::public_witness_ct public_witness_ct
typename stdlib::pedersen_hash< Builder > pedersen_hash
static void test_determinism()
static void test_generator_contexts()
static void test_multi_hash()
typename _curve::byte_array_ct byte_array_ct
static Fq hash(const std::vector< Fq > &inputs, GeneratorContext context={})
Given a vector of fields, generate a pedersen hash using generators from context.
cycle_group represents a group Element of the proving system's embedded curve, i.e....
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
stdlib class that evaluates in-circuit pedersen hashes, consistent with behavior in crypto::pedersen_...
static field_ct hash(const std::vector< field_ct > &in, GeneratorContext context={})
Computes a pedersen hash of the provided inputs.
ECCVMCircuitBuilder Builder
bn254::witness_ct witness_ct
stdlib::field_t< Builder > field_ct
testing::Types< bb::UltraCircuitBuilder, bb::MegaCircuitBuilder > CircuitTypes
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
void check_circuit_and_gate_count(Builder &builder, uint32_t expected_gates_without_base)
Utility function for gate count checking and circuit verification.
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
field< Bn254FrParams > fr
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
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
byte_array< CircuitBuilder > byte_array_ct
public_witness_t< CircuitBuilder > public_witness_ct
witness_t< CircuitBuilder > witness_ct
#define HEAVY_TYPED_TEST(x, y)