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

Commit 7ffffb1

Browse files
committed
EVM verifier for lookups issues fixed #65
1 parent 97792e5 commit 7ffffb1

File tree

5 files changed

+144
-150
lines changed

5 files changed

+144
-150
lines changed

include/nil/blueprint/transpiler/lpc_scheme_gen.hpp

+8-21
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,6 @@ namespace nil {
4444
PlaceholderParams
4545
>::preprocessed_data_type::common_data_type;
4646

47-
std::string rot_string (int j){
48-
if(j == 0) return "xi"; else
49-
if(j == 1 ) return "mulmod(xi, omega, modulus)"; else
50-
if(j == -1) return "mulmod(xi, inversed_omega, modulus)"; else
51-
if(j > 0) return "mulmod(xi, field.pow_small(omega, " + to_string(j) + ", modulus), modulus)"; else
52-
if(j < 0) return "mulmod(xi, field.pow_small(inversed_omega, " + to_string(-j) + ", modulus), modulus)";
53-
return "";
54-
}
55-
56-
5747
template<typename PlaceholderParams>
5848
void commitment_scheme_replaces(
5949
transpiler_replacements& replacements,
@@ -72,17 +62,14 @@ namespace nil {
7262
"evm" // Generator mode
7363
);
7464

75-
/* std::stringstream points_ids;
76-
for(std::size_t i = 0; i < points.size(); i++){
77-
std::size_t j = 0;
78-
for(const auto &unique_point:unique_points){
79-
if(points[i] == unique_point){
80-
points_ids << std::hex << std::setw(2) << std::setfill('0') << j;
81-
break;
82-
}
83-
j++;
84-
}
85-
}*/
65+
for( std::size_t i = 0; i < z_points_indices.size(); i ++){
66+
std::cout << "[" << i <<"]" << "=>" << z_points_indices[i] << " ";
67+
}
68+
std::cout << std::endl;
69+
70+
for( std::size_t i = 0; i < poly_ids.size(); i++ ){
71+
std::cout << "point " << i << " has " << poly_ids[i].size() <<" polys." << std::endl;
72+
}
8673

8774
std::stringstream points_initializer;
8875
std::size_t i = 0;

include/nil/blueprint/transpiler/templates/commitment_scheme.hpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,10 @@ unchecked {
260260
{
261261
uint256 offset;
262262
263-
if (challenge!= transcript.get_field_challenge(tr_state, modulus)) return false;
263+
if (challenge!= transcript.get_field_challenge(tr_state, modulus)) {
264+
console.log("Wrong challenge");
265+
return false;
266+
}
264267
265268
for(uint8 i = 0; i < batches_num;){
266269
transcript.update_transcript_b32(tr_state, bytes32(commitments[i]));
@@ -348,6 +351,9 @@ unchecked {
348351
off -= 0x20;
349352
i++;
350353
}
354+
for(uint256 i = 0; i < state.unique_eval_points.length;){
355+
i++;
356+
}
351357
}
352358
$ETA_VALUES_VERIFICATION$
353359

include/nil/blueprint/transpiler/util.hpp

+77-58
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,13 @@ namespace nil {
4949
return strstr.str();
5050
}
5151

52-
static inline std::string rot_string (int j, std::string mode){
52+
static inline std::string rot_string (int j, std::size_t rows_amount, std::string mode){
53+
int abs_j = j>0? j: -j;
54+
int other_j = rows_amount - abs_j;
55+
if(other_j < abs_j) {
56+
j = j > 0? -other_j: other_j;
57+
}
58+
5359
if( mode == "recursive"){
5460
if(j == 0) return "xi"; else
5561
if(j == 1 ) return "xi*omega"; else
@@ -60,8 +66,8 @@ namespace nil {
6066
if(j == 0) return "xi"; else
6167
if(j == 1 ) return "mulmod(xi, omega, modulus)"; else
6268
if(j == -1) return "mulmod(xi, inversed_omega, modulus)"; else
63-
if(j > 0) return "mulmod(xi,pow_small(omega, " + to_string(j) + ", modulus), modulus)"; else
64-
if(j < 0) return "mulmod(xi,pow_small(omega, " + to_string(-j) + ", modulus), modulus)";
69+
if(j > 0) return "mulmod(xi, field.pow_small(omega, " + to_string(j) + ", modulus), modulus)"; else
70+
if(j < 0) return "mulmod(xi, field.pow_small(inversed_omega, " + to_string(-j) + ", modulus), modulus)";
6571
}
6672
return "";
6773
}
@@ -104,9 +110,10 @@ namespace nil {
104110
std::vector<std::string> singles;
105111
std::map<std::string, std::size_t> singles_map;
106112
std::vector<std::vector<std::size_t>> poly_ids;
113+
std::size_t rows_amount = common_data.rows_amount;
107114

108-
singles.push_back(rot_string(0, mode));
109-
singles_map[rot_string(0, mode)] = singles_map.size();
115+
singles.push_back(rot_string(0, rows_amount, mode));
116+
singles_map[rot_string(0, rows_amount, mode)] = singles_map.size();
110117

111118
singles.push_back("eta");
112119
singles_map["eta"] = singles_map.size();
@@ -115,132 +122,144 @@ namespace nil {
115122
// Sigma and permutation polys
116123
std::size_t count = 0;
117124
for( std::size_t i = 0; i < permutation_size; i++){
118-
poly_ids[singles_map[rot_string(0, mode)]].push_back(count);
125+
poly_ids[singles_map[rot_string(0, rows_amount, mode)]].push_back(count);
119126
poly_ids[singles_map["eta"]].push_back(count);
120-
z_points_indices.push_back(singles_map[rot_string(0, mode)]);
127+
z_points_indices.push_back(singles_map[rot_string(0, rows_amount, mode)]);
121128
z_points_indices.push_back(singles_map["eta"]);
122129
poly_ids[singles_map["eta"]].push_back(count+1);
123-
poly_ids[singles_map[rot_string(0, mode)]].push_back(count+1);
124-
z_points_indices.push_back(singles_map[rot_string(0, mode)]);
130+
poly_ids[singles_map[rot_string(0, rows_amount, mode)]].push_back(count+1);
131+
z_points_indices.push_back(singles_map[rot_string(0, rows_amount, mode)]);
125132
z_points_indices.push_back(singles_map["eta"]);
126133
count += 2;
127134
}
135+
std::cout << "Permutations are done!" << std::endl;
128136

129137
// Special selectors
130-
singles.push_back(rot_string(1, mode));
131-
singles_map[rot_string(1, mode)] = singles_map.size();
138+
singles.push_back(rot_string(1, rows_amount, mode));
139+
singles_map[rot_string(1, rows_amount, mode)] = singles_map.size();
132140
poly_ids.resize(singles.size());
133141

134142
poly_ids[singles_map["eta"]].push_back(count);
135-
poly_ids[singles_map[rot_string(0, mode)]].push_back(count);
136-
poly_ids[singles_map[rot_string(1, mode)]].push_back(count);
137-
z_points_indices.push_back(singles_map[rot_string(0, mode)]);
138-
z_points_indices.push_back(singles_map[rot_string(1, mode)]);
143+
poly_ids[singles_map[rot_string(0, rows_amount, mode)]].push_back(count);
144+
poly_ids[singles_map[rot_string(1, rows_amount, mode)]].push_back(count);
145+
z_points_indices.push_back(singles_map[rot_string(0, rows_amount, mode)]);
146+
z_points_indices.push_back(singles_map[rot_string(1, rows_amount, mode)]);
139147
z_points_indices.push_back(singles_map["eta"]);
140148
count++;
141149
poly_ids[singles_map["eta"]].push_back(count);
142-
poly_ids[singles_map[rot_string(0, mode)]].push_back(count);
143-
poly_ids[singles_map[rot_string(1, mode)]].push_back(count);
144-
z_points_indices.push_back(singles_map[rot_string(0, mode)]);
145-
z_points_indices.push_back(singles_map[rot_string(1, mode)]);
150+
poly_ids[singles_map[rot_string(0, rows_amount, mode)]].push_back(count);
151+
poly_ids[singles_map[rot_string(1, rows_amount, mode)]].push_back(count);
152+
z_points_indices.push_back(singles_map[rot_string(0, rows_amount, mode)]);
153+
z_points_indices.push_back(singles_map[rot_string(1, rows_amount, mode)]);
146154
z_points_indices.push_back(singles_map["eta"]);
147155
count++;
148-
156+
std::cout << "Special selectors are done!" << std::endl;
149157

150158
for(std::size_t i = 0; i < PlaceholderParams::constant_columns; i++){
151159
std::stringstream str;
152160
for(auto j:common_data.columns_rotations[i + PlaceholderParams::witness_columns + PlaceholderParams::public_input_columns]){
153-
if(singles_map.find(rot_string(j, mode)) == singles_map.end()){
154-
singles_map[rot_string(j, mode)] = singles_map.size();
155-
singles.push_back(rot_string(j, mode));
161+
if(singles_map.find(rot_string(j, rows_amount, mode)) == singles_map.end()){
162+
singles_map[rot_string(j, rows_amount, mode)] = singles_map.size();
163+
singles.push_back(rot_string(j, rows_amount, mode));
156164
poly_ids.resize(singles.size());
157165
}
158-
poly_ids[singles_map[rot_string(j, mode)]].push_back(count);
159-
z_points_indices.push_back(singles_map[rot_string(j, mode)]);
166+
poly_ids[singles_map[rot_string(j, rows_amount, mode)]].push_back(count);
167+
z_points_indices.push_back(singles_map[rot_string(j, rows_amount, mode)]);
160168
}
161169
poly_ids[singles_map["eta"]].push_back(count);
162170
z_points_indices.push_back(singles_map["eta"]);
163171
count++;
164172
}
173+
std::cout << "Constants are done!" << std::endl;
165174

166175
for(std::size_t i = 0; i < PlaceholderParams::selector_columns; i++){
167176
std::stringstream str;
168177
for(auto j:common_data.columns_rotations[i + PlaceholderParams::witness_columns + PlaceholderParams::public_input_columns + PlaceholderParams::constant_columns]){
169-
if(singles_map.find(rot_string(j, mode)) == singles_map.end()){
170-
singles_map[rot_string(j, mode)] = singles_map.size();
171-
singles.push_back(rot_string(j, mode));
178+
if(singles_map.find(rot_string(j, rows_amount, mode)) == singles_map.end()){
179+
singles_map[rot_string(j, rows_amount, mode)] = singles_map.size();
180+
singles.push_back(rot_string(j, rows_amount, mode));
172181
poly_ids.resize(singles.size());
173182
}
174-
poly_ids[singles_map[rot_string(j, mode)]].push_back(count);
175-
z_points_indices.push_back(singles_map[rot_string(j, mode)]);
183+
poly_ids[singles_map[rot_string(j, rows_amount, mode)]].push_back(count);
184+
z_points_indices.push_back(singles_map[rot_string(j, rows_amount, mode)]);
176185
}
177186
poly_ids[singles_map["eta"]].push_back(count);
178187
z_points_indices.push_back(singles_map["eta"]);
179188
count++;
180189
}
190+
std::cout << "Selectors are done!" << std::endl;
181191

182192
for(std::size_t i = 0; i < PlaceholderParams::witness_columns; i++){
183193
std::stringstream str;
184194
for(auto j:common_data.columns_rotations[i]){
185-
if(singles_map.find(rot_string(j, mode)) == singles_map.end()){
186-
singles_map[rot_string(j, mode)] = singles_map.size();
187-
singles.push_back(rot_string(j, mode));
195+
if(singles_map.find(rot_string(j, rows_amount, mode)) == singles_map.end()){
196+
singles_map[rot_string(j, rows_amount, mode)] = singles_map.size();
197+
singles.push_back(rot_string(j, rows_amount, mode));
188198
poly_ids.resize(singles.size());
189199
}
190-
poly_ids[singles_map[rot_string(j, mode)]].push_back(count);
191-
z_points_indices.push_back(singles_map[rot_string(j, mode)]);
200+
poly_ids[singles_map[rot_string(j, rows_amount, mode)]].push_back(count);
201+
z_points_indices.push_back(singles_map[rot_string(j, rows_amount, mode)]);
192202
}
193203
count++;
194204
}
205+
std::cout << "Witnesses are done!" << std::endl;
195206

196207
for(std::size_t i = 0; i < PlaceholderParams::public_input_columns; i++){
197208
std::stringstream str;
198209
for(auto j:common_data.columns_rotations[i + PlaceholderParams::witness_columns]){
199-
if(singles_map.find(rot_string(j, mode)) == singles_map.end()){
200-
singles_map[rot_string(j, mode)] = singles_map.size();
201-
singles.push_back(rot_string(j, mode));
210+
if(singles_map.find(rot_string(j, rows_amount, mode)) == singles_map.end()){
211+
singles_map[rot_string(j, rows_amount, mode)] = singles_map.size();
212+
singles.push_back(rot_string(j, rows_amount, mode));
202213
poly_ids.resize(singles.size());
203214
}
204-
poly_ids[singles_map[rot_string(j, mode)]].push_back(count);
205-
z_points_indices.push_back(singles_map[rot_string(j, mode)]);
215+
poly_ids[singles_map[rot_string(j, rows_amount, mode)]].push_back(count);
216+
z_points_indices.push_back(singles_map[rot_string(j, rows_amount, mode)]);
206217
}
207218
count++;
208219
}
220+
std::cout << "Public inputs are done!" << std::endl;
209221

210222
// Permutation argument
211-
poly_ids[singles_map[rot_string(0, mode)]].push_back(count);
212-
poly_ids[singles_map[rot_string(1, mode)]].push_back(count);
213-
z_points_indices.push_back(singles_map[rot_string(0, mode)]);
214-
z_points_indices.push_back(singles_map[rot_string(1, mode)]);
223+
poly_ids[singles_map[rot_string(0, rows_amount, mode)]].push_back(count);
224+
poly_ids[singles_map[rot_string(1, rows_amount, mode)]].push_back(count);
225+
z_points_indices.push_back(singles_map[rot_string(0, rows_amount, mode)]);
226+
z_points_indices.push_back(singles_map[rot_string(1, rows_amount, mode)]);
215227
count++;
228+
std::cout << "Permutation polynomials are done!" << std::endl;
216229

217230
// Lookup permutation
218231
if(use_lookups){
219-
poly_ids[singles_map[rot_string(0, mode)]].push_back(count);
220-
poly_ids[singles_map[rot_string(1, mode)]].push_back(count);
221-
z_points_indices.push_back(singles_map[rot_string(0, mode)]);
222-
z_points_indices.push_back(singles_map[rot_string(1, mode)]);
232+
poly_ids[singles_map[rot_string(0, rows_amount, mode)]].push_back(count);
233+
poly_ids[singles_map[rot_string(1, rows_amount, mode)]].push_back(count);
234+
z_points_indices.push_back(singles_map[rot_string(0, rows_amount, mode)]);
235+
z_points_indices.push_back(singles_map[rot_string(1, rows_amount, mode)]);
223236
count++;
237+
std::cout << "Lookup permutation polynomials are done!" << std::endl;
224238
}
225239
// Quotient
226240
for(std::size_t i = 0; i < quotient_size; i++){
227-
poly_ids[singles_map[rot_string(0, mode)]].push_back(count);
228-
z_points_indices.push_back(singles_map[rot_string(0, mode)]);
241+
poly_ids[singles_map[rot_string(0, rows_amount, mode)]].push_back(count);
242+
z_points_indices.push_back(singles_map[rot_string(0, rows_amount, mode)]);
229243
count++;
230244
}
245+
std::cout << "Quotient polynomials are done!" << std::endl;
231246
// Lookup batch
232247
if(use_lookups){
233-
singles_map[rot_string(common_data.usable_rows_amount, mode)] = singles.size();
234-
singles.push_back(rot_string(common_data.usable_rows_amount, mode));
248+
if(singles_map.find(rot_string(common_data.usable_rows_amount, rows_amount, mode)) == singles_map.end()){
249+
singles_map[rot_string(common_data.usable_rows_amount, rows_amount, mode)] = singles.size();
250+
singles.push_back(rot_string(common_data.usable_rows_amount, rows_amount, mode));
251+
poly_ids.resize(singles.size());
252+
}
235253
for( std::size_t i = 0; i < sorted_size; i++ ){
236-
poly_ids[singles_map[rot_string(0, mode)]].push_back(count);
237-
z_points_indices.push_back(singles_map[rot_string(0, mode)]);
238-
poly_ids[singles_map[rot_string(1, mode)]].push_back(count);
239-
z_points_indices.push_back(singles_map[rot_string(1, mode)]);
240-
poly_ids[singles_map[rot_string(common_data.usable_rows_amount, mode)]].push_back(count);
241-
z_points_indices.push_back(singles_map[rot_string(common_data.usable_rows_amount, mode)]);
254+
poly_ids[singles_map[rot_string(0, rows_amount, mode)]].push_back(count);
255+
z_points_indices.push_back(singles_map[rot_string(0, rows_amount, mode)]);
256+
poly_ids[singles_map[rot_string(1, rows_amount, mode)]].push_back(count);
257+
z_points_indices.push_back(singles_map[rot_string(1, rows_amount, mode)]);
258+
poly_ids[singles_map[rot_string(common_data.usable_rows_amount, rows_amount, mode)]].push_back(count);
259+
z_points_indices.push_back(singles_map[rot_string(common_data.usable_rows_amount, rows_amount, mode)]);
242260
count++;
243261
}
262+
std::cout << "Lookup polynomials are done!" << std::endl;
244263
}
245264

246265
return std::make_tuple(z_points_indices, singles, singles_map, poly_ids);

test/detail/circuits.hpp

-1
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,6 @@ namespace nil {
924924
typename FieldType::value_type zero = FieldType::value_type::zero();
925925

926926
auto r = rnd() % 7;
927-
table[0] = std::vector<typename FieldType::value_type>(16);
928927
std::size_t j = 0;
929928
for( std::size_t i = 0; i < 7; i++){
930929
if( j == r ) j++;

0 commit comments

Comments
 (0)