mina-attestations
Version:
Private Attestations on Mina
62 lines • 2.6 kB
JavaScript
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