UNPKG

mina-attestations

Version:
62 lines 2.6 kB
import { Bytes, Hash, ZkProgram, } from 'o1js'; import { privateInputTypes, publicInputTypes, publicOutputType, rootValue, splitUserInputs, extractCredentialInputs, } from "./program-spec.js"; import { Node } from "./operation.js"; import { NestedProvable } from "./nested.js"; import { verifyCredentials } from "./credential.js"; import { serializeSpec } from "./serialize-spec.js"; export { createProgram }; function createProgram(spec) { // split spec inputs into public and private inputs let inputTypes = publicInputTypes(spec); let claimsType = NestedProvable.get(inputTypes.claims); let outputClaimType = publicOutputType(spec); let PublicInput = NestedProvable.get(inputTypes); let PrivateInput = NestedProvable.get(privateInputTypes(spec)); let program = ZkProgram({ name: programName(spec), publicInput: PublicInput, publicOutput: outputClaimType, methods: { run: { privateInputs: [PrivateInput], async method(publicInput, privateInput) { let credentials = extractCredentialInputs(spec, publicInput, privateInput); let credentialOutputs = verifyCredentials(credentials); let root = rootValue(spec, publicInput, privateInput, credentialOutputs); let assertion = Node.eval(root, spec.assert); let outputClaim = Node.eval(root, spec.outputClaim); assertion.assertTrue('Program assertion failed!'); return { publicOutput: outputClaim }; }, }, }, }); let isCompiled = false; let verificationKey; return { async compile() { if (isCompiled) return verificationKey; let result = await program.compile(); isCompiled = true; verificationKey = result.verificationKey; return verificationKey; }, async run(input) { let { publicInput, privateInput } = splitUserInputs(input); let result = await program.run(publicInput, privateInput); return result.proof; }, program: program, claimsType, outputClaimType: outputClaimType, }; } // helper function programName(spec) { const serializedSpec = JSON.stringify(serializeSpec(spec)); const specBytes = Bytes.fromString(serializedSpec); const hashBytes = Hash.Keccak256.hash(specBytes); return `credential-${hashBytes.toHex().slice(0, 16)}`; } //# sourceMappingURL=program.js.map