@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
59 lines • 3.02 kB
JavaScript
import { Provable } from 'o1js';
import v8 from 'v8';
import { Sp1PlonkVerifier } from './verifier.js';
import { VK } from './vk.js';
import { FrC } from '../towers/fr.js';
import { Sp1PlonkProof, deserializeProof } from './proof.js';
import { parsePublicInputs } from './parse_pi.js';
import { AuXWitness } from './aux_witness.js';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const g2_lines_required = require('./mm_loop/g2_lines.json');
const tau_lines_required = require('./mm_loop/tau_lines.json');
//import g2_lines_required from './mm_loop/g2_lines.json';
//import tau_lines_required from './mm_loop/tau_lines.json';
const g2_lines = JSON.stringify(g2_lines_required); //fs.readFileSync(`./src/plonk/mm_loop/g2_lines.json`, 'utf8');
const tau_lines = JSON.stringify(tau_lines_required); //fs.readFileSync(`./src/plonk/mm_loop/tau_lines.json`, 'utf8');
const args = process.argv;
const hexProof = args[2];
const programVk = args[3];
const hexPi = args[4];
// SP1 v5: args[5]=auxWtnsPath (only 2 public inputs).
// SP1 v6: pi2/pi3/pi4 inserted at args[5..7], auxWtnsPath shifted to args[8].
const pi2 = args[5];
const pi3 = args[6];
const pi4 = args[7];
const auxWtnsPath = args[8];
const auxWitness = AuXWitness.loadFromPath(auxWtnsPath);
const Verifier = new Sp1PlonkVerifier(VK, g2_lines, tau_lines);
function main() {
const [pi0, pi1] = Provable.witness(Provable.Array(FrC.provable, 2), () => parsePublicInputs(programVk, hexPi));
// SP1 v5: only pi0/pi1 passed to verify.
// SP1 v6: pi2/pi3/pi4 (exit_code/vk_root/proof_nonce) added.
const pi2F = Provable.witness(FrC.provable, () => FrC.from(pi2));
const pi3F = Provable.witness(FrC.provable, () => FrC.from(pi3));
const pi4F = Provable.witness(FrC.provable, () => FrC.from(pi4));
const proof = Provable.witness(Sp1PlonkProof, () => new Sp1PlonkProof(deserializeProof(hexProof)));
Verifier.verify(proof, pi0, pi1, pi2F, pi3F, pi4F, auxWitness);
}
// npm run build && node --max-old-space-size=65536 build/src/plonk/e2e_verify.js
(async () => {
console.time('running Fp constant version');
main();
console.timeEnd('running Fp constant version');
console.time('running Fp witness generation & checks');
await Provable.runAndCheck(main);
console.timeEnd('running Fp witness generation & checks');
console.time('creating Fp constraint system');
let cs = await Provable.constraintSystem(main);
console.timeEnd('creating Fp constraint system');
console.log(cs.summary());
const totalHeapSize = v8.getHeapStatistics().total_available_size;
let totalHeapSizeinGB = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log(`Total heap size: ${totalHeapSizeinGB} GB`);
// used_heap_size
const usedHeapSize = v8.getHeapStatistics().used_heap_size;
let usedHeapSizeinGB = (usedHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log(`Used heap size: ${usedHeapSizeinGB} GB`);
})();
//# sourceMappingURL=e2e_verify.js.map