Zero-knowledge proofs (ZKPs) have been on my “I should really learn this properly” list for a while.
Most explanations start with heavy notation, so this is my attempt to write down a simpler version for myself.
At a high level, ZKPs try to answer:
“Can you convince me that something is true without revealing your secret?”
1. Zero-Knowledge in One Paragraph
In a normal proof, you show your work. In a zero-knowledge proof, you only show the conclusion (“this statement is true”) and still manage to convince the other side that you’re not lying.
Some informal vocabulary that helped me:
- Statement – the public claim. Example: “this hash equals H(password)”.
- Witness – the secret that makes it true. Example: the actual
password. - Proof – a short blob that convinces you I know a valid password, without giving it away.
The formal properties (completeness, soundness, zero-knowledge) are there to make sure:
- Honest runs succeed.
- Cheating is basically impossible.
- The proof doesn’t leak the secret.
2. Where Groth16 Comes In
There are many ways to build ZKPs. Groth16 is one specific construction that people like because:
- Proofs are small and fast to verify.
- It’s non-interactive after setup (you send one proof, no back-and-forth).
- It’s general-purpose: you can express a computation as a circuit and prove “I ran this correctly on some secret input”.
3. Groth16 in Three Steps (Hand-Wavy)
Here’s the version I keep in my head and then let the library handle the group theory:
- Setup
- One-time step for a given computation.
- Outputs a proving key and a verification key.
- Proving
- Input: proving key + public inputs + secret inputs.
- Output: a short proof.
- Verification
- Input: verification key + public inputs + proof.
- Output: accept or reject.
Under the hood, this uses elliptic curves, pairings, and constraint systems, but you don’t need the full algebra to reason about where it fits in an architecture.
4. Why I Find It Interesting
From a security engineering angle, Groth16 and similar systems are just another way to draw boundaries:
- “I prove this check passed, but you never see my inputs.”
- “You can verify the result quickly, even if doing the original computation again would be expensive.”
The practical work looks less like inventing new cryptography and more like:
- Being precise about what is being proved.
- Placing proving vs. verification in the right parts of the system.
- Handling keys and setup material with the same care you’d give to any serious cryptographic component.
I’m still learning, but even this simplified mental model already makes a lot of ZK-related papers and blog posts much less scary to read.