3#include "barretenberg/common/container.hpp"
4#include "barretenberg/ecc/curves/bn254/bn254.hpp"
5#include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp"
42 using Group =
typename Curve::Group;
43 using AffineElement =
typename Curve::AffineElement;
44 using GeneratorList = std::vector<AffineElement>;
45 using GeneratorView = std::span<AffineElement const>;
46 static inline constexpr size_t DEFAULT_NUM_GENERATORS = 8;
47 static inline constexpr std::string_view DEFAULT_DOMAIN_SEPARATOR =
"DEFAULT_DOMAIN_SEPARATOR";
50 static inline constexpr std::array<AffineElement, DEFAULT_NUM_GENERATORS> make_precomputed_generators()
52 std::array<AffineElement, DEFAULT_NUM_GENERATORS> output;
53 std::vector<AffineElement> res = Group::derive_generators(DEFAULT_DOMAIN_SEPARATOR, DEFAULT_NUM_GENERATORS, 0);
54 std::copy(res.begin(), res.end(), output.begin());
63 make_precomputed_generators();
65 [[nodiscard]]
inline GeneratorView get(
const size_t num_generators,
66 const size_t generator_offset = 0,
67 const std::string_view domain_separator = DEFAULT_DOMAIN_SEPARATOR)
const
69 const bool is_default_domain = domain_separator == DEFAULT_DOMAIN_SEPARATOR;
70 if (is_default_domain && (num_generators + generator_offset) < DEFAULT_NUM_GENERATORS) {
74 if (!generator_map.has_value()) {
75 generator_map = std::map<std::string, GeneratorList>();
77 std::map<std::string, GeneratorList>& map = generator_map.value();
81 if (is_default_domain && !initialized_precomputed_generators) {
82 map.insert({ std::string(DEFAULT_DOMAIN_SEPARATOR),
84 initialized_precomputed_generators =
true;
88 if (!map.contains(std::string(domain_separator))) {
90 std::string(domain_separator),
91 Group::derive_generators(domain_separator, num_generators + generator_offset, 0),
95 GeneratorList& generators = map.at(std::string(domain_separator));
98 if (num_generators + generator_offset > generators.size()) {
99 const size_t num_extra_generators = num_generators + generator_offset - generators.size();
100 GeneratorList extended_generators =
101 Group::derive_generators(domain_separator, num_extra_generators, generators.size());
102 generators.reserve(num_generators + generator_offset);
103 std::copy(extended_generators.begin(), extended_generators.end(), std::back_inserter(generators));
106 return GeneratorView{ generators.data() + generator_offset, num_generators };
111 static inline generator_data* get_default_generators() {
return &default_data; }
115 static inline constinit generator_data default_data = generator_data();
126 mutable bool initialized_precomputed_generators =
false;
130 mutable std::optional<std::map<std::string, GeneratorList>> generator_map = {};
140 : offset(hash_index){};
143 , domain_separator(_domain_separator)
class that stores precomputed generators used for Pedersen commitments and Pedersen hashes
Definition: generator_data.hpp:40
static constexpr std::array< AffineElement, DEFAULT_NUM_GENERATORS > precomputed_generators
Precompute a small number of generators at compile time. For small pedersen commitments + pedersen ha...
Definition: generator_data.hpp:62
Definition: generator_data.hpp:133