Skip to content

Commit

Permalink
lookup argument #20
Browse files Browse the repository at this point in the history
  • Loading branch information
Luannet committed Apr 3, 2022
1 parent ac40c74 commit be0924c
Show file tree
Hide file tree
Showing 11 changed files with 516 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include <vector>

#include <nil/crypto3/zk/snark/arithmetization/plonk/gate.hpp>
#include <nil/crypto3/zk/snark/arithmetization/plonk/constraint.hpp>
#include <nil/crypto3/zk/snark/arithmetization/plonk/copy_constraint.hpp>
#include <nil/crypto3/zk/snark/arithmetization/plonk/lookup_constraint.hpp>

Expand All @@ -52,9 +53,9 @@ namespace nil {
struct plonk_constraint_system {

protected:
std::vector<plonk_gate<FieldType>> _gates;
std::vector<plonk_gate<FieldType, plonk_constraint<FieldType>>> _gates;
std::vector<plonk_copy_constraint<FieldType>> _copy_constraints;
std::vector<plonk_lookup_constraint<FieldType>> _lookup_constraints;
std::vector<plonk_gate<FieldType, plonk_lookup_constraint<FieldType>>> _lookup_gates;

public:

Expand All @@ -63,9 +64,10 @@ namespace nil {
plonk_constraint_system(){}

plonk_constraint_system(
std::vector<plonk_gate<FieldType>> &gates,
std::vector<plonk_copy_constraint<FieldType>> &copy_constraints):
_gates(gates), _copy_constraints(copy_constraints){
std::vector<plonk_gate<FieldType, plonk_constraint<FieldType>>> &gates,
std::vector<plonk_copy_constraint<FieldType>> &copy_constraints,
std::vector<plonk_gate<FieldType, plonk_lookup_constraint<FieldType>>> &lookup_gates):
_gates(gates), _copy_constraints(copy_constraints), _lookup_gates(lookup_gates){
}

std::size_t num_gates() const {
Expand All @@ -85,16 +87,16 @@ namespace nil {
// return true;
// }

std::vector<plonk_gate<FieldType>> gates() const {
std::vector<plonk_gate<FieldType, plonk_constraint<FieldType>>> gates() const {
return _gates;
}

std::vector<plonk_copy_constraint<FieldType>> copy_constraints() const {
return _copy_constraints;
}

std::vector<math::polynomial<typename FieldType::value_type>> lookup_constraints() const {
return _lookup_constraints;
std::vector<plonk_gate<FieldType, plonk_lookup_constraint<FieldType>>> lookup_gates() const {
return _lookup_gates;
}
};
} // namespace snark
Expand Down
15 changes: 8 additions & 7 deletions include/nil/crypto3/zk/snark/arithmetization/plonk/gate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,33 +28,34 @@
#define CRYPTO3_ZK_PLONK_GATE_HPP

#include <nil/crypto3/zk/snark/arithmetization/plonk/constraint.hpp>
#include <nil/crypto3/zk/snark/arithmetization/plonk/lookup_constraint.hpp>

namespace nil {
namespace crypto3 {
namespace zk {
namespace snark {

template<typename FieldType>
template<typename FieldType, typename ConstraintType>
struct plonk_gate {
typedef FieldType field_type;
typedef plonk_constraint<FieldType> constraint_type;
//typedef plonk_constraint<FieldType> constraint_type;

std::size_t selector_index;
std::vector<constraint_type> constraints;
std::vector<ConstraintType> constraints;

plonk_gate(std::size_t selector_index, const constraint_type &constraint) :
constraints(std::vector<constraint_type>({constraint})),
plonk_gate(std::size_t selector_index, const ConstraintType &constraint) :
constraints(std::vector<ConstraintType>({constraint})),
selector_index(selector_index) {
}

plonk_gate(std::size_t selector_index,
const std::initializer_list<constraint_type> &&constraints) :
const std::initializer_list<ConstraintType> &&constraints) :
constraints(constraints),
selector_index(selector_index) {
}

plonk_gate(std::size_t selector_index,
const std::vector<constraint_type> &constraints):
const std::vector<ConstraintType> &constraints):
constraints(constraints),
selector_index(selector_index){
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,118 @@ namespace nil {
namespace zk {
namespace snark {

template<typename FieldType>
struct plonk_lookup_constraint {};
template<typename FieldType, typename VariableType = plonk_variable<FieldType>>
class plonk_lookup_constraint {
public:
std::vector<VariableType> lookup_input;
std::vector<VariableType> lookup_value;

/*template<std::size_t WitnessColumns, std::size_t SelectorColumns,
std::size_t PublicInputColumns, std::size_t ConstantColumns>
std::array<math::polynomial<typename VariableType::assignment_type>, k>
evaluate_lookup_input(const plonk_polynomial_table<FieldType, WitnessColumns,
SelectorColumns, PublicInputColumns, ConstantColumns> &assignments) const {
std::array<math::polynomial<typename VariableType::assignment_type>, k> acc;
for (std::size_t i = 0; i < k, i++) {
typename VariableType::assignment_type assignment;
switch (lookup_input[i].type) {
case VariableType::column_type::witness:
assignment = math::polynomial_shift<FieldType>(assignments.witness(lookup_input[i].index), domain->get_domain_element(lookup_input[i].rotation));
break;
case VariableType::column_type::selector:
assignment = math::polynomial_shift<FieldType>(assignments.witness(lookup_input[i].index), domain->get_domain_element(lookup_input[i].rotation));
break;
case VariableType::column_type::public_input:
assignment = math::polynomial_shift<FieldType>(assignments.witness(lookup_input[i].index), domain->get_domain_element(lookup_input[i].rotation));
break;
case VariableType::column_type::constant:
assignment = math::polynomial_shift<FieldType>(assignments.witness(lookup_input[i].index), domain->get_domain_element(lookup_input[i].rotation));
break;
}
acc[i] = assignment;
}
return acc;
}
template<std::size_t WitnessColumns, std::size_t SelectorColumns,
std::size_t PublicInputColumns, std::size_t ConstantColumns>
std::array<math::polynomial<typename VariableType::assignment_type>, k>
evaluate_lookup_value(const plonk_polynomial_table<FieldType, WitnessColumns,
SelectorColumns, PublicInputColumns, ConstantColumns> &assignments) const {
std::array<math::polynomial<typename VariableType::assignment_type>, k> acc;
for (std::size_t i = 0; i < k, i++) {
typename VariableType::assignment_type assignment;
switch (lookup_value[i].type) {
case VariableType::column_type::witness:
assignment = assignments.witness(lookup_input[i].index);
break;
case VariableType::column_type::selector:
assignment = assignments.selector(lookup_input[i].index);
break;
case VariableType::column_type::public_input:
assignment = assignments.public_input(lookup_input[i].index);
break;
case VariableType::column_type::constant:
assignment = assignments.constant(lookup_input[i].index);
break;
}
acc[i] = assignment;
}
return acc;
}*/

/*template<typename ArithmetizationParams>
std::pair<std::array<std::vector<typename VariableType::column_type>, k>, typename FieldType::value_type>
evaluate_lookup_input(const plonk_assignment_table<FieldType, ArithmetizationParams> &assignments, typename FieldType::value_type theta,
typename FieldType::value_type theta_acc) const {
std::array<std::vector<typename VariableType::column_type>, k> acc;
for (std::size_t i = 0; i < k; i++) {
typename VariableType::column_type assignment;
switch (lookup_input[i].type) {
case VariableType::column_type::witness:
assignment = assignments.witness(lookup_input[i].index);
break;
case VariableType::column_type::public_input:
assignment = assignments.public_input(lookup_input[i].index);
break;
case VariableType::column_type::constant:
assignment = assignments.constant(lookup_input[i].index);
break;
}
for (std:: size_t j = 0; j < assignment.size(); j++) {
acc[i].push_back(assignment[(j + lookup_input[i].rotation) % assignment.size()] * theta_acc);
}
theta_acc = theta * theta_acc;
}
return std::make_pair(acc, theta_acc);
}
template<typename ArithmetizationParams>
std::pair<std::array<std::vector<typename VariableType::column_type>, k>, typename FieldType::value_type>
evaluate_lookup_value(const plonk_assignment_table<FieldType, ArithmetizationParams> &assignments, typename FieldType::value_type theta,
typename FieldType::value_type theta_acc) const {
std::array<std::vector<typename VariableType::column_type>, k> acc;
for (std::size_t i = 0; i < k; i++) {
typename VariableType::column_type assignment;
switch (lookup_value[i].type) {
case VariableType::column_type::witness:
assignment = assignments.witness(lookup_input[i].index);
break;
case VariableType::column_type::public_input:
assignment = assignments.public_input(lookup_input[i].index);
break;
case VariableType::column_type::constant:
assignment = assignments.constant(lookup_input[i].index);
break;
}
for (std:: size_t j = 0; j < assignment.size(); j++) {
acc[i].push_back(assignment[j] * theta_acc);
}
theta_acc = thets_acc * theta;
}
return std::make_pair(acc, theta_acc);
}*/
};
} // namespace snark
} // namespace zk
} // namespace crypto3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include <nil/crypto3/zk/snark/arithmetization/plonk/constraint_system.hpp>
#include <nil/crypto3/zk/snark/systems/plonk/redshift/params.hpp>
#include <nil/crypto3/zk/snark/systems/plonk/redshift/detail/redshift_policy.hpp>
#include <nil/crypto3/zk/snark/arithmetization/plonk/constraint.hpp>

namespace nil {
namespace crypto3 {
Expand Down Expand Up @@ -72,7 +73,7 @@ namespace nil {

typename FieldType::value_type theta_acc = FieldType::value_type::one();

const std::vector<plonk_gate<FieldType>> gates = constraint_system.gates();
const std::vector<plonk_gate<FieldType, plonk_constraint<FieldType>>> gates = constraint_system.gates();

for (std::size_t i = 0; i < gates.size(); i++) {
math::polynomial<typename FieldType::value_type> gate_result = {0};
Expand All @@ -92,7 +93,7 @@ namespace nil {
}

static inline std::array<typename FieldType::value_type, argument_size>
verify_eval(const std::vector<plonk_gate<FieldType>> &gates,
verify_eval(const std::vector<plonk_gate<FieldType, plonk_constraint<FieldType>>> &gates,
const plonk_public_polynomial_table<FieldType,
typename ParamsType::arithmetization_params> public_polynomials,
typename policy_type::evaluation_map &evaluations,
Expand Down
Loading

0 comments on commit be0924c

Please sign in to comment.