{
  "slug": "proven-zk",
  "name": "proven-zk and gnark-lean-extractor",
  "tagline": "Lean 4 verification of gnark circuits",
  "maintainer": "Reilabs",
  "url": "https://github.com/reilabs/proven-zk",
  "repo": "https://github.com/reilabs/proven-zk",
  "category": "zk-circuits",
  "targets": [
    "gnark",
    "R1CS"
  ],
  "approach": "Extract gnark circuits to Lean 4; prove properties with the proven-zk library",
  "license": "Open source",
  "status": "Maintained",
  "summary": "proven-zk is a Lean 4 library, with a companion gnark extractor, used by Reilabs to verify Worldcoin's Semaphore Merkle tree batcher circuits. The work surfaced a comparison bug in gnark itself.",
  "details": [
    "The gnark-lean-extractor turns a Go gnark circuit into Lean definitions; proven-zk supplies lemmas for Poseidon, Merkle trees and bit decomposition so the resulting goals are provable. It is the reference example of verifying a deployed gnark circuit."
  ],
  "strengths": [
    "Production track record (Worldcoin).",
    "Found a real bug in the underlying framework.",
    "Reusable lemma library for common gadgets."
  ],
  "limits": [
    "gnark only.",
    "Extractor coverage of gnark APIs is partial.",
    "Less active than Lampe."
  ],
  "fit": [
    "Choose it for gnark circuits, especially Merkle and Poseidon heavy ones."
  ],
  "references": [
    [
      "proven-zk repository",
      "https://github.com/reilabs/proven-zk"
    ]
  ],
  "category_name": "ZK circuit verification",
  "page": "https://sorryfree.com/frameworks/proven-zk/",
  "updated": "2026-09-13"
}