Censor Resistant Academic Truth
Universities issue tamperproof credentials. Employers verify them without exposing a single student record. Zero knowledge proofs on Base L2.
How It Works
Four stages that make credential verification private, permanent, and trustworthy.
Credential Upload
Universities upload a file of graduating students. Each record is encrypted with AES-256-GCM and hashed with Poseidon before leaving the server. Raw data never reaches the public network.
Data Transformation
Names, matric numbers, and grades become 256-bit field elements the zero knowledge circuit can process. All computation stays local.
ZK Commitment
A Circom circuit computes Poseidon hashes of student data. These hashes are submitted to Base Sepolia via an ERC-4337 Paymaster. The institution never manages ETH.
Permanent Verification
Employers submit a claim and receive VERIFIED or NOT VERIFIED. No student data is revealed. The proof executes on chain using BN254 curve precompiles. Gas efficient and permanent.
Who Uses Veridaq
Each role has a dedicated portal with specific workflows and permissions.
Institution Portal
- Upload student credential batches in XLSX format
- Manage claim definitions and credential lifecycle
- View earnings dashboard and withdraw revenue share
- Toggle employer access to verify your own students
Employer Portal
- Submit verification requests with claim type and threshold
- Purchase credit packs from 5 to 500 verifications
- View verification history with transaction hash audit trail
- Use Chrome extension for quick verify from any webpage
Admin Portal
- Approve institution KYC and manage subscriptions
- View platform revenue and gas pool balances
- Monitor per institution earnings and transactions
- Manage platform-wide settings and deactivate accounts
Cryptographic Circuits
The core of the system is a Circom 2 circuit. It takes private inputs like the student hashed name, matric number, and CGPA, and public inputs like the claim type and threshold. It produces a Groth16 proof that the claim is true without revealing any private inputs.
The proof verifies on chain in milliseconds. The employer gets a boolean answer. Student data stays on the backend server.
Trusted Setup
Phase 2 ceremony using Hermez Powers of Tau. Parameters are public and verifiable with no toxic waste.
L2 Precompiled Verification
Proofs verify on Base Sepolia using BN254 precompiles. About 236,000 gas per verification, cheap enough for everyday use.
Poseidon Hashing
A ZKP friendly hash designed for arithmetic circuits. Keccak256 would make the circuit impractically large. Poseidon keeps it fast and small.
function verifyCredential(
// PII must be sent raw to verify ⚠️
string memory name,
string memory matric,
uint256 cgpa,
bytes memory signature,
address institutionKey
) public returns (bool) {
bytes32 hash = keccak256(
abi.encodePacked(
name, matric, cgpa // PII exposed
)
);
address signer = ECDSA
.recover(hash, signature);
require(
signer == institutionKey,
"Invalid signature"
);
emit Verified(
name, matric, cgpa // LEAKED on chain
);
return true;
}pragma circom 2.0.0;
include "poseidon.circom";
template CredentialVerifier() {
signal input nameHash;
signal input matricHash;
signal input cgpa;
signal input classification;
signal input courseHash;
signal input graduationYear;
signal input blindingFactor;
signal input institutionKey;
signal input commitment;
signal input nullifier;
signal input claimType;
signal input threshold;
component commitmentHasher = Poseidon(7);
commitmentHasher.inputs[0] <== nameHash;
commitmentHasher.inputs[1] <== matricHash;
commitmentHasher.inputs[2] <== cgpa;
commitmentHasher.inputs[3] <== classification;
commitmentHasher.inputs[4] <== courseHash;
commitmentHasher.inputs[5] <== graduationYear;
commitmentHasher.inputs[6] <== blindingFactor;
commitment === commitmentHasher.out;
component nullifierHasher = Poseidon(2);
nullifierHasher.inputs[0] <== matricHash;
nullifierHasher.inputs[1] <== institutionKey;
nullifier === nullifierHasher.out;
component claim = ClaimDecoder(claimType);
claim.cgpa <== cgpa;
claim.classification <== classification;
claim.courseHash <== courseHash;
claim.graduationYear <== graduationYear;
claim.threshold <== threshold;
claim.out === 1;
}Protocol Operations
From batch upload to on-chain verification. How data moves through the system.
Hash Injection
Student records are hashed through Poseidon with a random blinding factor. The result is a fixed-size field element that cannot be reversed.
L2 Commitment
Hashes are submitted to Base Sepolia via an ERC-4337 Paymaster. The institution pays no gas because the platform sponsors the transaction.
ZK Proof Generation
An employer submits a claim. The backend generates a Groth16 proof in about 0.7 seconds using a compiled WASM circuit. The proof says the claim is true without revealing why.
Permanent Verification
The proof is verified on-chain via BN254 pairing precompiles. The result, VERIFIED or NOT VERIFIED, is permanent and public. The underlying data remains private.
Cryptographic Finality
The on-chain verifier checks the Groth16 proof against the stored commitment and the employer claim. If the math works, the result sticks. No one can alter it. Not the institution, not the employer, not us.
- Verification runs deterministically on Base L2
- Non interactive. The employer never touches student data
- Poseidon hashing guarantees the commitment cannot be reversed
- ERC 4337 Paymaster covers all gas. No wallet management needed
function verifyProof(
uint256[2] calldata _pA,
uint256[2][2] calldata _pB,
uint256[2] calldata _pC,
uint256[4] calldata _pubSignals
) public view returns (bool) {
require(
verifier.verifyProof(
_pA, _pB, _pC, _pubSignals
),
"Invalid ZK proof"
);
emit VerificationLogged(
_pubSignals[0] // commitment
);
return true;
}Platform takes 70 percent. Institution earns 20 percent. Gas pool gets 10 percent.
Buy verification credits in packs from 5 to 500. Volume discounts apply.
Institutions earn their share even when verifying their own students through the institution as employer feature.
Chrome Extension
Verify credentials and upload batches directly from your browser. No need to open the full portal for routine tasks. Institutions with employer access can also verify through the extension.
Quick Verify
Submit verification requests directly from any webpage. Input institution, matric number, and claim type.
Batch Upload
Upload student credential files directly from the extension panel without opening the full portal.
Session Sync
Shares your web app session via httpOnly cookies. One login works everywhere.
Zero Data Exposure
All cryptographic operations happen server-side. The extension never sees raw student data.
Manifest V3 . Chrome 88+ . No external permissions required
VERIDAQCompliance by Mathematics.
If the data does not exist on chain, it cannot be breached. Compliance is built into the architecture.
No PII on Chain
The blockchain stores only Poseidon hash commitments, 32-byte field elements that cannot be reversed. No student name, matric number, CGPA, or classification ever appears on the public ledger. This is not a configuration option. It is a structural property that cannot be disabled.
Encryption by Default
Student credential data is encrypted with AES-256-GCM before being stored in PostgreSQL. The encryption key lives in the environment and never touches the database. Data is decrypted only in memory during proof generation, then garbage collected.
Right to Erasure
Because on-chain commitments contain no personal data, institutions can delete the encrypted backend records without violating blockchain immutability. Orphaned commitments are meaningless bytes without access to the original data and blinding factor.
Auditable by Design
Every verification produces a transaction hash on Base Sepolia. Any party can verify that a proof was checked and accepted by the on-chain verifier. The audit trail is permanent, public, and contains zero personal data.