Skip to content

Commit

Permalink
component params as variables #16
Browse files Browse the repository at this point in the history
  • Loading branch information
SK0M0R0H committed Apr 14, 2022
1 parent 6fd918c commit 8bbe4ca
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 39 deletions.
31 changes: 30 additions & 1 deletion include/nil/crypto3/zk/assignment/plonk.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,12 @@ namespace nil {
typedef snark::plonk_constraint_system<BlueprintFieldType,
ArithmetizationParams> ArithmetizationType;

using var = snark::plonk_variable<BlueprintFieldType>;

snark::plonk_table_description<BlueprintFieldType,
ArithmetizationParams> &_table_description;

std::size_t allocated_public_input_rows = 0;
public:
blueprint_public_assignment_table(
snark::plonk_table_description<BlueprintFieldType,
Expand Down Expand Up @@ -258,6 +262,12 @@ namespace nil {

return _table_description.rows_amount;
}

var allocate_public_input(typename BlueprintFieldType::value_type data) {
public_input(0)[allocated_public_input_rows] = data;
allocated_public_input_rows++;
return var(0, allocated_public_input_rows - 1, false, var::column_type::public_input);
}
};

template<typename BlueprintFieldType,
Expand All @@ -266,7 +276,9 @@ namespace nil {
ArithmetizationParams>> {

using ArithmetizationType = snark::plonk_constraint_system<BlueprintFieldType,
ArithmetizationParams> ;
ArithmetizationParams>;

using var = snark::plonk_variable<BlueprintFieldType>;

blueprint_private_assignment_table<ArithmetizationType> &_private_assignment;
blueprint_public_assignment_table<ArithmetizationType> &_public_assignment;
Expand Down Expand Up @@ -320,6 +332,10 @@ namespace nil {
return _public_assignment.constant(constant_index);
}

var allocate_public_input(typename BlueprintFieldType::value_type data) {
return _public_assignment.allocate_public_input(data);
}

// shared interface
snark::plonk_column<BlueprintFieldType> &operator[](std::size_t index) {
if (index < ArithmetizationParams::WitnessColumns) {
Expand All @@ -340,6 +356,19 @@ namespace nil {
rows = _public_assignment.padding();
return rows;
}

typename BlueprintFieldType::value_type var_value(const var &a) {
typename BlueprintFieldType::value_type result;
if (a.type == var::column_type::witness) {
result = witness(a.index)[a.rotation];
} else if (a.type == var::column_type::public_input) {
result = public_input(a.index)[a.rotation];
} else {
result = constant(a.index)[a.rotation];
}

return result;
}
};

} // namespace zk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ namespace nil {
constexpr static const std::size_t required_rows_amount = 8;

struct params_type {
typename BlueprintFieldType::value_type scalar;
var scalar;
typename BlueprintFieldType::value_type endo_factor;
std::size_t num_bits;
};
Expand Down Expand Up @@ -117,7 +117,8 @@ namespace nil {
std::size_t bits_per_row = bits_per_crumb * crumbs_per_row; // we suppose that params.num_bits % bits_per_row = 0

std::vector<typename BlueprintFieldType::value_type> bits_msb(params.num_bits);
typename BlueprintFieldType::integral_type integral_scalar = typename BlueprintFieldType::integral_type(params.scalar.data);
typename BlueprintFieldType::value_type scalar = assignment.var_value(params.scalar);
typename BlueprintFieldType::integral_type integral_scalar = typename BlueprintFieldType::integral_type(scalar.data);
for (std::size_t i = 0; i < params.num_bits; i++) {
bits_msb[params.num_bits - 1 - i] = multiprecision::bit_test(integral_scalar, i);
}
Expand Down Expand Up @@ -242,10 +243,13 @@ namespace nil {
const std::size_t &j = component_start_row;

for (std::size_t z = 1; z < required_rows_amount; z++){
bp.add_copy_constraint({{W0, j + z, false}, {W1, j + z - 1, false}});
bp.add_copy_constraint({{W2, j + z, false}, {W4, j + z - 1, false}});
bp.add_copy_constraint({{W3, j + z, false}, {W5, j + z - 1, false}});
bp.add_copy_constraint({{W0, static_cast<int>(j + z), false}, {W1, static_cast<int>(j + z - 1), false}});
bp.add_copy_constraint({{W2, static_cast<int>(j + z), false}, {W4, static_cast<int>(j + z - 1), false}});
bp.add_copy_constraint({{W3, static_cast<int>(j + z), false}, {W5, static_cast<int>(j + z - 1), false}});
}

// check that the recalculated n is equal to the input challenge
bp.add_copy_constraint({{W1, static_cast<int>(j + required_rows_amount - 1), false}, params.scalar});
}
};
} // namespace components
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,13 @@ namespace nil {
constexpr static const std::size_t required_rows_amount = 1;

struct params_type {
typename CurveType::template g1_type<>::value_type P;
typename CurveType::template g1_type<>::value_type Q;
struct var_ec_point {
var x;
var y;
};

var_ec_point P;
var_ec_point Q;
};

static std::size_t allocate_rows (blueprint<ArithmetizationType> &bp,
Expand Down Expand Up @@ -109,39 +114,44 @@ namespace nil {

assignment.public_input(0)[0] = ArithmetizationType::field_type::value_type::zero();

const typename CurveType::template g1_type<>::value_type R = params.P + params.Q;
const typename CurveType::template g1_type<>::value_type &P = params.P;
const typename CurveType::template g1_type<>::value_type &Q = params.Q;

auto P_affine = P.to_affine();
auto Q_affine = Q.to_affine();
auto R_affine = R.to_affine();

assignment.witness(W0)[j] = P_affine.X;
assignment.witness(W1)[j] = P_affine.Y;
assignment.witness(W2)[j] = Q_affine.X;
assignment.witness(W3)[j] = Q_affine.Y;
assignment.witness(W4)[j] = R_affine.X;
assignment.witness(W5)[j] = R_affine.Y;
typename BlueprintFieldType::value_type p_x = assignment.var_value(params.P.x);
typename BlueprintFieldType::value_type p_y = assignment.var_value(params.P.y);
typename CurveType::template
g1_type<algebra::curves::coordinates::affine>::value_type P(p_x, p_y);

typename BlueprintFieldType::value_type q_x = assignment.var_value(params.Q.x);
typename BlueprintFieldType::value_type q_y = assignment.var_value(params.Q.y);
typename CurveType::template
g1_type<algebra::curves::coordinates::affine>::value_type Q(q_x, q_y);

const typename CurveType::template
g1_type<algebra::curves::coordinates::affine>::value_type R = P + Q;

assignment.witness(W0)[j] = P.X;
assignment.witness(W1)[j] = P.Y;
assignment.witness(W2)[j] = Q.X;
assignment.witness(W3)[j] = Q.Y;
assignment.witness(W4)[j] = R.X;
assignment.witness(W5)[j] = R.Y;

// TODO: check, if this one correct:
assignment.witness(W6)[j] = R.is_zero();

if (P.X != Q.X){
assignment.witness(W7)[j] = 0;
assignment.witness(W8)[j] = (P_affine.Y - Q_affine.Y)/(P_affine.X - Q_affine.X);
assignment.witness(W8)[j] = (P.Y - Q.Y)/(P.X - Q.X);

assignment.witness(W9)[j] = 0;

assignment.witness(W10)[j] = (Q_affine.X - P_affine.X).inversed();
assignment.witness(W10)[j] = (Q.X - P.X).inversed();
} else {
assignment.witness(W7)[j] = 1;

if (P.Y != Q.Y) {
assignment.witness(W9)[j] = (Q_affine.Y - P_affine.Y).inversed();
assignment.witness(W9)[j] = (Q.Y - P.Y).inversed();
} else { // doubling
if (P.Y != 0) {
assignment.witness(W8)[j] = (3 * (P_affine.X * P_affine.X))/(2 * P_affine.Y);
assignment.witness(W8)[j] = (3 * (P.X * P.X))/(2 * P.Y);
} else {
assignment.witness(W8)[j] = 0;
}
Expand All @@ -160,9 +170,7 @@ namespace nil {
const params_type &params,
const std::size_t row_start_index) {

using var = snark::plonk_variable<BlueprintFieldType>;

std::size_t selector_index = assignment.add_selector(row_start_index, row_start_index + required_rows_amount - 1);
std::size_t selector_index = assignment.add_selector(row_start_index);

auto constraint_1 = bp.add_constraint(
var(W7, 0) * (var(W2, 0) - var(W0, 0)));
Expand Down
9 changes: 6 additions & 3 deletions test/algebra/curves/plonk/endo_scalar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ BOOST_AUTO_TEST_CASE(blueprint_plonk_unified_addition_addition) {
using curve_type = algebra::curves::vesta;
using BlueprintFieldType = typename curve_type::scalar_field_type;
constexpr std::size_t WitnessColumns = 15;
constexpr std::size_t PublicInputColumns = 0;
constexpr std::size_t PublicInputColumns = 1;
constexpr std::size_t ConstantColumns = 0;
constexpr std::size_t SelectorColumns = 1;
using ArithmetizationParams = zk::snark::plonk_arithmetization_params<WitnessColumns,
Expand All @@ -66,15 +66,18 @@ BOOST_AUTO_TEST_CASE(blueprint_plonk_unified_addition_addition) {
using hash_type = nil::crypto3::hashes::keccak_1600<256>;
constexpr std::size_t Lambda = 40;

using var = zk::snark::plonk_variable<BlueprintFieldType>;

typename BlueprintFieldType::value_type challenge = 0x00000000000000000000000000000000FC93536CAE0C612C18FBE5F6D8E8EEF2_cppui255;
typename BlueprintFieldType::value_type endo_factor = 0x12CCCA834ACDBA712CAAD5DC57AAB1B01D1F8BD237AD31491DAD5EBDFDFE4AB9_cppui255;
typename BlueprintFieldType::value_type result = 0x004638173549A4C55A118327904B54E5F6F6314225C8C862F5AFA2506C77AC65_cppui255;
std::size_t num_bits = 128;

typename component_type::params_type params = {challenge, endo_factor, num_bits};
var challenge_var = {0, 0, false, var::column_type::public_input};
typename component_type::params_type params = {challenge_var, endo_factor, num_bits};
std::vector<typename BlueprintFieldType::value_type> public_input = {challenge};
std::cout<<"Expected result: "<<result.data<<std::endl;
test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (params);
test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda> (params, public_input);
}

BOOST_AUTO_TEST_SUITE_END()
14 changes: 11 additions & 3 deletions test/algebra/curves/plonk/unified_addition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,22 @@ BOOST_AUTO_TEST_CASE(blueprint_plonk_unified_addition_addition) {
using hash_type = nil::crypto3::hashes::keccak_1600<256>;
constexpr std::size_t Lambda = 40;

using var = zk::snark::plonk_variable<BlueprintFieldType>;

using component_type = zk::components::
curve_element_unified_addition<ArithmetizationType, curve_type, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10>;

auto P = algebra::random_element<curve_type::template g1_type<>>().to_affine();
auto Q = algebra::random_element<curve_type::template g1_type<>>().to_affine();

typename component_type::params_type params = {
algebra::random_element<curve_type::template g1_type<>>(),
algebra::random_element<curve_type::template g1_type<>>()};
{var(0, 1, false, var::column_type::public_input), var(0, 2, false, var::column_type::public_input)},
{var(0, 3, false, var::column_type::public_input), var(0, 4, false, var::column_type::public_input)}
};

test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda>(params);
std::vector<typename BlueprintFieldType::value_type> public_input = {0, P.X, P.Y, Q.X, Q.Y};

test_component<component_type, BlueprintFieldType, ArithmetizationParams, hash_type, Lambda>(params, public_input);
}

BOOST_AUTO_TEST_SUITE_END()
15 changes: 11 additions & 4 deletions test/test_plonk_component.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ namespace nil {

template<typename ComponentType, typename BlueprintFieldType, typename ArithmetizationParams, typename Hash,
std::size_t Lambda>
auto prepare_component(typename ComponentType::params_type params) {
auto prepare_component(typename ComponentType::params_type params,
std::vector<typename BlueprintFieldType::value_type> &public_input) {

using ArithmetizationType = zk::snark::plonk_constraint_system<BlueprintFieldType, ArithmetizationParams>;
using component_type = ComponentType;
Expand All @@ -83,11 +84,16 @@ namespace nil {
private_assignment, public_assignment);

std::size_t start_row = component_type::allocate_rows(bp);
bp.allocate_rows(public_input.size());

for (std::size_t i = 0; i < public_input.size(); i++) {
auto allocated_pi = assignment_bp.allocate_public_input(public_input[i]);
}

component_type::generate_circuit(bp, assignment_bp, params, start_row);
component_type::generate_assignments(assignment_bp, params,
start_row);

// bp.fix_usable_rows();
assignment_bp.padding();
std::cout << "Usable rows: " << desc.usable_rows_amount << std::endl;
std::cout << "Padded rows: " << desc.rows_amount << std::endl;
Expand Down Expand Up @@ -168,13 +174,14 @@ namespace nil {

template<typename ComponentType, typename BlueprintFieldType, typename ArithmetizationParams, typename Hash,
std::size_t Lambda>
void test_component(typename ComponentType::params_type params) {
void test_component(typename ComponentType::params_type params,
std::vector<typename BlueprintFieldType::value_type> public_input) {

using redshift_params = zk::snark::redshift_params<BlueprintFieldType, ArithmetizationParams, Hash, Hash, Lambda>;

auto [desc, bp, fri_params, assignments, public_preprocessed_data, private_preprocessed_data] =
prepare_component<ComponentType, BlueprintFieldType, ArithmetizationParams, Hash, Lambda>(
params);
params, public_input);

auto proof = zk::snark::redshift_prover<BlueprintFieldType, redshift_params>::process(
public_preprocessed_data, private_preprocessed_data, desc, bp, assignments, fri_params);
Expand Down

0 comments on commit 8bbe4ca

Please sign in to comment.