@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
399 lines • 17.5 kB
JavaScript
import { Poseidon, verify, Cache } from 'o1js';
import { zkp0 } from './zkp0.js';
import fs from 'fs';
import { Sp1PlonkProof, deserializeProof } from '../proof.js';
import { Sp1PlonkFiatShamir } from '../fiat-shamir/index.js';
import { StateUntilPairing, empty } from '../state.js';
import { Accumulator } from '../accumulator.js';
import { zkp1 } from './zkp1.js';
import { zkp2 } from './zkp2.js';
import { WitnessTracker } from './witness_tracker.js';
import { zkp3 } from './zkp3.js';
import { zkp4 } from './zkp4.js';
import { zkp5 } from './zkp5.js';
import { zkp6 } from './zkp6.js';
import { zkp7 } from './zkp7.js';
import { zkp8 } from './zkp8.js';
import { zkp9 } from './zkp9.js';
import { zkp10 } from './zkp10.js';
import { zkp11 } from './zkp11.js';
import { zkp12 } from './zkp12.js';
import { zkp13 } from './zkp13.js';
import { KzgAccumulator } from '../../kzg/structs.js';
import { zkp15 } from './zkp15.js';
import { zkp14 } from './zkp14.js';
import { zkp16 } from './zkp16.js';
import { zkp17 } from './zkp17.js';
import { zkp18 } from './zkp18.js';
import { zkp19 } from './zkp19.js';
import { zkp20 } from './zkp20.js';
import { zkp21 } from './zkp21.js';
import { zkp22 } from './zkp22.js';
import { zkp23 } from './zkp23.js';
import { AuXWitness } from '../aux_witness.js';
import { parsePublicInputs } from '../parse_pi.js';
const args = process.argv;
const hexProof = args[3];
const programVk = args[4];
const hexPi = args[5];
const auxWtnsPath = args[6];
const auxWitness = AuXWitness.loadFromPath(auxWtnsPath);
const workDir = args[7];
const cacheDir = args[8];
const make_acc = () => {
const [pi0, pi1] = parsePublicInputs(programVk, hexPi);
let proof = new Sp1PlonkProof(deserializeProof(hexProof));
let fs = Sp1PlonkFiatShamir.empty();
let state = new StateUntilPairing(empty(pi0, pi1));
let acc = new Accumulator({
proof,
fs,
state,
});
return acc;
};
const acc_0 = make_acc();
const wt = new WitnessTracker(acc_0);
const acc_1 = wt.zkp0();
const acc_2 = wt.zkp1();
const acc_3 = wt.zkp2();
const acc_4 = wt.zkp3();
const acc_5 = wt.zkp4();
const acc_6 = wt.zkp5();
const acc_7 = wt.zkp6();
const acc_8 = wt.zkp7();
const acc_9 = wt.zkp8();
const acc_10 = wt.zkp9();
const acc_11 = wt.zkp10();
const acc_12 = wt.zkp11();
const [acc_13, line_hashes_13] = wt.zkp12(auxWitness.shift_power, auxWitness.c);
const [acc_14, line_hashes_14] = wt.zkp13();
const [acc_15, line_hashes_15] = wt.zkp14();
const [acc_16, line_hashes_16] = wt.zkp15();
const [acc_17, final_line_hashes] = wt.zkp16();
const acc_18 = wt.zkp17();
const acc_19 = wt.zkp18();
const acc_20 = wt.zkp19();
const acc_21 = wt.zkp20();
const acc_22 = wt.zkp21();
const acc_23 = wt.zkp22();
const _final = wt.zkp23();
const g = wt.g;
async function prove_zkp0() {
const vk0 = (await zkp0.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin0 = Poseidon.hashPacked(Accumulator, acc_0);
const proof0 = await zkp0.compute(cin0, acc_0);
const valid = await verify(proof0.proof, vk0);
console.log('valid zkp0?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp0.json`, JSON.stringify(proof0.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk0.json`, JSON.stringify(vk0), 'utf8');
}
async function prove_zkp1() {
const vk1 = (await zkp1.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin1 = Poseidon.hashPacked(Accumulator, acc_1);
const proof1 = await zkp1.compute(cin1, acc_1);
const valid = await verify(proof1.proof, vk1);
console.log('valid zkp1?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp1.json`, JSON.stringify(proof1.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk1.json`, JSON.stringify(vk1), 'utf8');
}
async function prove_zkp2() {
const vk2 = (await zkp2.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin2 = Poseidon.hashPacked(Accumulator, acc_2);
const proof2 = await zkp2.compute(cin2, acc_2);
const valid = await verify(proof2.proof, vk2);
console.log('valid zkp2?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp2.json`, JSON.stringify(proof2.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk2.json`, JSON.stringify(vk2), 'utf8');
}
async function prove_zkp3() {
const vk3 = (await zkp3.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin3 = Poseidon.hashPacked(Accumulator, acc_3);
const proof3 = await zkp3.compute(cin3, acc_3);
const valid = await verify(proof3.proof, vk3);
console.log('valid zkp3?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp3.json`, JSON.stringify(proof3.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk3.json`, JSON.stringify(vk3), 'utf8');
}
async function prove_zkp4() {
const vk4 = (await zkp4.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin4 = Poseidon.hashPacked(Accumulator, acc_4);
const proof4 = await zkp4.compute(cin4, acc_4);
const valid = await verify(proof4.proof, vk4);
console.log('valid zkp4?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp4.json`, JSON.stringify(proof4.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk4.json`, JSON.stringify(vk4), 'utf8');
}
async function prove_zkp5() {
const vk5 = (await zkp5.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin5 = Poseidon.hashPacked(Accumulator, acc_5);
const proof5 = await zkp5.compute(cin5, acc_5);
const valid = await verify(proof5.proof, vk5);
console.log('valid zkp5?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp5.json`, JSON.stringify(proof5.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk5.json`, JSON.stringify(vk5), 'utf8');
}
async function prove_zkp6() {
const vk6 = (await zkp6.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin6 = Poseidon.hashPacked(Accumulator, acc_6);
const proof6 = await zkp6.compute(cin6, acc_6);
const valid = await verify(proof6.proof, vk6);
console.log('valid zkp6?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp6.json`, JSON.stringify(proof6.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk6.json`, JSON.stringify(vk6), 'utf8');
}
async function prove_zkp7() {
const vk7 = (await zkp7.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin7 = Poseidon.hashPacked(Accumulator, acc_7);
const proof7 = await zkp7.compute(cin7, acc_7);
const valid = await verify(proof7.proof, vk7);
console.log('valid zkp7?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp7.json`, JSON.stringify(proof7.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk7.json`, JSON.stringify(vk7), 'utf8');
}
async function prove_zkp8() {
const vk8 = (await zkp8.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin8 = Poseidon.hashPacked(Accumulator, acc_8);
const proof8 = await zkp8.compute(cin8, acc_8);
const valid = await verify(proof8.proof, vk8);
console.log('valid zkp8?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp8.json`, JSON.stringify(proof8.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk8.json`, JSON.stringify(vk8), 'utf8');
}
async function prove_zkp9() {
const vk9 = (await zkp9.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin9 = Poseidon.hashPacked(Accumulator, acc_9);
const proof9 = await zkp9.compute(cin9, acc_9);
const valid = await verify(proof9.proof, vk9);
console.log('valid zkp9?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp9.json`, JSON.stringify(proof9.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk9.json`, JSON.stringify(vk9), 'utf8');
}
async function prove_zkp10() {
const vk10 = (await zkp10.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin10 = Poseidon.hashPacked(Accumulator, acc_10);
const proof10 = await zkp10.compute(cin10, acc_10);
const valid = await verify(proof10.proof, vk10);
console.log('valid zkp10?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp10.json`, JSON.stringify(proof10.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk10.json`, JSON.stringify(vk10), 'utf8');
}
async function prove_zkp11() {
const vk11 = (await zkp11.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin11 = Poseidon.hashPacked(Accumulator, acc_11);
const proof11 = await zkp11.compute(cin11, acc_11);
const valid = await verify(proof11.proof, vk11);
console.log('valid zkp11?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp11.json`, JSON.stringify(proof11.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk11.json`, JSON.stringify(vk11), 'utf8');
}
async function prove_zkp12() {
const vk12 = (await zkp12.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin12 = Poseidon.hashPacked(Accumulator, acc_12);
const proof12 = await zkp12.compute(cin12, acc_12, auxWitness.shift_power, auxWitness.c);
const valid = await verify(proof12.proof, vk12);
console.log('valid zkp12?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp12.json`, JSON.stringify(proof12.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk12.json`, JSON.stringify(vk12), 'utf8');
}
async function prove_zkp13() {
const vk13 = (await zkp13.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin13 = Poseidon.hashPacked(KzgAccumulator, acc_13);
const proof13 = await zkp13.compute(cin13, acc_13, line_hashes_13);
const valid = await verify(proof13.proof, vk13);
console.log('valid zkp13?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp13.json`, JSON.stringify(proof13.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk13.json`, JSON.stringify(vk13), 'utf8');
}
async function prove_zkp14() {
const vk14 = (await zkp14.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin14 = Poseidon.hashPacked(KzgAccumulator, acc_14);
const proof14 = await zkp14.compute(cin14, acc_14, line_hashes_14);
const valid = await verify(proof14.proof, vk14);
console.log('valid zkp14?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp14.json`, JSON.stringify(proof14.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk14.json`, JSON.stringify(vk14), 'utf8');
}
async function prove_zkp15() {
const vk15 = (await zkp15.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin15 = Poseidon.hashPacked(KzgAccumulator, acc_15);
const proof15 = await zkp15.compute(cin15, acc_15, line_hashes_15);
const valid = await verify(proof15.proof, vk15);
console.log('valid zkp15?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp15.json`, JSON.stringify(proof15.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk15.json`, JSON.stringify(vk15), 'utf8');
}
async function prove_zkp16() {
const vk16 = (await zkp16.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin16 = Poseidon.hashPacked(KzgAccumulator, acc_16);
const proof16 = await zkp16.compute(cin16, acc_16, line_hashes_16);
const valid = await verify(proof16.proof, vk16);
console.log('valid zkp16?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp16.json`, JSON.stringify(proof16.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk16.json`, JSON.stringify(vk16), 'utf8');
}
async function prove_zkp17() {
const vk17 = (await zkp17.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin17 = Poseidon.hashPacked(KzgAccumulator, acc_17);
const proof17 = await zkp17.compute(cin17, acc_17, g.slice(0, 9), final_line_hashes.slice(9));
const valid = await verify(proof17.proof, vk17);
console.log('valid zkp17?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp17.json`, JSON.stringify(proof17.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk17.json`, JSON.stringify(vk17), 'utf8');
}
async function prove_zkp18() {
const vk18 = (await zkp18.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin18 = Poseidon.hashPacked(KzgAccumulator, acc_18);
const proof18 = await zkp18.compute(cin18, acc_18, final_line_hashes.slice(0, 9), g.slice(9, 9 + 11), final_line_hashes.slice(20));
const valid = await verify(proof18.proof, vk18);
console.log('valid zkp18?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp18.json`, JSON.stringify(proof18.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk18.json`, JSON.stringify(vk18), 'utf8');
}
async function prove_zkp19() {
const vk19 = (await zkp19.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin19 = Poseidon.hashPacked(KzgAccumulator, acc_19);
const proof19 = await zkp19.compute(cin19, acc_19, final_line_hashes.slice(0, 20), g.slice(20, 20 + 11), final_line_hashes.slice(31));
const valid = await verify(proof19.proof, vk19);
console.log('valid zkp19?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp19.json`, JSON.stringify(proof19.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk19.json`, JSON.stringify(vk19), 'utf8');
}
async function prove_zkp20() {
const vk20 = (await zkp20.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin20 = Poseidon.hashPacked(KzgAccumulator, acc_20);
const proof20 = await zkp20.compute(cin20, acc_20, final_line_hashes.slice(0, 31), g.slice(31, 31 + 11), final_line_hashes.slice(42));
const valid = await verify(proof20.proof, vk20);
console.log('valid zkp20?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp20.json`, JSON.stringify(proof20.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk20.json`, JSON.stringify(vk20), 'utf8');
}
async function prove_zkp21() {
const vk21 = (await zkp21.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin21 = Poseidon.hashPacked(KzgAccumulator, acc_21);
const proof21 = await zkp21.compute(cin21, acc_21, final_line_hashes.slice(0, 42), g.slice(42, 42 + 11), final_line_hashes.slice(53));
const valid = await verify(proof21.proof, vk21);
console.log('valid zkp21?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp21.json`, JSON.stringify(proof21.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk21.json`, JSON.stringify(vk21), 'utf8');
}
async function prove_zkp22() {
const vk22 = (await zkp22.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin22 = Poseidon.hashPacked(KzgAccumulator, acc_22);
const proof22 = await zkp22.compute(cin22, acc_22, final_line_hashes.slice(0, 53), g.slice(53, 53 + 11), final_line_hashes.slice(64));
const valid = await verify(proof22.proof, vk22);
console.log('valid zkp22?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp22.json`, JSON.stringify(proof22.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk22.json`, JSON.stringify(vk22), 'utf8');
}
async function prove_zkp23() {
const vk23 = (await zkp23.compile({ cache: Cache.FileSystem(cacheDir) }))
.verificationKey;
let cin23 = Poseidon.hashPacked(KzgAccumulator, acc_23);
const proof23 = await zkp23.compute(cin23, acc_23, final_line_hashes.slice(0, 64), g.slice(-1));
const valid = await verify(proof23.proof, vk23);
console.log('valid zkp23?: ', valid);
fs.writeFileSync(`${workDir}/proofs/layer0/zkp23.json`, JSON.stringify(proof23.proof), 'utf8');
fs.writeFileSync(`${workDir}/vks/vk23.json`, JSON.stringify(vk23), 'utf8');
}
if (!fs.existsSync(workDir)) {
fs.mkdirSync(workDir);
}
switch (process.argv[2]) {
case 'zkp0':
await prove_zkp0();
break;
case 'zkp1':
await prove_zkp1();
break;
case 'zkp2':
await prove_zkp2();
break;
case 'zkp3':
await prove_zkp3();
break;
case 'zkp4':
await prove_zkp4();
break;
case 'zkp5':
await prove_zkp5();
break;
case 'zkp6':
await prove_zkp6();
break;
case 'zkp7':
await prove_zkp7();
break;
case 'zkp8':
await prove_zkp8();
break;
case 'zkp9':
await prove_zkp9();
break;
case 'zkp10':
await prove_zkp10();
break;
case 'zkp11':
await prove_zkp11();
break;
case 'zkp12':
await prove_zkp12();
break;
case 'zkp13':
await prove_zkp13();
break;
case 'zkp14':
await prove_zkp14();
break;
case 'zkp15':
await prove_zkp15();
break;
case 'zkp16':
await prove_zkp16();
break;
case 'zkp17':
await prove_zkp17();
break;
case 'zkp18':
await prove_zkp18();
break;
case 'zkp19':
await prove_zkp19();
break;
case 'zkp20':
await prove_zkp20();
break;
case 'zkp21':
await prove_zkp21();
break;
case 'zkp22':
await prove_zkp22();
break;
case 'zkp23':
await prove_zkp23();
break;
}
//# sourceMappingURL=prove_zkps.js.map