Skip to content

Commit

Permalink
generate_circuit as public interface for components #16
Browse files Browse the repository at this point in the history
  • Loading branch information
SK0M0R0H committed Apr 13, 2022
1 parent 070eb4f commit 6fd918c
Show file tree
Hide file tree
Showing 10 changed files with 479 additions and 394 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,79 @@ namespace nil {
return in_bp.allocate_rows(required_rows_amount);
}

static void generate_circuit(
blueprint<ArithmetizationType> &bp,
blueprint_assignment_table<ArithmetizationType> &assignment,
const params_type &params,
const std::size_t &component_start_row) {

generate_gates(bp, assignment, params, component_start_row);
generate_copy_constraints(bp, assignment, params, component_start_row);
}

static result_type generate_assignments(
blueprint_assignment_table<ArithmetizationType> &assignment,
const params_type &params,
const std::size_t &component_start_row) {

std::size_t row = component_start_row;

std::size_t crumbs_per_row = 8;
std::size_t bits_per_crumb = 2;
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);
for (std::size_t i = 0; i < params.num_bits; i++) {
bits_msb[params.num_bits - 1 - i] = multiprecision::bit_test(integral_scalar, i);
}

typename BlueprintFieldType::value_type a = 2;
typename BlueprintFieldType::value_type b = 2;
typename BlueprintFieldType::value_type n = 0;

for (std::size_t chunk_start = 0; chunk_start < bits_msb.size(); chunk_start += bits_per_row) {
assignment.witness(W0)[row] = n;
assignment.witness(W2)[row] = a;
assignment.witness(W3)[row] = b;

for (std::size_t j = 0; j < crumbs_per_row; j++) {
std::size_t crumb = chunk_start + j * bits_per_crumb;
typename BlueprintFieldType::value_type b0 = bits_msb[crumb + 1];
typename BlueprintFieldType::value_type b1 = bits_msb[crumb + 0];

typename BlueprintFieldType::value_type crumb_value = b0 + b1.doubled();
assignment.witness(W7 + j)[row] = crumb_value;

a = a.doubled();
b = b.doubled();

typename BlueprintFieldType::value_type s =
(b0 == BlueprintFieldType::value_type::one()) ? 1 : -1;

if (b1 == BlueprintFieldType::value_type::zero()) {
b += s;
} else {
a += s;
}

n = (n.doubled()).doubled();
n += crumb_value;
}

assignment.witness(W1)[row] = n;
assignment.witness(W4)[row] = a;
assignment.witness(W5)[row] = b;
row++;
}
auto res = a * params.endo_factor + b;
assignment.witness(W6)[row - 1] = res;

std::cout<<"circuit result "<<res.data<<std::endl;
return result_type { var(W6, row - 1, false) };
}

private:
static void generate_gates(blueprint<ArithmetizationType> &bp,
blueprint_assignment_table<ArithmetizationType> &assignment,
const params_type &params,
Expand Down Expand Up @@ -174,68 +247,6 @@ namespace nil {
bp.add_copy_constraint({{W3, j + z, false}, {W5, j + z - 1, false}});
}
}

static result_type generate_assignments(
blueprint_assignment_table<ArithmetizationType> &assignment,
const params_type &params,
const std::size_t &component_start_row) {

std::size_t row = component_start_row;

std::size_t crumbs_per_row = 8;
std::size_t bits_per_crumb = 2;
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);
for (std::size_t i = 0; i < params.num_bits; i++) {
bits_msb[params.num_bits - 1 - i] = multiprecision::bit_test(integral_scalar, i);
}

typename BlueprintFieldType::value_type a = 2;
typename BlueprintFieldType::value_type b = 2;
typename BlueprintFieldType::value_type n = 0;

for (std::size_t chunk_start = 0; chunk_start < bits_msb.size(); chunk_start += bits_per_row) {
assignment.witness(W0)[row] = n;
assignment.witness(W2)[row] = a;
assignment.witness(W3)[row] = b;

for (std::size_t j = 0; j < crumbs_per_row; j++) {
std::size_t crumb = chunk_start + j * bits_per_crumb;
typename BlueprintFieldType::value_type b0 = bits_msb[crumb + 1];
typename BlueprintFieldType::value_type b1 = bits_msb[crumb + 0];

typename BlueprintFieldType::value_type crumb_value = b0 + b1.doubled();
assignment.witness(W7 + j)[row] = crumb_value;

a = a.doubled();
b = b.doubled();

typename BlueprintFieldType::value_type s =
(b0 == BlueprintFieldType::value_type::one()) ? 1 : -1;

if (b1 == BlueprintFieldType::value_type::zero()) {
b += s;
} else {
a += s;
}

n = (n.doubled()).doubled();
n += crumb_value;
}

assignment.witness(W1)[row] = n;
assignment.witness(W4)[row] = a;
assignment.witness(W5)[row] = b;
row++;
}
auto res = a * params.endo_factor + b;
assignment.witness(W6)[row - 1] = res;

std::cout<<"circuit result "<<res.data<<std::endl;
return result_type { var(W6, row - 1, false) };
}
};
} // namespace components
} // namespace zk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ namespace nil {
ArithmetizationParams> ArithmetizationType;

using var = snark::plonk_variable<BlueprintFieldType>;

public:
constexpr static const std::size_t required_rows_amount = 1;

Expand All @@ -88,67 +89,14 @@ namespace nil {
components_amount);
}

static void generate_gates(
static void generate_circuit(
blueprint<ArithmetizationType> &bp,
blueprint_assignment_table<ArithmetizationType> &assignment,
blueprint_assignment_table<ArithmetizationType> &assignment,
const params_type &params,
const std::initializer_list<std::size_t> &&row_start_indices) {

using var = snark::plonk_variable<BlueprintFieldType>;

std::size_t selector_index = assignment.add_selector(row_start_indices);

auto constraint_1 = bp.add_constraint(
var(W7, 0) * (var(W2, 0) - var(W0, 0)));
auto constraint_2 = bp.add_constraint(
(var(W2, 0) - var(W0, 0)) * var(W10, 0) -
(1 - var(W7, 0)));
auto constraint_3 = bp.add_constraint(
var(W7, 0) * (2*var(W8, 0) * var(W1, 0) -
3*(var(W0, 0) * var(W0, 0))) + (1 - var(W7, 0)) *
((var(W2, 0) - var(W0, 0)) * var(W8, 0) -
(var(W3, 0) - var(W1, 0))));
auto constraint_4 = bp.add_constraint(
(var(W8, 0) * var(W8, 0)) - (var(W0, 0) + var(W2, 0) + var(W4, 0)));
auto constraint_5 = bp.add_constraint(
var(W5, 0) - (var(W8, 0) * (var(W0, 0) -
var(W4, 0)) - var(W1, 0)));
auto constraint_6 = bp.add_constraint(
(var(W3, 0) - var(W1, 0)) * (var(W7, 0) - var(W6, 0)));
auto constraint_7 = bp.add_constraint(
(var(W3, 0) - var(W1, 0)) * var(W9, 0) - var(W6, 0));
const std::size_t &component_start_row) {

bp.add_gate(selector_index,
{ constraint_1, constraint_2, constraint_3,
constraint_4, constraint_5, constraint_6,
constraint_7
});
}

static void generate_gates(
blueprint<ArithmetizationType> &bp,
blueprint_assignment_table<ArithmetizationType> &assignment,
const params_type &params,
const std::size_t row_start_index) {

generate_gates(
bp,
assignment,
params,
{row_start_index});
}

static void generate_copy_constraints(
blueprint<ArithmetizationType> &bp,
blueprint_assignment_table<ArithmetizationType> &assignment,
const params_type &params,
const std::size_t &component_start_row){

const std::size_t &j = component_start_row;

std::size_t public_input_column_index = 0;
bp.add_copy_constraint({{W6, static_cast<int>(j), false},
{public_input_column_index, 0, false, var::column_type::public_input}});
generate_gates(bp, assignment, params, component_start_row);
generate_copy_constraints(bp, assignment, params, component_start_row);
}

static void generate_assignments(
Expand Down Expand Up @@ -204,6 +152,57 @@ namespace nil {
assignment.witness(W10)[j] = 0;
}
}

private:
static void generate_gates(
blueprint<ArithmetizationType> &bp,
blueprint_assignment_table<ArithmetizationType> &assignment,
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);

auto constraint_1 = bp.add_constraint(
var(W7, 0) * (var(W2, 0) - var(W0, 0)));
auto constraint_2 = bp.add_constraint(
(var(W2, 0) - var(W0, 0)) * var(W10, 0) -
(1 - var(W7, 0)));
auto constraint_3 = bp.add_constraint(
var(W7, 0) * (2*var(W8, 0) * var(W1, 0) -
3*(var(W0, 0) * var(W0, 0))) + (1 - var(W7, 0)) *
((var(W2, 0) - var(W0, 0)) * var(W8, 0) -
(var(W3, 0) - var(W1, 0))));
auto constraint_4 = bp.add_constraint(
(var(W8, 0) * var(W8, 0)) - (var(W0, 0) + var(W2, 0) + var(W4, 0)));
auto constraint_5 = bp.add_constraint(
var(W5, 0) - (var(W8, 0) * (var(W0, 0) -
var(W4, 0)) - var(W1, 0)));
auto constraint_6 = bp.add_constraint(
(var(W3, 0) - var(W1, 0)) * (var(W7, 0) - var(W6, 0)));
auto constraint_7 = bp.add_constraint(
(var(W3, 0) - var(W1, 0)) * var(W9, 0) - var(W6, 0));

bp.add_gate(selector_index,
{ constraint_1, constraint_2, constraint_3,
constraint_4, constraint_5, constraint_6,
constraint_7
});
}

static void generate_copy_constraints(
blueprint<ArithmetizationType> &bp,
blueprint_assignment_table<ArithmetizationType> &assignment,
const params_type &params,
const std::size_t &component_start_row){

const std::size_t &j = component_start_row;

std::size_t public_input_column_index = 0;
bp.add_copy_constraint({{W6, static_cast<int>(j), false},
{public_input_column_index, 0, false, var::column_type::public_input}});
}
};
} // namespace components
} // namespace zk
Expand Down
Loading

0 comments on commit 6fd918c

Please sign in to comment.