GitHub - Consensys/gnark: gnark is a fast zk-SNARK library that offers a high-level API to design circuits. The library is open source and developed under the Apache 2.0 license (original) (raw)

Twitter URL License Go Report Card PkgGoDev Documentation Status DOI

High-performance zk-SNARKs in Go.

gnark provides a high-level API to define circuits, then compile, prove, and verify with production-grade proving systems. It is open-source under Apache 2.0 and uses gnark-crypto for field arithmetic and cryptographic primitives.

gnark powers Linea zk-rollup. Include your project in known users by opening a PR.

Why gnark

Quick Start

Requirements

Install

go get github.com/consensys/gnark@latest

Run an example

To design your first circuit, follow the tutorial in gnark User Documentation.

Supported Proving Systems and Curves

gnark currently supports:

on the following curves:

Notes:

GPU Acceleration (Experimental)

gnark includes experimental GPU acceleration through Ingonyama's ICICLE backend for Groth16 on:

See accelerated backend documentation and the ICICLE repository.

Example Circuit

The circuit below encodes x**3 + x + 5 == y.

package main

import ( "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/backend/groth16" "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/frontend/cs/r1cs" )

// CubicCircuit defines a simple circuit. // x**3 + x + 5 == y type CubicCircuit struct { X frontend.Variable gnark:"x" Y frontend.Variable gnark:",public" }

// Define declares the circuit constraints. func (circuit *CubicCircuit) Define(api frontend.API) error { x3 := api.Mul(circuit.X, circuit.X, circuit.X) api.AssertIsEqual(circuit.Y, api.Add(x3, circuit.X, 5)) return nil }

func main() { var circuit CubicCircuit ccs, _ := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit)

pk, vk, _ := groth16.Setup(ccs)

assignment := CubicCircuit{X: 3, Y: 35}
witness, _ := frontend.NewWitness(&assignment, ecc.BN254.ScalarField())
publicWitness, _ := witness.Public()

proof, _ := groth16.Prove(ccs, pk, witness)
_ = groth16.Verify(proof, vk, publicWitness)

}

Security

gnark and gnark-crypto have been extensively audited, but are provided as-is with no guarantees or warranties. In particular, gnark does not guarantee constant-time implementations or side-channel resistance.

Report vulnerabilities via Security Policy. Do not open public issues for security reports.

Published advisories are listed here.

Testing

CI runs formatting, generated-file, lint, and test checks on pull requests and pushes.

Common local commands:

go test -short ./... go test -tags=release_checks,solccheck . go test -tags=prover_checks ./test/... ./examples/... go test -run=NONE -fuzz=FuzzIntcomp -fuzztime=30s ./internal/backend/ioutils go generate ./...

Audits

Release Notes

See CHANGELOG.md.

Citing

If you use gnark in research, please cite the latest release:

@software{gnark-v0.14.0, author = {Gautam Botrel and Thomas Piellard and Youssef El Housni and Ivo Kubjas and Arya Tabaie}, title = {Consensys/gnark: v0.14.0}, month = jun, year = 2025, publisher = {Zenodo}, version = {v0.14.0}, doi = {10.5281/zenodo.5819104}, url = {https://doi.org/10.5281/zenodo.5819104} }

Contributing

See CONTRIBUTING.md and CODE_OF_CONDUCT.md.

Versioning

gnark follows SemVer. Available versions are in tags.

License

Licensed under Apache 2.0 (see LICENSE).