This repository provides a PoC showcasing OpenAC × TWDIW privacy-preserving age verification solution for online alcohol purchases. It enables users to prove that they:
- Possess a valid credential (PoC scope)
- Meet the legal drinking age requirement (18+) without revealing personal information
- Can be verified by online merchants or platforms through a standard verification interface
All of this is achieved without merchants collecting, storing, or learning unnecessary personal data.
- Identity/eligibility verification via Driver License (primary, already onboarded stakeholder)
- Generation of Zero-Knowledge Proofs (ZKPs) for:
- Credential validity / holder possession (proving ownership of driver license VC)
- Age ≥ 18 claim for alcohol purchase (boolean-only disclosure) → preparation for other potential identity doc
- Integration with TWDIW Official App (wallet/proof generation UI)
- Codebase to leverage: https://github.com/moda-gov-tw/TWDIW-official-app
- Integration with merchant verifier:
- Standalone verifier service / SDK-like integration kit
- Merchant receives only a “pass/fail + metadata” result (no raw identity data)
Note: Passport-based age calculation is not MVP, but is a planned expansion track starting Q1 and targeted for a feasibility checkpoint in Q2.
flowchart LR;
A["merchant web app"] --> |request| B["merchant server (OpenAC protocol)"];
B["merchant server (OpenAC protocol)"] --> |return data| C["merchant web app"];
C --> |show| D["QR code"]
- Description
- The user opens the merchant web app to purchase alcohol.
- The merchant backend creates an OpenAC session for the user upon request from the frontend.
- The frontend displays a QR code or deeplink, allowing the user to interact with TWDIW.
flowchart LR;
A["QR code"] --> |scan| B["TWDIW mobile app (with OpenAC prover)"]
B --> |proof| C["merchant server (with OpenAC verifier)"]
- Description
- The user scans the QR code or clicks the deeplink.
- The user generates an OpenAC proof using TWDIW.
- Only the proof is sent to the merchant server; no personal data is shared.
flowchart LR;
A["QR code"] --> |scan| B["TWDIW mobile app (with OpenAC prover)"]
B --> |proof| C["merchant server (with OpenAC verifier)"]
D["on-chain verifier"]
B --> |proof| D
D --> |verification result| C
- Description
- The proof can be submitted to the merchant backend, the on-chain verifier, or both.