Skip to content

Commit

Permalink
fix: improved types (#4)
Browse files Browse the repository at this point in the history
  • Loading branch information
FilipHarald authored Aug 24, 2023
1 parent acb1701 commit c018136
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 31 deletions.
23 changes: 8 additions & 15 deletions packages/nextjs/hooks/noir/useProofGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { CircuitAbiParameters, CircuitName, CircuitParameterWitnesses, circuits } from "~~/utils/noir/circuit";
import { Circuit, CircuitAbiParameters, CircuitName, CircuitParameterWitnesses, circuits } from "~~/utils/noir/circuit";
import { NoirBrowser } from "~~/utils/noir/noirBrowser";

let isGeneratingProof = false;
Expand All @@ -7,7 +7,7 @@ type HexString = `0x${string}`;
export type ParsedArgs = Record<string, HexString[]>;

function formatArgs(parameterWitnesses: CircuitParameterWitnesses, parsedArgs: ParsedArgs): HexString[] {
// NOTE: workaround for not being able to use named parameters
// NOTE: workaround for not being able to use named parameters in proof generation
const sortedKeys = Object.entries(parameterWitnesses)
.map(([key, paramPostitions]) => {
return {
Expand All @@ -29,41 +29,34 @@ function getPublicInputsLength(parameters: CircuitAbiParameters) {
return parameters
.filter(param => param.visibility === "public")
.reduce((acc, param) => {
return acc + (param.type.length || 1);
if (param.type.kind === "array") {
return acc + param.type.length;
} else {
return acc + 1;
}
}, 0);
}

export const generateProof = async (circuitName: CircuitName, parsedArgs: ParsedArgs) => {
isGeneratingProof = true;
console.log("🧠 start");
console.log("parsedArgs", parsedArgs);
const noir = new NoirBrowser();
try {
const circuit = circuits[circuitName];
const circuit = circuits[circuitName] as Circuit<CircuitName>;
await noir.init(circuit.bytecode);
const formattedArgs = formatArgs(circuit.abi.param_witnesses, parsedArgs);
const witness: Uint8Array = await noir.generateWitness(formattedArgs);
const proof: Uint8Array = await noir.generateProof(witness);

const publicInputsLength = getPublicInputsLength(circuit.abi.parameters);

const publicInputs = proof.slice(0, 32 * publicInputsLength);

const slicedProof = proof.slice(32 * publicInputsLength);

console.log("0x" + Buffer.from(publicInputs).toString("hex"));
console.log("0x" + Buffer.from(slicedProof).toString("hex"));
console.log(publicInputsLength);
console.log(Buffer.from(slicedProof).toString("hex").length);

return {
witness: Buffer.from(witness).toString("hex"),
proof: "0x" + Buffer.from(slicedProof).toString("hex"),
};
} finally {
isGeneratingProof = false;
noir.destroy();
console.log("🧠 end");
}
};

Expand Down
6 changes: 5 additions & 1 deletion packages/nextjs/pages/example-zk/GenerateProof.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,11 @@ export const GenerateProof = ({ requiredBirthYear }: { requiredBirthYear: number
const { proof } = await generateProof("LessThenSignedAge", parsedForm as ParsedArgs);
setProof(proof);
} catch (e) {
console.error(e.stack);
if (e instanceof Error) {
console.error(e.stack);
} else {
console.error(`Unknown error: ${e}`);
}
}
};
return (
Expand Down
24 changes: 9 additions & 15 deletions packages/nextjs/utils/noir/circuit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,23 @@ type ABI_Parameter = {
type: ABI_ParameterType;
visibility: "public" | "private";
};
type ABI_ParamWitnesses = any;
// What is this?
// "param_witnesses": {
// "x": [
// 1
// ],
// "y": [
// 2
// ]
// },
type ABI_ParamWitness = number[];

// perhaps return type is the same as type in ABI_Parameter
type ABI_ReturnWitness = any;
type ABI_ReturnType = any;
// perhaps this type is the same as type in ABI_Parameter

type ABI = {
parameters: ABI_Parameter[];
param_witnesses: ABI_ParamWitnesses;
param_witnesses: Record<ABI_Parameter["name"], ABI_ParamWitness>;
return_witnesses: ABI_ReturnWitness[];
return_type: ABI_ReturnType;
};
export type ACIR = string; // base64 encoded

export type GenericCircuitsDeclaration = {
[name: string]: {
backend: string;
bytecode: ACIR;
abi: ABI;
};
Expand All @@ -53,14 +47,14 @@ export const circuits = circuitData || {};

export type CircuitName = keyof typeof circuits;

export type Circuits = typeof circuits;
export type Circuits = GenericCircuitsDeclaration;

export type Circuit<TCircuitName extends CircuitName> = Circuits[TCircuitName];

export type CircuitBytecode = Circuit<CircuitName>["bytecode"];
export type CircuitAbiParameters = Circuit<CircuitName>["abi"]["parameters"];
export type CircuitAbi = Circuit<CircuitName>["abi"];
export type CircuitParameterWitnesses = Circuit<CircuitName>["abi"]["param_witnesses"];
export type CircuitAbiParameters = Circuit<CircuitName>["abi"]["parameters"] | ABI_Parameter[];
export type CircuitParameterWitnesses = Circuit<CircuitName>["abi"]["param_witnesses"] | ABI_ParamWitness[];

export enum CircuitCodeStatus {
"FOUND",
Expand Down

0 comments on commit c018136

Please sign in to comment.