Skip to content

Commit

Permalink
PLONK fixed_base_scalar_mul component updated. #16
Browse files Browse the repository at this point in the history
  • Loading branch information
nkaskov committed Dec 26, 2021
1 parent acd2f0b commit ecfa36f
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,12 @@ namespace nil {
j = this->bp.allocate_rows(85);
}
private:
typename CurveType::template g1_type<>::value_type omega(
typename CurveType::template g1_type<>::value_type get_omega(
std::size_t s, std::size_t i){

return (i * math::detail::get_power_of_two(3*s))*B;
std::size_t coef = i * math::detail::get_power_of_two(3*s);

return coef*B;
}

void generate_phi1_gate(
Expand All @@ -97,7 +99,7 @@ namespace nil {
typename blueprint_type::value_type x_2,
typename blueprint_type::value_type x_3,
typename blueprint_type::value_type x_4,
std::array<typename CurveType::base_field_type, 7> u) {
std::array<typename CurveType::base_field_type::value_type, 7> u) {

this->bp.add_gate(row_index,
x_3 * (-u[0] * x_2 * x_1 + u[0] * x_1 + u[0] * x_2
Expand All @@ -116,7 +118,7 @@ namespace nil {
typename blueprint_type::value_type x_2,
typename blueprint_type::value_type x_3,
typename blueprint_type::value_type x_4,
std::array<typename CurveType::base_field_type, 7> v) {
std::array<typename CurveType::base_field_type::value_type, 7> v) {

this->bp.add_gate(row_index,
x_3 * (-v[0] * x_2 * x_1 + v[0] * x_1 + v[0] * x_2
Expand All @@ -137,7 +139,8 @@ namespace nil {
typename blueprint_type::value_type x_4,
typename blueprint_type::value_type x_5,
typename blueprint_type::value_type x_6) {
this->bp.add_gate(row_index, x_1 * (1 + CurveType::d * x_3*x_4*x_5*x_6) - (x_3*x_6 + x_4*x_5));
this->bp.add_gate(row_index, x_1 * (1 + CurveType::template g1_type<>::params_type::b
* x_3*x_4*x_5*x_6) - (x_3*x_6 + x_4*x_5));
}

void generate_phi4_gate(
Expand All @@ -148,7 +151,8 @@ namespace nil {
typename blueprint_type::value_type x_4,
typename blueprint_type::value_type x_5,
typename blueprint_type::value_type x_6) {
this->bp.add_gate(row_index, x_2 * (1 - CurveType::d * x_3*x_4*x_5*x_6) - (x_3*x_5 + x_4*x_6));
this->bp.add_gate(row_index, x_2 * (1 - CurveType::template g1_type<>::params_type::b
* x_3*x_4*x_5*x_6) - (x_3*x_5 + x_4*x_6));
}
public:
void generate_gates() {
Expand All @@ -172,7 +176,7 @@ namespace nil {
std::array<typename CurveType::base_field_type::value_type, 7> u;
std::array<typename CurveType::base_field_type::value_type, 7> v;
for (std::size_t i=0; i<7; i++){
typename CurveType::template g1_type<>::value_type omega = omega(3*z/5, i);
typename CurveType::template g1_type<>::value_type omega = get_omega(3*z/5, i);
u[i] = omega.X;
v[i] = omega.Y;
}
Expand All @@ -191,7 +195,7 @@ namespace nil {
std::array<typename CurveType::base_field_type::value_type, 7> u;
std::array<typename CurveType::base_field_type::value_type, 7> v;
for (std::size_t i=0; i<7; i++){
typename CurveType::template g1_type<>::value_type omega = omega(3*(z-2)/5, i);
typename CurveType::template g1_type<>::value_type omega = get_omega(3*(z-2)/5, i);
u[i] = omega.X;
v[i] = omega.Y;
}
Expand All @@ -208,7 +212,7 @@ namespace nil {
std::array<typename CurveType::base_field_type::value_type, 7> u;
std::array<typename CurveType::base_field_type::value_type, 7> v;
for (std::size_t i=0; i<7; i++){
typename CurveType::template g1_type<>::value_type omega = omega(3*(z-3)/5, i);
typename CurveType::template g1_type<>::value_type omega = get_omega(3*(z-3)/5, i);
u[i] = omega.X;
v[i] = omega.Y;
}
Expand All @@ -230,22 +234,23 @@ namespace nil {
void generate_assignments(const typename CurveType::scalar_field_type::value_type &a,
const typename CurveType::template g1_type<>::value_type &P) {

std::array<bool, 9> b = marshalling::unpack(a);
std::array<bool, 9> b ;
// = marshalling::unpack(a);

this->bp.val(W1, j) = b[0];
this->bp.val(W2, j) = b[1];
this->bp.val(W3, j) = b[2];
this->bp.assignment(W1, j) = b[0];
this->bp.assignment(W2, j) = b[1];
this->bp.assignment(W3, j) = b[2];

this->bp.val(W1, j+1) = P.X;
this->bp.val(W2, j+1) = P.Y;
this->bp.val(W3, j+1) = b[3];
this->bp.assignment(W1, j+1) = P.X;
this->bp.assignment(W2, j+1) = P.Y;
this->bp.assignment(W3, j+1) = b[3];

this->bp.val(W1, j+2) = b[4];
this->bp.val(W2, j+2) = b[5];
this->bp.val(W4, j+2) = b[6];
this->bp.assignment(W1, j+2) = b[4];
this->bp.assignment(W2, j+2) = b[5];
this->bp.assignment(W4, j+2) = b[6];

this->bp.val(W3, j+3) = b[7];
this->bp.val(W4, j+3) = b[8];
this->bp.assignment(W3, j+3) = b[7];
this->bp.assignment(W4, j+3) = b[8];
}
};

Expand Down
16 changes: 10 additions & 6 deletions include/nil/crypto3/zk/components/blueprint.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,14 +184,14 @@ namespace nil {
}

typename TBlueprintField::value_type &assignment(const value_type &var, std::size_t row_index) {
assert(row_index < assignments.size());
assert(var.index <= assignments[row_index].size());
return (assignments[row_index][var.index]);
assert(var.wire_index <= assignments.size());
assert(row_index < assignments[var.wire_index].size());
return (assignments[row_index][var.wire_index]);
}

typename TBlueprintField::value_type assignment(const value_type &var, std::size_t row_index) const {
assert(var.index <= assignments.size());
assert(row_index < assignments[var.index].size());
assert(var.wire_index <= assignments.size());
assert(row_index < assignments[var.wire_index].size());
return (assignments[var.index][row_index]);
}

Expand All @@ -202,7 +202,11 @@ namespace nil {
return result;
}

void add_gate(const snark::plonk_constraint<TBlueprintField> &constr) {
void add_gate(std::size_t row_index, const snark::plonk_constraint<TBlueprintField> &constr) {
constraint_system.constraints.emplace_back(constr);
}

void add_gate(std::initializer_list<std::size_t> row_indices,const snark::plonk_constraint<TBlueprintField> &constr) {
constraint_system.constraints.emplace_back(constr);
}

Expand Down
10 changes: 9 additions & 1 deletion include/nil/crypto3/zk/components/detail/plonk/n_wires.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ namespace nil {
typedef blueprint<TArithmetization> blueprint_type;
public:

n_wires_helper(const blueprint_type &bp):component<TArithmetization>(bp){}
n_wires_helper(blueprint_type &bp):component<TArithmetization>(bp){}

constexpr static const std::array<std::array<typename blueprint_type::value_type, 5>,5> w = {{
{{
Expand Down Expand Up @@ -121,6 +121,14 @@ namespace nil {
}};
};

template<typename TBlueprintField, std::size_t WiresAmount,
std::size_t W0, std::size_t W1, std::size_t W2, std::size_t W3,
std::size_t W4>
constexpr std::array<std::array<
typename blueprint<snark::plonk_constraint_system<TBlueprintField, WiresAmount>>::value_type, 5>,5>
const n_wires_helper<snark::plonk_constraint_system<TBlueprintField, WiresAmount>,
W0, W1, W2, W3, W4>::w;

} // namespace detail
} // namespace components
} // namespace zk
Expand Down

0 comments on commit ecfa36f

Please sign in to comment.