This repository contains a ZK-based verification system that enables the generation and validation of attestations across multiple chains (EDUCHAIN and Arbitrum). The system also demonstrates how user data (like CGPA, test score) can be verified and minted into an NFT on the chosen chain.
📑 Table of Contents
ZKCertify leverages zero-knowledge proofs to ensure the integrity of user data without exposing the underlying information. It allows recruiters or other parties to:
- Request verification of a user's credentials (CGPA, test scores).
- Generate and validate ZK proofs.
- Mint an NFT as proof of verification on the selected chain (Arbitrum or EDUCHAIN).
The core idea behind ZKCertify is to create a transparent yet privacy-preserving platform for students and recruiters:
-
Student Registration & Data Storage
- Students register on the platform and provide their CGPA.
- As they learn new skills, they can take various tests on the platform.
-
Scoring & Verification
- Each student’s CGPA and newly acquired test scores are combined to check if they exceed a certain threshold.
- If the sum is greater than the threshold, the platform records a 1 (pass), otherwise a 0 (fail).
- This pass/fail outcome is then verified on-chain using ZK proofs, ensuring that the underlying data (CGPA, test score) remains private.
-
Recruiter Verification
- When a student applies for a role, the recruiter can easily verify the student's performance by checking the on-chain proof.
- The NFT minted from this verification process serves as a tamper-proof attestation of the student’s credentials.
Video Demo:
https://youtu.be/YG1DjKzlmFQ
Below is a high-level architecture diagram illustrating the major components and data flow:
- User (Student) can:
- Connect/disconnect wallet (e.g., MetaMask).
- Add CGPA and take tests (which updates verification data).
- Generate proofs of credentials.
- Recruiter can:
- Connect wallet.
- Request verification of a student’s credentials.
- Receive the final attestation (NFT) minted on the chain of choice (Arbitrum or EDUCHAIN).
- Node.js (>= 14.x recommended)
- npm (>= 6.x)
- Circom (for ZK circuit compilation)
- MetaMask (browser extension) for testing the dApp
-
Clone the Repository
git clone https://github.com/bansalayush2407/ZKCertify.git cd ZKCertify -
Install Dependencies
- Backend:
cd backend npm install - Frontend:
cd ../frontend npm install
- Backend:
-
Compile ZK Circuit
Return to the root folder (or wherever yourcircuit.circomfile is located) and run:npm run complete-circuit
This command will:
- Compile your circuit.
- Generate the necessary proving and verification keys.
- Create the witness.
-
Deploy the zkCertify Contract
You need to deploy the zkCertify Contract on both EDUCHAIN and Arbitrum. Once deployed, update your environment variables with the addresses:EDU_ZKVERIFY_CONTRACT_ADDRESS="0x147AD899D1773f5De5e064C33088b58c7acb7acf" ARB_ZKVERIFY_CONTRACT_ADDRESS="0x82941a739E74eBFaC72D0d0f8E81B1Dac2f586D5" VK_HASH="0xa0e25c80bfa3f16a1f2a971730011a85066bc21027722662136a24fa59a59297"Note:
VK_HASHis generated by the function incircuit/setup/hash.js.
Create a .env file in the /backend directory and add the following entries:
ZKV_RPC_URL=
ETH_RPC_URL=
ETH_ZKVERIFY_CONTRACT_ADDRESS=
ARB_ZKCERTIFY_CONTRACT_ADDRESS=
EDU_ZKCERTIFY_CONTRACT_ADDRESS=
GROQ_API_KEY=
ZKV_SEED_PHRASE=
ETH_SECRET_KEY=
ARB_URL=
EDU_URL=
- ZKV_RPC_URL: The RPC endpoint for ZKV.
- ETH_RPC_URL: The RPC endpoint for Ethereum (or your desired testnet).
- ETH_ZKVERIFY_CONTRACT_ADDRESS: Address of the ZKVerify contract on Ethereum (if applicable).
- ARB_ZKCERTIFY_CONTRACT_ADDRESS: Address of the contract deployed on Arbitrum.
- EDU_ZKCERTIFY_CONTRACT_ADDRESS: Address of the contract deployed on EDUCHAIN.
- GROQ_API_KEY: (If you use any third-party or internal API key).
- ZKV_SEED_PHRASE: Seed phrase for the account used in the ZK environment.
- ETH_SECRET_KEY: Private key for Ethereum-based deployments.
- ARB_URL: RPC endpoint for Arbitrum.
- EDU_URL: RPC endpoint for EDUCHAIN.
-
Backend
cd backend npm install node app/src/index.jsThe backend should now be running on the specified port (default is usually
http://localhost:3001or whichever is set in your code). -
Frontend
cd ../frontend npm install npm run devBy default, this starts on
http://localhost:3000(or the next available port).
- Connect Wallet (e.g., MetaMask) on the website.
- Register as Student to add your CGPA.
- Take Tests to generate or update your test scores.
- Generate Proof using the underlying ZK circuit, which checks if CGPA + test score ≥ threshold.
- Select a Chain (Arbitrum or EDUCHAIN) to mint the verification NFT.
- Recruiters can connect their wallets to verify your credentials on-chain and see proof of whether you passed the threshold.
- Additional Skill Tests
- Incorporate new test types (e.g., Data Structures & Algorithms, Assignments, Interviews) that can be automatically graded by AI.
- Job Postings & Matching
- Enable recruiters to post job openings with required skills.
- Automatically match qualified students to open positions based on their CGPA + test scores.
- NFT-Based Resume
- Allow students to generate a resume as an NFT, bundling their verified credentials in a single, on-chain artifact.
These enhancements will further streamline the student–recruiter interaction while maintaining privacy and trust via zero-knowledge proofs.











