@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
71 lines • 3.01 kB
JavaScript
/*
Accumulate lines to utilize sparse multiplications:
- It checks if lines are correct (if point is not fixed) and evaluates them with sparse mul
*/
import { G2Affine } from '../ec/index.js';
import { AffineCache } from '../lines/precompute.js';
import { ATE_LOOP_COUNT } from '../towers/index.js';
class LineAccumulator {
static accumulate(b_lines, gamma_lines, delta_lines, B, negA, PI, C) {
const g = [];
const a_cache = new AffineCache(negA);
const c_cache = new AffineCache(C);
const pi_cache = new AffineCache(PI);
let T = new G2Affine({ x: B.x, y: B.y });
const negB = B.neg();
let idx = 0;
let line_cnt = 0;
for (let i = 1; i < ATE_LOOP_COUNT.length; i++) {
idx = i - 1;
const b_line = b_lines[line_cnt];
const delta_line = delta_lines[line_cnt];
const gamma_line = gamma_lines[line_cnt];
line_cnt += 1;
b_line.assert_is_tangent(T);
g.push(b_line.psi(a_cache));
g[idx] = g[idx].sparse_mul(delta_line.psi(c_cache));
g[idx] = g[idx].sparse_mul(gamma_line.psi(pi_cache));
T = T.double_from_line(b_line.lambda);
if (ATE_LOOP_COUNT[i] == 1 || ATE_LOOP_COUNT[i] == -1) {
const b_line = b_lines[line_cnt];
const delta_line = delta_lines[line_cnt];
const gamma_line = gamma_lines[line_cnt];
line_cnt += 1;
if (ATE_LOOP_COUNT[i] == 1) {
b_line.assert_is_line(T, B);
T = T.add_from_line(b_line.lambda, B);
}
else {
b_line.assert_is_line(T, negB);
T = T.add_from_line(b_line.lambda, negB);
}
g[idx] = g[idx].sparse_mul(b_line.psi(a_cache));
g[idx] = g[idx].sparse_mul(delta_line.psi(c_cache));
g[idx] = g[idx].sparse_mul(gamma_line.psi(pi_cache));
}
}
let b_line = b_lines[line_cnt];
let delta_line = delta_lines[line_cnt];
let gamma_line = gamma_lines[line_cnt];
line_cnt += 1;
idx += 1;
g.push(b_line.psi(a_cache));
g[idx] = g[idx].sparse_mul(delta_line.psi(c_cache));
g[idx] = g[idx].sparse_mul(gamma_line.psi(pi_cache));
let piB = B.frobenius();
b_line.assert_is_line(T, piB);
T = T.add_from_line(b_line.lambda, piB);
b_line = b_lines[line_cnt];
delta_line = delta_lines[line_cnt];
gamma_line = gamma_lines[line_cnt];
line_cnt += 1;
g[idx] = g[idx].sparse_mul(b_line.psi(a_cache));
g[idx] = g[idx].sparse_mul(delta_line.psi(c_cache));
g[idx] = g[idx].sparse_mul(gamma_line.psi(pi_cache));
let pi_2_B = piB.negative_frobenius();
b_line.assert_is_line(T, pi_2_B);
return g;
}
}
export { LineAccumulator };
//# sourceMappingURL=accumulate_lines.js.map