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

Commit 1c5f11c

Browse files
committed
zero representation in unified addition component changed from (0,0) to (0,1)
1 parent 5b549b6 commit 1c5f11c

File tree

2 files changed

+17
-31
lines changed

2 files changed

+17
-31
lines changed

include/nil/blueprint/components/algebra/curves/pasta/plonk/unified_addition.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace nil {
5151
static_assert(std::is_same<typename CurveType::base_field_type, BlueprintFieldType>::value);
5252

5353
constexpr static const std::uint32_t WitnessAmount = 11;
54-
54+
5555
using component_type = plonk_component<BlueprintFieldType, ArithmetizationParams, WitnessAmount, 0, 0>;
5656

5757
public:
@@ -138,7 +138,7 @@ namespace nil {
138138
assignment.witness(component.W(2), j) = Q.X;
139139
assignment.witness(component.W(3), j) = Q.Y;
140140
typename CurveType::template g1_type<crypto3::algebra::curves::coordinates::affine>::value_type zero = {
141-
0, 0};
141+
0, 1};
142142
if (P.X == zero.X && P.Y == zero.Y) {
143143
assignment.witness(component.W(4), j) = Q.X;
144144
assignment.witness(component.W(5), j) = Q.Y;
@@ -149,7 +149,7 @@ namespace nil {
149149
} else {
150150
if (Q.X == P.X && Q.Y == -P.Y) {
151151
assignment.witness(component.W(4), j) = 0;
152-
assignment.witness(component.W(5), j) = 0;
152+
assignment.witness(component.W(5), j) = 1;
153153
} else {
154154
assignment.witness(component.W(4), j) = (P + Q).X;
155155
assignment.witness(component.W(5), j) = (P + Q).Y;
@@ -192,7 +192,7 @@ namespace nil {
192192
return typename plonk_native_unified_addition<BlueprintFieldType, ArithmetizationParams, CurveType, 11>::result_type(
193193
component, start_row_index);
194194
}
195-
195+
196196
template<typename BlueprintFieldType, typename ArithmetizationParams, typename CurveType>
197197
void generate_gates(
198198
const plonk_native_unified_addition<BlueprintFieldType, ArithmetizationParams, CurveType, 11> &component,
@@ -250,7 +250,7 @@ namespace nil {
250250
auto constraint_12 = bp.add_constraint(
251251
(1 - (var(component.W(2), 0) - var(component.W(0), 0)) * var(component.W(8), 0) -
252252
(var(component.W(3), 0) + var(component.W(1), 0)) * var(component.W(9), 0)) *
253-
var(component.W(5), 0));
253+
(1 - var(component.W(5), 0)));
254254

255255
bp.add_gate(first_selector_index,
256256
{constraint_1, constraint_2, constraint_3, constraint_4, constraint_5, constraint_6,

test/algebra/curves/plonk/unified_addition.cpp

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ using namespace nil;
4949
template <typename CurveType>
5050
void test_unified_addition(std::vector<typename CurveType::base_field_type::value_type> public_input,
5151
typename CurveType::template g1_type<crypto3::algebra::curves::coordinates::affine>::value_type expected_res){
52-
52+
5353
using curve_type = CurveType;
5454
using BlueprintFieldType = typename curve_type::base_field_type;
5555

@@ -72,15 +72,16 @@ void test_unified_addition(std::vector<typename CurveType::base_field_type::valu
7272
{var(0, 0, false, var::column_type::public_input), var(0, 1, false, var::column_type::public_input)},
7373
{var(0, 2, false, var::column_type::public_input), var(0, 3, false, var::column_type::public_input)}};
7474

75-
auto result_check = [&expected_res, public_input](AssignmentType &assignment,
75+
auto result_check = [&expected_res, public_input](AssignmentType &assignment,
7676
typename component_type::result_type &real_res) {
77-
#ifdef BLUEPRINT_PLONK_PROFILING_ENABLED
78-
std::cout << "unified_addition test: " << "\n";
79-
std::cout << "input : " << public_input[0].data << " " << public_input[1].data << "\n";
80-
std::cout << "input : " << public_input[2].data << " " << public_input[3].data << "\n";
81-
std::cout << "expected: " << expected_res.X.data << " " << expected_res.Y.data << "\n";
82-
std::cout << "real : " << var_value(assignment, real_res.X).data << " " << var_value(assignment, real_res.Y).data << "\n\n";
83-
#endif
77+
78+
if((expected_res.X != var_value(assignment, real_res.X)) || (expected_res.Y != var_value(assignment, real_res.Y))) {
79+
std::cout << "unified_addition failed, expected result differs form circuit output: " << "\n";
80+
std::cout << "input : " << public_input[0].data << " " << public_input[1].data << "\n";
81+
std::cout << "input : " << public_input[2].data << " " << public_input[3].data << "\n";
82+
std::cout << "expected: " << expected_res.X.data << " " << expected_res.Y.data << "\n";
83+
std::cout << "real : " << var_value(assignment, real_res.X).data << " " << var_value(assignment, real_res.Y).data << "\n\n";
84+
}
8485
assert(expected_res.X == var_value(assignment, real_res.X));
8586
assert(expected_res.Y == var_value(assignment, real_res.Y));
8687
};
@@ -97,8 +98,7 @@ void test_unified_addition_with_zeroes() {
9798
boost::random::mt19937 seed_seq;
9899
generate_random_point.seed(seed_seq);
99100

100-
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type zero_algebraic = {0, 1};
101-
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type zero_circuits = {0, 0};
101+
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type zero_circuits = {0, 1};
102102
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type P = generate_random_point();
103103
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type Q = -P;
104104

@@ -146,28 +146,14 @@ void test_unified_addition_random_data() {
146146

147147
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type P = generate_random_point();
148148
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type Q = generate_random_point();
149-
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type zero = {0, 0};
150149
typename CurveType::template g1_type<nil::crypto3::algebra::curves::coordinates::affine>::value_type expected_res;
151150

152151
std::vector<typename CurveType::base_field_type::value_type> public_input;
153152

154153
for (std::size_t i = 0; i < RandomTestsAmount; i++){
155154
P = generate_random_point();
156155
Q = generate_random_point();
157-
158-
if (Q.X == zero.X && Q.Y == zero.Y) {
159-
expected_res = P;
160-
} else {
161-
if (P.X == zero.X && P.Y == zero.Y) {
162-
expected_res = Q;
163-
} else {
164-
if (P.X == Q.X && P.Y == -Q.Y) {
165-
expected_res = {0, 0};
166-
} else {
167-
expected_res = P + Q;
168-
}
169-
}
170-
}
156+
expected_res = P + Q;
171157

172158
public_input = {P.X, P.Y, Q.X, Q.Y};
173159
test_unified_addition<CurveType>(public_input, expected_res);

0 commit comments

Comments
 (0)