Skip to content
This repository was archived by the owner on Feb 17, 2025. It is now read-only.

Commit 8fb1f02

Browse files
committed
Dynamic lookups implemented #283
1 parent 16f94a3 commit 8fb1f02

File tree

5 files changed

+64
-17
lines changed

5 files changed

+64
-17
lines changed

libs/zk/include/nil/crypto3/zk/snark/arithmetization/plonk/assignment.hpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -339,15 +339,16 @@ namespace nil {
339339
, _public_table(public_inputs_amount, constants_amount, selectors_amount) {
340340
}
341341

342-
const ColumnType& get_variable_value_without_rotation(const VariableType& var) const {
342+
template <typename InputVariableType>
343+
const ColumnType& get_variable_value_without_rotation(const InputVariableType& var) const {
343344
switch (var.type) {
344-
case VariableType::column_type::witness:
345+
case InputVariableType::column_type::witness:
345346
return witness(var.index);
346-
case VariableType::column_type::public_input:
347+
case InputVariableType::column_type::public_input:
347348
return public_input(var.index);
348-
case VariableType::column_type::constant:
349+
case InputVariableType::column_type::constant:
349350
return constant(var.index);
350-
case VariableType::column_type::selector:
351+
case InputVariableType::column_type::selector:
351352
return selector(var.index);
352353
default:
353354
std::cerr << "Invalid column type" << std::endl;

libs/zk/include/nil/crypto3/zk/snark/arithmetization/plonk/lookup_table_definition.hpp

+31-1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,27 @@ namespace nil {
6868
virtual ~lookup_table_definition() {};
6969
};
7070

71+
template<typename FieldType>
72+
class dynamic_table_definition {
73+
protected:
74+
bool defined;
75+
public:
76+
plonk_lookup_table<FieldType> lookup_table;
77+
std::string name;
78+
79+
dynamic_table_definition(std::string _name): name(_name), defined(false) {}
80+
81+
void define(const plonk_lookup_table<FieldType> &table){
82+
BOOST_ASSERT(!defined);
83+
lookup_table = table;
84+
defined = true;
85+
}
86+
bool is_defined(){
87+
return defined;
88+
}
89+
virtual ~dynamic_table_definition() {};
90+
};
91+
7192
template<typename FieldType>
7293
std::vector<std::string>
7394
get_tables_ordered_by_rows_number(const std::map<std::string, std::shared_ptr<lookup_table_definition<FieldType>>> &tables){
@@ -107,12 +128,12 @@ namespace nil {
107128
std::size_t pack_lookup_tables(
108129
const TableIdsMapType &lookup_table_ids,
109130
const std::map<std::string, std::shared_ptr<lookup_table_definition<FieldType>>> &lookup_tables,
131+
const std::map<std::string, std::shared_ptr<dynamic_table_definition<FieldType>>> &dynamic_tables,
110132
plonk_constraint_system<FieldType> &bp,
111133
plonk_assignment_table<FieldType> &assignment,
112134
const std::vector<std::size_t> &constant_columns_ids,
113135
std::size_t usable_rows
114136
){
115-
// std::cout << "Packing lookup tables" << std::endl;
116137
// std::cout << "Usable rows before: " << usable_rows << std::endl;
117138
std::size_t usable_rows_after = usable_rows;
118139

@@ -176,6 +197,10 @@ namespace nil {
176197
}
177198
start_row += table->get_rows_number();
178199
}
200+
for( const auto&[k, table]:dynamic_tables ){
201+
BOOST_ASSERT(table->is_defined());
202+
bp_lookup_tables[lookup_table_ids.at(k) - 1] = table->lookup_table;
203+
}
179204
for(std::size_t i = 0; i < bp_lookup_tables.size(); i++){
180205
bp.add_lookup_table(std::move(bp_lookup_tables[i]));
181206
}
@@ -190,6 +215,7 @@ namespace nil {
190215
std::size_t pack_lookup_tables_horizontal(
191216
const LookupTableIds &lookup_table_ids,
192217
const std::map<std::string, std::shared_ptr<lookup_table_definition<FieldType>>> &lookup_tables,
218+
const std::map<std::string, std::shared_ptr<dynamic_table_definition<FieldType>>> &dynamic_tables,
193219
plonk_constraint_system<FieldType> &bp,
194220
plonk_assignment_table<FieldType> &assignment,
195221
const std::vector<std::size_t> &constant_columns_ids,
@@ -330,6 +356,10 @@ namespace nil {
330356
}
331357
start_row += table->get_rows_number();
332358
}
359+
for( const auto&[k, table]:dynamic_tables ){
360+
BOOST_ASSERT(table->is_defined());
361+
bp_lookup_tables[lookup_table_ids.at(k) - 1] = table->lookup_table;
362+
}
333363
for(std::size_t i = 0; i < bp_lookup_tables.size(); i++){
334364
bp.add_lookup_table(std::move(bp_lookup_tables[i]));
335365
}

libs/zk/include/nil/crypto3/zk/snark/systems/plonk/placeholder/lookup_argument.hpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ namespace nil {
169169
prepare_lookup_input();
170170
auto& lookup_input = *lookup_input_ptr;
171171

172+
172173
// 3. Lookup_input and lookup_value are ready
173174
// Now sort them!
174175
// Reduce value and input:
@@ -184,6 +185,7 @@ namespace nil {
184185
for( std::size_t i = 0; i < lookup_input.size(); i++ ){
185186
reduced_input.push_back(reduce_dfs_polynomial_domain(lookup_input[i], basic_domain->m));
186187
}
188+
187189
// Sort
188190
auto sorted = sort_polynomials(reduced_input, reduced_value, basic_domain->m,
189191
preprocessed_data.common_data.desc.usable_rows_amount);
@@ -419,7 +421,9 @@ namespace nil {
419421
math::polynomial_dfs<typename FieldType::value_type> v = (typename FieldType::value_type(t_id + 1)) * lookup_tag;
420422
theta_acc = theta;
421423
for (std::size_t i = 0; i < l_table.columns_number; i++) {
422-
v += theta_acc * lookup_tag * plonk_columns.constant(l_table.lookup_options[o_id][i].index);
424+
math::polynomial_dfs<typename FieldType::value_type> c;
425+
c = plonk_columns.get_variable_value_without_rotation(l_table.lookup_options[o_id][i]);
426+
v += theta_acc * lookup_tag * c;
423427
theta_acc *= theta;
424428
}
425429
v *= mask_assignment;
@@ -464,7 +468,7 @@ namespace nil {
464468
);
465469
visitor.visit(expr);
466470

467-
math::cached_expression_evaluator<DfsVariableType> evaluator(expr,
471+
math::cached_expression_evaluator<DfsVariableType> evaluator(expr,
468472
[&domain=basic_domain, &assignments=plonk_columns, &rotated_variable_values]
469473
(const DfsVariableType &var) -> const polynomial_dfs_type& {
470474
if (var.rotation == 0) {
@@ -701,8 +705,8 @@ namespace nil {
701705
theta_acc = theta;
702706
BOOST_ASSERT(table.lookup_options[o_id].size() == table.columns_number);
703707
for( std::size_t i = 0; i < table.lookup_options[o_id].size(); i++){
704-
auto key1 = std::tuple(table.lookup_options[o_id][i].index, 0, plonk_variable<typename FieldType::value_type>::column_type::constant);
705-
auto shifted_key1 = std::tuple(table.lookup_options[o_id][i].index, 1, plonk_variable<typename FieldType::value_type>::column_type::constant);
708+
auto key1 = std::tuple(table.lookup_options[o_id][i].index, 0, table.lookup_options[o_id][i].type);
709+
auto shifted_key1 = std::tuple(table.lookup_options[o_id][i].index, 1, table.lookup_options[o_id][i].type);
706710
v += theta_acc * evaluations[key1] * selector_value;
707711
shifted_v += theta_acc * evaluations[shifted_key1]* shifted_selector_value;
708712
theta_acc *= theta;

libs/zk/include/nil/crypto3/zk/snark/systems/plonk/placeholder/preprocessor.hpp

+18-5
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ namespace nil {
366366
const plonk_constraint_system<FieldType> &constraint_system,
367367
const plonk_table_description<FieldType> &table_description
368368
) {
369+
using var = plonk_variable<typename FieldType::value_type>;
369370
std::vector<std::set<int>> result(table_description.table_width());
370371

371372
for (auto & s : result) {
@@ -402,11 +403,23 @@ namespace nil {
402403
].insert(1);
403404
for( const auto &option:table.lookup_options){
404405
for( const auto &column:option){
405-
result[
406-
table_description.witness_columns +
407-
table_description.public_input_columns +
408-
column.index
409-
].insert(1);
406+
switch( column.type ){
407+
case var::column_type::witness:
408+
result[column.index].insert(1);
409+
break;
410+
case var::column_type::public_input:
411+
result[ table_description.witness_columns + column.index].insert(1);
412+
break;
413+
case var::column_type::constant:
414+
result[ table_description.witness_columns + table_description.public_input_columns + column.index ].insert(1);
415+
break;
416+
case var::column_type::selector:
417+
result[ table_description.witness_columns + table_description.public_input_columns + table_description.constant_columns + column.index].insert(1);
418+
break;
419+
case var::column_type::uninitialized:
420+
break;
421+
}
422+
410423
}
411424
}
412425
}

libs/zk/include/nil/crypto3/zk/snark/systems/plonk/placeholder/prover.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,6 @@ namespace nil {
205205

206206
// 8. Run evaluation proofs
207207
_proof.eval_proof.challenge = transcript.template challenge<FieldType>();
208-
209208
generate_evaluation_points();
210209

211210
{
@@ -283,7 +282,7 @@ namespace nil {
283282
}
284283

285284
typename placeholder_lookup_argument_prover<FieldType, commitment_scheme_type, ParamsType>::prover_lookup_result
286-
lookup_argument() {
285+
lookup_argument() {
287286
PROFILE_PLACEHOLDER_SCOPE("lookup_argument_time");
288287

289288
typename placeholder_lookup_argument_prover<

0 commit comments

Comments
 (0)