ZKTap
I'm building the ‘Apple Pay’ of verified truth — except you’re not paying, you’re proving something.
Problem Statement
ZKTap is a privacy-preserving, real-world identity verification system that lets users tap their phone to a reader and prove a fact about themselves - like being over 18, a student, or a verified member - without revealing any personal information.It leverages zk-SNARKs and NFC technology to compress verifiable claims into a single tap, enabling anonymous, trustless, instant verification in physical environments like events, stadiums, campuses, and local businesses.Today, proving identity in the real world is messy - you show your government ID to a bad actor a bar and then you've leaked your name, address, birth date and other personal information.Alternatively, you can try connecting this information with your wallet address and reveal your entire on-chain history...There is currently no way to prove these claims privately and instantly in offline or semi-offline environments.This is where ZKTap comes in, the first to bring Zero-Knowledge Proofs to NFC and mobile phones.ZKTap lets users generate a zk-SNARK proof (via VLayer) showing that they've met a specific condition (e.g. NFT ownership) without revealing their wallet, identity or data.The proof is around ~750 bytes, stored locally on the phone, and served via Android NFC Host Card Emulation (HCE). When tapped against a reader (e.g., another phone), the proof is sent via APDU command, and verified.No tracking. Just cryptographic truth — on tap.
Solution
📲 Mobile App (Prover)Kotlin Android AppGenerates zk-SNARK proof server-side (VLayer). In production, I will move this from server-side to mobile side. But was unable to due to time constraints in the hackathon.Stores the proof locallyUsing Android Host Card Emulation for NFCSends full proof payload upon tapping the reader📡 Reader App (Verifier)Basic Android Kotlin appCompatible on any Android device but demo'ed on Urovo i9000 Card Terminal. (Also technically possible on iPhone but time constaints)Receives proof upon NFC connectionVerifies it using VLayer’s verification keyShows ✅ if valid, ❌ if not🔐 The Proof Uses a circuit proving the user holds an 18+ age-verified NFTzk-SNARK ensures:Correctness (claim is valid)Privacy (wallet address is not revealed)Compactness (fits in ~750 bytes)📊 APITypescript/Express/Node.jsUsed for creating proofs temporarily, plus connecting with Revolut's KYC for NFT issuance🖥️ Web FrontendTypescript/React/ViteUsed to connect wallet and then connect with revolut KYC for age verification🐵 Verified NFTBasic ERC-721 ContractIn future will add more functionality like non-transferable etc.
Hackathon
ETHGlobal Prague
2025