@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
49 lines • 2.25 kB
JavaScript
import { Field, Provable, VerificationKey, Poseidon, Bytes, ZkProgram, Struct, Undefined, } from 'o1js';
import { FrC } from '../towers/index.js';
import { NodeProofLeft } from '../structs.js';
import { parseDigestProvable, } from '../plonk/parse_pi.js';
import fs from 'fs';
import { Bytes32 } from './verify_blobstream.js';
class BlobInclusionInput extends Struct({
digest: Bytes32.provable,
}) {
}
const blobInclusionVerifier = ZkProgram({
name: 'blobInclusionVerifier',
publicInput: BlobInclusionInput,
publicOutput: Undefined,
methods: {
compute: {
privateInputs: [NodeProofLeft],
async method(input, proof) {
let vk;
let blobInclusionNodeVk;
let blobInclusionProgramVk;
if (process.env.BLOB_INCLUSION_ENABLED == 'true') {
blobInclusionProgramVk = FrC.from(process.env.BLOB_INCLUSION_PROGRAM_VK || '0');
const workDir = process.env.BLOB_INCLUSION_WORK_DIR;
blobInclusionNodeVk = Field.from(JSON.parse(fs.readFileSync(`${workDir}/proofs/layer5/p0.json`, 'utf8')).publicOutput[2]);
vk = VerificationKey.fromJSON(JSON.parse(fs.readFileSync(`${workDir}/vks/nodeVk.json`, 'utf8')));
}
else {
blobInclusionProgramVk = FrC.from(0n);
blobInclusionNodeVk = Field.from(0n);
vk = VerificationKey.empty();
}
proof.verify(vk);
proof.publicOutput.subtreeVkDigest.assertEquals(blobInclusionNodeVk);
const pi0 = blobInclusionProgramVk;
const pi1 = parseDigestProvable(Bytes.from(input.digest));
const piDigest = Poseidon.hashPacked(Provable.Array(FrC.provable, 2), [
pi0,
pi1,
]);
piDigest.assertEquals(proof.publicOutput.rightOut);
return undefined;
},
},
},
});
const BlobInclusionProof = ZkProgram.Proof(blobInclusionVerifier);
export { blobInclusionVerifier, BlobInclusionProof, BlobInclusionInput, Bytes32, };
//# sourceMappingURL=verify_blob_inclusion.js.map