Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
fixed_base.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#include "./fixed_base.hpp"
8
16
28 const affine_element& offset_generator)
29{
31
32 element accumulator = offset_generator;
33 for (size_t i = 0; i < MAX_TABLE_SIZE; ++i) {
34 table_raw[i] = accumulator;
35 accumulator += base_point;
36 }
39 for (size_t i = 0; i < table_raw.size(); ++i) {
40 table[i] = affine_element{ table_raw[i].x, table_raw[i].y };
41 }
42 return table;
43}
44
58{
59 constexpr size_t NUM_TABLES = get_num_tables_per_multi_table<num_bits>();
60
62 result.reserve(NUM_TABLES);
63
64 std::vector<uint8_t> input_buf;
65 write(input_buf, input);
66 const auto offset_generators = grumpkin::g1::derive_generators(input_buf, NUM_TABLES);
67
68 grumpkin::g1::element accumulator = input;
69 for (size_t i = 0; i < NUM_TABLES; ++i) {
70 result.emplace_back(generate_single_lookup_table(accumulator, offset_generators[i]));
71 for (size_t j = 0; j < BITS_PER_TABLE; ++j) {
72 accumulator = accumulator.dbl();
73 }
74 }
75 return result;
76}
77
90template <size_t num_table_bits>
92{
93 constexpr size_t NUM_TABLES = get_num_tables_per_multi_table<num_table_bits>();
94
95 std::vector<uint8_t> input_buf;
96 write(input_buf, input);
97 const auto offset_generators = grumpkin::g1::derive_generators(input_buf, NUM_TABLES);
99 for (const auto& gen : offset_generators) {
100 acc += gen;
101 }
102 return acc;
103}
104
113{
114 return (input == lhs_generator_point() || input == rhs_generator_point());
115}
116
125 const grumpkin::g1::affine_element& input)
126{
127 if (input == lhs_generator_point()) {
129 }
130 if (input == rhs_generator_point()) {
132 }
133 return {};
134}
135
145{
146 if (table_id == FIXED_BASE_LEFT_LO) {
148 }
149 if (table_id == FIXED_BASE_LEFT_HI) {
151 }
152 if (table_id == FIXED_BASE_RIGHT_LO) {
154 }
155 if (table_id == FIXED_BASE_RIGHT_HI) {
157 }
158 return std::nullopt;
159}
160
172{
174 bb::constexpr_for<0, table::NUM_FIXED_BASE_MULTI_TABLES, 1>([&]<size_t i>() {
175 bb::constexpr_for<0, table::MAX_NUM_TABLES_IN_MULTITABLE, 1>(
176 [&]<size_t j>() { table[i][j] = &table::get_basic_fixed_base_table_values<i, j>; });
177 });
178 return table;
179};
180
191template <size_t multitable_index>
192BasicTable table::generate_basic_fixed_base_table(BasicTableId id, size_t basic_table_index, size_t table_index)
193{
194 static_assert(multitable_index < NUM_FIXED_BASE_MULTI_TABLES);
196
197 const size_t multitable_bits = get_num_bits_of_multi_table<multitable_index>();
198 const size_t bits_covered_by_previous_tables_in_multitable = BITS_PER_TABLE * table_index;
199 const bool is_small_table = (multitable_bits - bits_covered_by_previous_tables_in_multitable) < BITS_PER_TABLE;
200 const size_t table_bits =
201 is_small_table ? multitable_bits - bits_covered_by_previous_tables_in_multitable : BITS_PER_TABLE;
202 const auto table_size = static_cast<size_t>(1ULL << table_bits);
204 table.id = id;
205 table.table_index = basic_table_index;
206 table.use_twin_keys = false;
207
208 const auto& basic_table = fixed_base_tables()[multitable_index][table_index];
209
210 for (size_t i = 0; i < table_size; ++i) {
211 table.column_1.emplace_back(i);
212 table.column_2.emplace_back(basic_table[i].x);
213 table.column_3.emplace_back(basic_table[i].y);
214 }
215 table.get_values_from_key = nullptr;
216
217 constexpr function_ptr_table get_values_from_key_table = make_function_pointer_table();
218 table.get_values_from_key = get_values_from_key_table[multitable_index][table_index];
219
220 ASSERT(table.get_values_from_key != nullptr);
221 table.column_1_step_size = table_size;
222 table.column_2_step_size = 0;
223 table.column_3_step_size = 0;
224
225 return table;
226}
227
236template <size_t multitable_index, size_t num_bits> MultiTable table::get_fixed_base_table(const MultiTableId id)
237{
238 static_assert(num_bits == BITS_PER_LO_SCALAR || num_bits == BITS_PER_HI_SCALAR);
239 constexpr size_t NUM_TABLES = get_num_tables_per_multi_table<num_bits>();
245 };
246 constexpr function_ptr_table get_values_from_key_table = make_function_pointer_table();
247
248 MultiTable table(MAX_TABLE_SIZE, 0, 0, NUM_TABLES);
249 table.id = id;
250 table.get_table_values.resize(NUM_TABLES);
251 table.basic_table_ids.resize(NUM_TABLES);
252 for (size_t i = 0; i < NUM_TABLES; ++i) {
253 table.slice_sizes.emplace_back(MAX_TABLE_SIZE);
254 table.get_table_values[i] = get_values_from_key_table[multitable_index][i];
255 static_assert(multitable_index < NUM_FIXED_BASE_MULTI_TABLES);
256 size_t idx = i + static_cast<size_t>(basic_table_ids[multitable_index]);
257 table.basic_table_ids[i] = static_cast<plookup::BasicTableId>(idx);
258 }
259 return table;
260}
261
262template grumpkin::g1::affine_element table::generate_generator_offset<table::BITS_PER_LO_SCALAR>(
263 const grumpkin::g1::affine_element& input);
264template grumpkin::g1::affine_element table::generate_generator_offset<table::BITS_PER_HI_SCALAR>(
265 const grumpkin::g1::affine_element& input);
266template table::fixed_base_scalar_mul_tables table::generate_tables<table::BITS_PER_LO_SCALAR>(
267 const table::affine_element& input);
268template table::fixed_base_scalar_mul_tables table::generate_tables<table::BITS_PER_HI_SCALAR>(
269 const table::affine_element& input);
270
271template BasicTable table::generate_basic_fixed_base_table<0>(BasicTableId, size_t, size_t);
272template BasicTable table::generate_basic_fixed_base_table<1>(BasicTableId, size_t, size_t);
273template BasicTable table::generate_basic_fixed_base_table<2>(BasicTableId, size_t, size_t);
274template BasicTable table::generate_basic_fixed_base_table<3>(BasicTableId, size_t, size_t);
275template MultiTable table::get_fixed_base_table<0, table::BITS_PER_LO_SCALAR>(MultiTableId);
276template MultiTable table::get_fixed_base_table<1, table::BITS_PER_HI_SCALAR>(MultiTableId);
277template MultiTable table::get_fixed_base_table<2, table::BITS_PER_LO_SCALAR>(MultiTableId);
278template MultiTable table::get_fixed_base_table<3, table::BITS_PER_HI_SCALAR>(MultiTableId);
279
286{
287 static const table::all_multi_tables tables = {
288 table::generate_tables<BITS_PER_LO_SCALAR>(lhs_base_point_lo()),
289 table::generate_tables<BITS_PER_HI_SCALAR>(lhs_base_point_hi()),
290 table::generate_tables<BITS_PER_LO_SCALAR>(rhs_base_point_lo()),
291 table::generate_tables<BITS_PER_HI_SCALAR>(rhs_base_point_hi()),
292 };
293 return tables;
294}
295
302{
304 table::generate_generator_offset<BITS_PER_LO_SCALAR>(lhs_base_point_lo()),
305 table::generate_generator_offset<BITS_PER_HI_SCALAR>(lhs_base_point_hi()),
306 table::generate_generator_offset<BITS_PER_LO_SCALAR>(rhs_base_point_lo()),
307 table::generate_generator_offset<BITS_PER_HI_SCALAR>(rhs_base_point_hi()),
308 };
309 return tables;
310}
311
312} // namespace bb::plookup::fixed_base
#define BB_ASSERT_LT(left, right,...)
Definition assert.hpp:115
#define ASSERT(expression,...)
Definition assert.hpp:49
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
Definition element.hpp:33
constexpr element dbl() const noexcept
static void batch_normalize(element *elements, size_t num_elements) noexcept
static constexpr element point_at_infinity
Definition group.hpp:47
static std::vector< affine_element > derive_generators(const std::vector< uint8_t > &domain_separator_bytes, const size_t num_generators, const size_t starting_index=0)
Derives generator points via hash-to-curve.
Definition group.hpp:87
Generates plookup tables required to perform fixed-base scalar multiplication over a fixed number of ...
std::vector< affine_element > single_lookup_table
static affine_element generate_generator_offset(const affine_element &input)
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,...
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...
std::array< fixed_base_scalar_mul_tables, NUM_FIXED_BASE_MULTI_TABLES > all_multi_tables
static bool lookup_table_exists_for_point(const affine_element &input)
Given a point, do we have a precomputed lookup table for this point?
static constexpr affine_element rhs_generator_point()
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...
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.
static const all_multi_tables & fixed_base_tables()
static affine_element lhs_base_point_lo()
static affine_element rhs_base_point_lo()
static const std::array< affine_element, table::NUM_FIXED_BASE_MULTI_TABLES > & fixed_base_table_offset_generators()
offset generators!
static affine_element lhs_base_point_hi()
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...
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.
static constexpr affine_element lhs_generator_point()
std::vector< single_lookup_table > fixed_base_scalar_mul_tables
static affine_element rhs_base_point_hi()
std::array< bb::fr, 2 >(*)(const std::array< uint64_t, 2 >) function_ptr
std::array< std::array< function_ptr, table::MAX_NUM_TABLES_IN_MULTITABLE >, table::NUM_FIXED_BASE_MULTI_TABLES > function_ptr_table
constexpr function_ptr_table make_function_pointer_table()
create a compile-time static 2D array of all our required get_basic_fixed_base_table_values function ...
@ FIXED_BASE_3_0
Definition types.hpp:71
@ FIXED_BASE_0_0
Definition types.hpp:68
@ FIXED_BASE_2_0
Definition types.hpp:70
@ FIXED_BASE_1_0
Definition types.hpp:69
@ FIXED_BASE_RIGHT_HI
Definition types.hpp:103
@ FIXED_BASE_LEFT_LO
Definition types.hpp:100
@ FIXED_BASE_LEFT_HI
Definition types.hpp:101
@ FIXED_BASE_RIGHT_LO
Definition types.hpp:102
void write(B &buf, field2< base_field, Params > const &value)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
A basic table from which we can perform lookups (for example, an xor table)
Definition types.hpp:348
static constexpr size_t NUM_FIXED_BASE_MULTI_TABLES
static constexpr size_t MAX_TABLE_SIZE
static constexpr size_t BITS_PER_TABLE
static constexpr size_t BITS_PER_HI_SCALAR
static constexpr size_t MAX_NUM_TABLES_IN_MULTITABLE
static constexpr size_t BITS_PER_LO_SCALAR
Container for managing multiple BasicTables plus the data needed to combine basic table outputs (e....
Definition types.hpp:154