Skip to main content
Version: 2.15.0

ZkProgram

type ZkProgram<Config> = ReturnType<typeof ZkProgram>;

Defined in: lib/proof-system/zkprogram.ts:237

Wraps config + provable code into a program capable of producing Proofs.

Type Parameters

Config

Config extends { methods: { [I in string]: { auxiliaryOutput?: ProvableType; privateInputs: Tuple<PrivateInput> } }; publicInput?: ProvableType; publicOutput?: ProvableType; }

Example

const ExampleProgram = ZkProgram({
name: 'ExampleProgram',
publicOutput: Int64,
methods: {
// Prove that I know 2 numbers less than 100 each, whose product is greater than 1000
provableMultiply: {
privateInputs: [Int64, Int64],
method: async (n1: Int64, n2: Int64) => {
n1.assertLessThan(100);
n2.assertLessThan(100);
const publicOutput = n1.mul(n2);
publicOutput.assertGreaterThan(1000);
return { publicOutput: n1.mul(n2) }
}
}
}
});

Param

The configuration of the program, describing the type of the public input and public output, as well as defining the methods which can be executed provably.

Param

Optional number of chunks to split each method's circuit into. Use a value greater than 1 (1 < numChunks <= 4) if a method exceeds the single-circuit row limit of 2^16; default is 1. Up to 8 chunks are supported if the degree of the constraints of the underlying circuit is low enough (e.g. generic gates) so the wrap domain can still be 2.

Param

Optional override for the wrap circuit domain (0 | 1 | 2). Defaults to a value derived from the maximum proofs verified; set only if you need to force a specific domain for chunking. In general, uses 0 if no chunking, 1 for 2 chunks, and 2 for 4 chunks. When otherwise needed, the logs guide you through the right choice. If the constraints are simple enough (e.g. generic gates), 8 chunks may also use domain 2.

Returns

an object that can be used to compile, prove, and verify the program.