Build an age verifier that checks 18+ without seeing a birth date.
Your team builds the proof in Rust and halo2, breaks a circuit that accepts the wrong witness, then maps the issuer, client proof and verifier to a real app. By the end they can explain what the proof says and what it still does not solve.
On the video I run the final verifier on examples that pass and fail in MockProver, then do a full run that actually generates a proof.
I write Rust, work with ZK in production and have been in blockchain since 2016. I first showed this age-proof pipeline at Rustmeet Kraków. People asked for the code, so I turned it into a workshop where the team builds it.
The verifier gets one answer: over 18 or not.
The birth year stays private. The circuit checks the signed input, computes the age and exposes only the answer needed by the service.
- InputA birth year signed by the issuer.
- CircuitSignature verification, age calculation and range checks.
- OutputA proof and the public claim the verifier is expected to check.
The team sees what passes and what fails.
This is the constraint and a shortened output from the workshop repo. The correct witness passes. A forged signature and an underage input fail. The final step generates and verifies a KZG proof.
let age_w = gate_chip.sub(ctx, current_year_w, birth_year_w);
let diff_lo = gate_chip.sub(ctx, age_w, min_w);
let diff_hi = gate_chip.sub(ctx, max_w, age_w);
range.range_check(ctx, diff_lo, 8);
range.range_check(ctx, diff_hi, 8);
correct signature, birth_year=2001
MockProver: all constraints satisfied
forged signature, s + 1
MockProver FAILED
birth_year=2020, age=6
MockProver FAILED
KZG proof: 13312 bytes
Verification: ok
The session runs from the repo to the app flow.
-
01
Setup and repo
Open the code, check the moving parts and run the verifier path locally.
-
02
Age claim
Turn a private birth year into one public answer: over 18 or not.
-
03
Valid and bad cases
Run the correct witness, a forged signature and an underage case to see what fails where.
-
04
Broken circuit review
Find the missing constraint that lets a proof accept the wrong witness, then fix it.
-
05
App flow
Place the issuer, local proof, verifier and public inputs in a web, iOS or Android flow.
Run it with the engineers who will evaluate or integrate ZK.
The age verifier is the shared code for the session. Your team builds it, runs the bad cases and finishes by placing the issuer, proof generation, verifier and trust boundary in the context of your product.
This format fits teams looking at identity, signed attributes, selective disclosure, a ZK vendor or an internal prototype.
What we cover
- A closed live session for your engineers
- The working age proof and broken circuit review
- Questions while the code is running
- The trust boundary in your own product
Your team can run the proof again and explain what it checks.
They can
- Run the proof and the invalid cases locally.
- Explain what stays private and what the verifier sees.
- Spot one common missing-constraint bug.
- Ask what is signed, what is public and what is actually verified.
- See what still has to be built before production.
Who it is for
- Software engineers who are comfortable reading Rust.
- No previous halo2 experience required.
- No math, blockchain or security background required.
- Not a passive webinar and not a production identity SDK.
Adam
I write Rust, have been in blockchain since 2016 and work with ZK in production. I also mentor developers who want to understand halo2 beyond copied snippets and generated explanations.
I first ran this pipeline as a live Rustmeet Kraków talk. The workshop keeps the same approach: run the code, break it, then discuss what the proof is actually checking.
“Adam has an incredible mix of mathematical/cryptography and smart contract/software engineering knowledge.”
LinkedIn recommendation, architecture director
“The ZK Course helped me break through the wall of ZK moon math and complex terminology.”
Rust developer, 1:1 mentee
Before you book it
Does the team need previous ZK or halo2 experience?
No. The engineers need to be comfortable reading Rust. I explain the math only where it is needed to understand the constraint and the proof.
What do we need to build along live?
Rust, cargo and the editor you normally use. Setup instructions are provided before the session.
Where does this fit in a real app?
An issuer signs an attribute, the user creates a proof locally, and the app or backend verifies the proof and public inputs. Production still needs key management, revocation, UX and privacy review.
Is this a production-ready identity product?
No. The workshop gives the team a working proof and the technical model needed to evaluate an implementation. It is not a ready-made identity SDK.
What is included in the open session?
The live 3-hour workshop, recording, workshop code and materials. Access lasts 12 months after the session.
Can we use the code afterwards?
You can use, reuse and build on it in your own projects. Keep the workshop code itself off public repositories.