@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
30 lines • 2.02 kB
JavaScript
import { Sp1PlonkFiatShamir } from '../fiat-shamir/index.js';
import { compute_alpha_square_lagrange_0, compute_commitment_linearized_polynomial, customPiLagrange, evalVanishing, fold_quotient, fold_state, opening_of_linearized_polynomial, pi_contribution, preparePairing, } from './plonk_utils.js';
// expects only two public inputs as in Sp1 Plonk verifier
class PlonkVerifierPIOP {
constructor(VK) {
this.VK = VK;
}
piop(proof, pi0, pi1) {
const fs = Sp1PlonkFiatShamir.empty();
fs.squeezeGamma(proof, pi0, pi1, this.VK);
fs.squeezeBeta();
fs.squeezeAlpha(proof);
fs.squeezeZeta(proof);
const [zeta_pow_n, zh_eval] = evalVanishing(fs.zeta, this.VK);
const alpha_2_l0 = compute_alpha_square_lagrange_0(zh_eval, fs.zeta, fs.alpha, this.VK);
const [hx, hy] = fold_quotient(proof.h0_x, proof.h0_y, proof.h1_x, proof.h1_y, proof.h2_x, proof.h2_y, fs.zeta, zeta_pow_n, zh_eval);
const pis = pi_contribution([pi0, pi1], fs.zeta, zh_eval, this.VK.inv_domain_size, this.VK.omega);
const l_pi_commit = customPiLagrange(fs.zeta, zh_eval, proof.qcp_0_wire_x, proof.qcp_0_wire_y, this.VK);
const pi = pis.add(l_pi_commit).assertCanonical();
const linearized_opening = opening_of_linearized_polynomial(proof, fs.alpha, fs.beta, fs.gamma, pi, alpha_2_l0);
const [lcm_x, lcm_y] = compute_commitment_linearized_polynomial(this.VK, proof, fs.alpha, fs.beta, fs.gamma, fs.zeta, alpha_2_l0, hx, hy);
fs.squeezeGammaKzg(proof, this.VK, lcm_x, lcm_y, linearized_opening);
const [cm_x, cm_y, cm_opening] = fold_state(this.VK, proof, lcm_x, lcm_y, linearized_opening, fs.gamma_kzg);
const random = fs.squeezeRandomForKzg(proof, cm_x, cm_y);
const [kzg_cm_x, kzg_cm_y, neg_fq_x, neg_fq_y] = preparePairing(this.VK, proof, random, cm_x, cm_y, cm_opening, fs.zeta);
return [kzg_cm_x, kzg_cm_y, neg_fq_x, neg_fq_y];
}
}
export { PlonkVerifierPIOP };
//# sourceMappingURL=piop.js.map