Home

Awesome

npm License: MIT

ZKit - Circom Zero Knowledge Kit

A zero knowledge kit that helps you interact with Circom circuits.

Installation

To install the package, run:

npm install --save-dev @solarity/zkit

Usage

[!IMPORTANT] The kit is not meant to be used directly as its fitness relies heavily on the environment, Circom compilation artifacts management, processing of remappings, etc. Consider using hardhat-zkit which is a complete, developer-friendly package.

CircuitZKit

CircuitZKit is a user-friendly interface for interacting with circom circuits.

To create a CircuitZKit object it is necessary to pass a config:

CircuitZKitConfig = {
  circuitName: string;
  circuitArtifactsPath: string;
  verifierDirPath: string;
  provingSystem?: VerifierProvingSystem;
};

This config contains all the information required to work with the circuit, namely:

getTemplate()

Static CircuitZKit function that returns the contents of a template file by the passed type.

const templateContent = CircuitZKit.getTemplate("groth16", "sol");

createVerifier()

Creates a Solidity | Vyper verifier contract on verifierDirPath path, which was specified in the config.

await multiplier.createVerifier("sol");

calculateWitness()

Calculates a witness in the tmp directory and returns its json representation.

/// witness = [1n, 200n, 20n, 10n]
const witness = await multiplier.calculateWitness({ a: 10, b: 20 });

generateProof()

Generates a proof for the given inputs.

/// { proof: { pi_a, pi_b, pi_c, protocol, curve }, publicSignals: [6] }
const proof = await multiplier.generateProof({ a: 2, b: 3 });

verifyProof()

Verifies the proof.

/// true
const isValidProof = await multiplier.verifyProof(proof);

generateCalldata()

Generates calldata by proof for the Solidity | Vyper verifier's verifyProof() method.

/// You can use this calldata to call the verifier contract
const calldata = await multiplier.generateCalldata(proof);

Known limitations