@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
93 lines • 4.73 kB
JavaScript
import { Bool, Field, VerificationKey, Cache } from 'o1js';
import fs from 'fs';
import { NodeProofLeft, NodeProofRight, ZkpProofLeft, ZkpProofRight, } from './structs.js';
import { layer1 } from './compressor/layer1node.js';
import { node } from './compressor/compressor.js';
const NUM_OF_ZKPS = parseInt(process.argv[2]);
var LeftOrRight;
(function (LeftOrRight) {
LeftOrRight[LeftOrRight["LEFT"] = 0] = "LEFT";
LeftOrRight[LeftOrRight["RIGHT"] = 1] = "RIGHT";
})(LeftOrRight || (LeftOrRight = {}));
const resolveLeafProof = async (index, side) => {
// if index is gt than number of zkps just make dummy proof with last proof input/output
if (index >= NUM_OF_ZKPS) {
const pLast = await ZkpProofLeft.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/proofs/layer0/zkp${NUM_OF_ZKPS - 1}.json`, 'utf8')));
if (side === LeftOrRight.LEFT) {
return ZkpProofLeft.dummy(pLast.publicOutput, pLast.publicOutput, 0);
}
else {
return ZkpProofRight.dummy(pLast.publicOutput, pLast.publicOutput, 0);
}
}
if (side === LeftOrRight.LEFT) {
// console.log("reading zkp: ", index);
return await ZkpProofLeft.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/proofs/layer0/zkp${index}.json`, 'utf8')));
}
else {
// console.log("reading zkp: ", index);
return await ZkpProofRight.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/proofs/layer0/zkp${index}.json`, 'utf8')));
}
};
const resolveLeafVk = async (index) => {
// if dummy then just return vk0
if (index >= NUM_OF_ZKPS) {
return await VerificationKey.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/vks/vk${0}.json`, 'utf8')));
}
// console.log("reading vk: ", index);
return await VerificationKey.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/vks/vk${index}.json`, 'utf8')));
};
const proveLayer1 = async (index) => {
await layer1.compile({ cache: Cache.FileSystem(cacheDir) });
const leftIdx = index * 2;
const rightIdx = leftIdx + 1;
const vkLeft = await resolveLeafVk(leftIdx);
const vkRight = await resolveLeafVk(rightIdx);
const piLeft = await resolveLeafProof(leftIdx, LeftOrRight.LEFT);
const piRight = await resolveLeafProof(rightIdx, LeftOrRight.RIGHT);
let verifyLeft = Bool(true);
let verifyRight = Bool(true);
if (leftIdx >= NUM_OF_ZKPS) {
verifyLeft = Bool(false);
}
if (rightIdx >= NUM_OF_ZKPS) {
verifyRight = Bool(false);
}
const proof = await layer1.compute(piLeft, vkLeft, verifyLeft, piRight, vkRight, verifyRight);
fs.writeFileSync(`${workDir}/proofs/layer1/p${index}.json`, JSON.stringify(proof.proof), 'utf8');
console.log(`layer: 1 node: ${index} written`);
};
const proveLayer2 = async (index) => {
const layer1Vk = await VerificationKey.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/vks/layer1Vk.json`, 'utf8')));
await node.compile({ cache: Cache.FileSystem(cacheDir) });
const leftIdx = index * 2;
const rightIdx = leftIdx + 1;
const piLeft = await NodeProofLeft.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/proofs/layer1/p${leftIdx}.json`, 'utf8')));
const piRight = await NodeProofRight.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/proofs/layer1/p${rightIdx}.json`, 'utf8')));
const proof = await node.compute(piLeft, layer1Vk, piRight, layer1Vk, Field(2));
fs.writeFileSync(`${workDir}/proofs/layer2/p${index}.json`, JSON.stringify(proof.proof), 'utf8');
console.log(`layer: 2 node: ${index} written`);
};
const prove = async (layer, index) => {
if (layer === 1) {
proveLayer1(index);
}
else if (layer === 2) {
proveLayer2(index);
}
else {
await node.compile({ cache: Cache.FileSystem(cacheDir) });
const leftIdx = index * 2;
const rightIdx = leftIdx + 1;
const nodeVk = await VerificationKey.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/vks/nodeVk.json`, 'utf8')));
const piLeft = await NodeProofLeft.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/proofs/layer${layer - 1}/p${leftIdx}.json`, 'utf8')));
const piRight = await NodeProofRight.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/proofs/layer${layer - 1}/p${rightIdx}.json`, 'utf8')));
const proof = await node.compute(piLeft, nodeVk, piRight, nodeVk, Field(layer));
fs.writeFileSync(`${workDir}/proofs/layer${layer}/p${index}.json`, JSON.stringify(proof.proof), 'utf8');
console.log(`layer: ${layer} node: ${index} written`);
}
};
const workDir = process.argv[5];
const cacheDir = process.argv[6];
prove(parseInt(process.argv[3]), parseInt(process.argv[4]));
//# sourceMappingURL=node_resolver.js.map