barretenberg
Loading...
Searching...
No Matches
hash.hpp
1#pragma once
2#include "barretenberg/common/net.hpp"
3#include "barretenberg/crypto/blake2s/blake2s.hpp"
4#include "barretenberg/crypto/pedersen_commitment/pedersen.hpp"
5#include "barretenberg/crypto/pedersen_hash/pedersen.hpp"
6#include "barretenberg/stdlib/hash/blake2s/blake2s.hpp"
7#include "barretenberg/stdlib/hash/pedersen/pedersen.hpp"
8#include "barretenberg/stdlib/primitives/field/field.hpp"
9#include <vector>
10
11namespace proof_system::plonk::stdlib::merkle_tree {
12
13inline barretenberg::fr hash_pair_native(barretenberg::fr const& lhs, barretenberg::fr const& rhs)
14{
15 return crypto::pedersen_hash::hash({ lhs, rhs }); // uses lookup tables
16}
17
18inline barretenberg::fr hash_native(std::vector<barretenberg::fr> const& inputs)
19{
20 return crypto::pedersen_hash::hash(inputs); // uses lookup tables
21}
22
29inline barretenberg::fr compute_tree_root_native(std::vector<barretenberg::fr> const& input)
30{
31 // Check if the input vector size is a power of 2.
32 ASSERT(input.size() > 0);
33 ASSERT(numeric::is_power_of_two(input.size()));
34 auto layer = input;
35 while (layer.size() > 1) {
36 std::vector<barretenberg::fr> next_layer(layer.size() / 2);
37 for (size_t i = 0; i < next_layer.size(); ++i) {
38 next_layer[i] = crypto::pedersen_hash::hash({ layer[i * 2], layer[i * 2 + 1] });
39 }
40 layer = std::move(next_layer);
41 }
42
43 return layer[0];
44}
45
46// TODO write test
47inline std::vector<barretenberg::fr> compute_tree_native(std::vector<barretenberg::fr> const& input)
48{
49 // Check if the input vector size is a power of 2.
50 ASSERT(input.size() > 0);
51 ASSERT(numeric::is_power_of_two(input.size()));
52 auto layer = input;
53 std::vector<barretenberg::fr> tree(input);
54 while (layer.size() > 1) {
55 std::vector<barretenberg::fr> next_layer(layer.size() / 2);
56 for (size_t i = 0; i < next_layer.size(); ++i) {
57 next_layer[i] = crypto::pedersen_hash::hash({ layer[i * 2], layer[i * 2 + 1] });
58 tree.push_back(next_layer[i]);
59 }
60 layer = std::move(next_layer);
61 }
62
63 return tree;
64}
65
66} // namespace proof_system::plonk::stdlib::merkle_tree
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:59