barretenberg
Loading...
Searching...
No Matches
fixed_base.hpp
1#pragma once
2
3#include "../types.hpp"
4#include "./fixed_base_params.hpp"
5#include "barretenberg/crypto/generators/generator_data.hpp"
6#include "barretenberg/crypto/pedersen_hash/pedersen.hpp"
7#include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp"
8
9namespace plookup::fixed_base {
10
15class table : public FixedBaseParams {
16 public:
19 using single_lookup_table = std::vector<affine_element>;
20 using fixed_base_scalar_mul_tables = std::vector<single_lookup_table>;
21 using all_multi_tables = std::array<fixed_base_scalar_mul_tables, NUM_FIXED_BASE_MULTI_TABLES>;
22
23 static constexpr affine_element LHS_GENERATOR_POINT =
25
26 static constexpr affine_element RHS_GENERATOR_POINT =
28
29 static inline single_lookup_table generate_single_lookup_table(const affine_element& base_point,
30 const affine_element& offset_generator);
31 template <size_t num_bits> static fixed_base_scalar_mul_tables generate_tables(const affine_element& input);
32
33 template <size_t num_table_bits> static affine_element generate_generator_offset(const affine_element& input);
34
35 static constexpr uint256_t MAX_LO_SCALAR = uint256_t(1) << BITS_PER_LO_SCALAR;
36 // We split each scalar mulitplier into BITS_PER_LO_SCALAR, BITS_PER_HI_SCALAR chunks and perform 2 scalar muls of
37 // size BITS_PER_LO_SCALAR, BITS_PER_HI_SCALAR (see fixed_base_params.hpp for more details)
38 // i.e. we treat 1 scalar mul as two independent scalar muls over (roughly) half-width input scalars.
39 // The base_point members describe the fixed-base points that correspond to the two independent scalar muls,
40 // for our two supported points
41 inline static const affine_element lhs_base_point_lo = LHS_GENERATOR_POINT;
42 inline static const affine_element lhs_base_point_hi = element(lhs_base_point_lo) * MAX_LO_SCALAR;
43 inline static const affine_element rhs_base_point_lo = RHS_GENERATOR_POINT;
44 inline static const affine_element rhs_base_point_hi = element(rhs_base_point_lo) * MAX_LO_SCALAR;
45
46 // fixed_base_tables = lookup tables of precomputed base points required for our lookup arguments.
47 // N.B. these "tables" are not plookup tables, just regular ol' software lookup tables.
48 // Used to build the proper plookup table and in the `BasicTable::get_values_from_key` method
49 static const all_multi_tables fixed_base_tables;
50
66 static const std::array<affine_element, table::NUM_FIXED_BASE_MULTI_TABLES> fixed_base_table_offset_generators;
67
68 static bool lookup_table_exists_for_point(const affine_element& input);
69 static std::optional<std::array<MultiTableId, 2>> get_lookup_table_ids_for_point(const affine_element& input);
70 static std::optional<affine_element> get_generator_offset_for_table_id(MultiTableId table_id);
71
72 template <size_t multitable_index>
73 static BasicTable generate_basic_fixed_base_table(BasicTableId id, size_t basic_table_index, size_t table_index);
74 template <size_t multitable_index, size_t num_bits> static MultiTable get_fixed_base_table(MultiTableId id);
75
76 template <size_t multitable_index, size_t table_index>
77 static std::array<barretenberg::fr, 2> get_basic_fixed_base_table_values(const std::array<uint64_t, 2> key)
78 {
79 static_assert(multitable_index < NUM_FIXED_BASE_MULTI_TABLES);
80 static_assert(table_index < get_num_bits_of_multi_table(multitable_index));
81 const auto& basic_table = fixed_base_tables[multitable_index][table_index];
82 const auto index = static_cast<size_t>(key[0]);
83 return { basic_table[index].x, basic_table[index].y };
84 }
85};
86
87extern template table::affine_element table::generate_generator_offset<table::BITS_PER_LO_SCALAR>(
88 const table::affine_element&);
89extern template table::affine_element table::generate_generator_offset<table::BITS_PER_HI_SCALAR>(
90 const table::affine_element&);
91extern template table::fixed_base_scalar_mul_tables table::generate_tables<table::BITS_PER_LO_SCALAR>(
92 const table::affine_element&);
93extern template table::fixed_base_scalar_mul_tables table::generate_tables<table::BITS_PER_HI_SCALAR>(
94 const table::affine_element&);
95
96extern template BasicTable table::generate_basic_fixed_base_table<0>(BasicTableId, size_t, size_t);
97extern template BasicTable table::generate_basic_fixed_base_table<1>(BasicTableId, size_t, size_t);
98extern template BasicTable table::generate_basic_fixed_base_table<2>(BasicTableId, size_t, size_t);
99extern template BasicTable table::generate_basic_fixed_base_table<3>(BasicTableId, size_t, size_t);
100extern template MultiTable table::get_fixed_base_table<0, table::BITS_PER_LO_SCALAR>(MultiTableId);
101extern template MultiTable table::get_fixed_base_table<1, table::BITS_PER_HI_SCALAR>(MultiTableId);
102extern template MultiTable table::get_fixed_base_table<2, table::BITS_PER_LO_SCALAR>(MultiTableId);
103extern template MultiTable table::get_fixed_base_table<3, table::BITS_PER_HI_SCALAR>(MultiTableId);
104
105} // namespace plookup::fixed_base
Definition: affine_element.hpp:11
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
Definition: element.hpp:27
class that stores precomputed generators used for Pedersen commitments and Pedersen hashes
Definition: generator_data.hpp:40
Definition: uint256.hpp:25
Generates plookup tables required to perform fixed-base scalar multiplication over a fixed number of ...
Definition: fixed_base.hpp:15
static single_lookup_table generate_single_lookup_table(const affine_element &base_point, const affine_element &offset_generator)
Given a base_point [P] and an offset_generator [G], compute a lookup table of MAX_TABLE_SIZE that con...
Definition: fixed_base.cpp:21
static fixed_base_scalar_mul_tables generate_tables(const affine_element &input)
For a given base point [P], compute the lookup tables required to traverse a num_bits sized lookup.
Definition: fixed_base.cpp:51
static bool lookup_table_exists_for_point(const affine_element &input)
Given a point, do we have a precomputed lookup table for this point?
Definition: fixed_base.cpp:106
static BasicTable generate_basic_fixed_base_table(BasicTableId id, size_t basic_table_index, size_t table_index)
Generate a single fixed-base-scalar-mul plookup table.
Definition: fixed_base.cpp:186
static std::optional< std::array< MultiTableId, 2 > > get_lookup_table_ids_for_point(const affine_element &input)
Given a point, return (if it exists) the 2 MultiTableId's that correspond to the LO_SCALAR,...
Definition: fixed_base.cpp:118
static const std::array< affine_element, table::NUM_FIXED_BASE_MULTI_TABLES > fixed_base_table_offset_generators
offset generators!
Definition: fixed_base.hpp:66
static MultiTable get_fixed_base_table(MultiTableId id)
Generate a multi-table that describes the lookups required to cover a fixed-base-scalar-mul of num_bi...
Definition: fixed_base.cpp:231
static std::optional< affine_element > get_generator_offset_for_table_id(MultiTableId table_id)
Given a table id, return the offset generator term that will be present in the final scalar mul outpu...
Definition: fixed_base.cpp:138
The structure contains the most basic table serving one function (for, example an xor table)
Definition: types.hpp:263
Parameters definitions for our fixed-base-scalar-multiplication lookup tables.
Definition: fixed_base_params.hpp:14
static constexpr size_t get_num_bits_of_multi_table(const size_t multitable_index)
For a given multitable index, how many scalar mul bits are we traversing with our multitable?
Definition: fixed_base_params.hpp:67
Definition: types.hpp:124