Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
LABS
Guides

Setting Up a Verifiable Credentials System for Academic Credentials

A technical guide for developers to implement a system for issuing, holding, and verifying tamper-proof academic credentials on a blockchain.
Chainscore © 2026
introduction
BLOCKCHAIN IDENTITY

Introduction to Verifiable Academic Credentials

A technical overview of using blockchain and decentralized identifiers to issue, share, and verify tamper-proof academic records.

Verifiable Credentials (VCs) are a W3C standard for creating cryptographically secure, privacy-preserving digital credentials. In an academic context, a VC is a digitally signed attestation—like a diploma or transcript—issued by an authoritative entity (e.g., a university) to a holder (a student). The core innovation is the separation of credential issuance from the verification process, enabling trust without requiring direct communication with the issuer for every check. This model is built on three key roles: the issuer, the holder, and the verifier.

The technical foundation relies on Decentralized Identifiers (DIDs) and digital signatures. A DID is a unique, self-sovereign identifier (e.g., did:ethr:0xabc123...) controlled by the holder, not a central registry. When a university issues a credential, it creates a JSON-LD data structure containing the claim (e.g., "degree": "Bachelor of Science"), signs it with its private key, and binds it to the student's DID. The resulting Verifiable Credential can be stored in the student's digital wallet, such as one built with the Walt.id SDK.

Verification is a cryptographic proof check. When a student applies for a job, they present their VC from their wallet to the employer (verifier). The verifier's system checks the issuer's signature against the issuer's public DID (often resolved from a blockchain or a DID method's resolver) and confirms the credential has not been altered. Crucially, this can be done off-chain; only the DIDs and their associated public keys need to be anchored to a blockchain like Ethereum or Polygon for decentralized trust, not the credential data itself, preserving privacy.

Implementing this system involves several components. You need a DID method (e.g., did:ethr for Ethereum, did:key for simple keys), a signature suite like Ed25519Signature2020 or JSON Web Signatures, and a VC data model. For developers, libraries like Veramo (TypeScript) or Aries Framework JavaScript provide abstractions for these operations. A basic issuance flow involves creating a DID for the issuer and holder, formulating a credential payload, signing it, and outputting a JWT or JSON-LD proof format.

The primary benefits are interoperability through open standards, user-centric control over data sharing, and cryptographic integrity. Challenges include key management for holders, ensuring widespread verifier adoption, and designing revocation mechanisms—often handled through status lists or smart contracts. This architecture forms the backbone for portable, lifelong learning records and automated credential verification in hiring and academic applications.

prerequisites
BUILDING BLOCKS

Prerequisites and System Architecture

This guide outlines the core components and technical setup required to deploy a decentralized, verifiable credentials system for academic records.

A verifiable credentials (VC) system for academic credentials requires a foundational understanding of its core architectural layers. The system is built on a decentralized identifier (DID) framework, which provides a self-sovereign, cryptographic identity for issuers (universities) and holders (students). Credentials are issued as W3C Verifiable Credentials, which are tamper-evident JSON-LD or JWT documents containing claims like degree title and graduation date. These credentials are cryptographically signed by the issuer's DID and can be independently verified by any third party, such as an employer, without contacting the original university.

The technical stack is anchored by a blockchain or decentralized network that serves as the trust layer. This is not for storing the credentials themselves, but for anchoring the DIDs and their associated public keys in an immutable registry. Common choices include Ethereum (for its robust ecosystem), Polygon (for low-cost transactions), or dedicated DID networks like ION on Bitcoin or Veramo-compatible networks. The blockchain ensures the integrity of the issuer's signing key, making credentials globally verifiable and resistant to revocation by a single central authority.

On the application layer, you need a VC wallet for credential holders and an issuance/verification service for institutions. The wallet, often a mobile app, securely stores the holder's private keys and received VCs. The issuance service is a backend system that creates, signs, and delivers VCs. For development, frameworks like Veramo (TypeScript) or Aries Framework JavaScript provide modular toolkits for DID management, credential signing, and presentation exchange, abstracting much of the underlying cryptography.

Key prerequisites for developers include Node.js 18+, a package manager like npm or yarn, and a basic understanding of public-key cryptography and JSON schemas. You will need access to a blockchain network; for testing, a Polygon Mumbai testnet faucet provides free MATIC. Essential libraries include did-jwt-vc for JWT-based credentials, ethr-did for Ethereum-based DIDs, and a database like SQLite or PostgreSQL to persist DID documents and key material. Setting up a local agent with Veramo can be done with npm create veramo-app.

The architecture must also plan for credential revocation. A common pattern is using a revocation registry, such as a smart contract or a verifiable data registry, that maintains a list of revoked credential identifiers. During verification, the verifier checks this registry. Alternatively, status list credentials (a W3C standard) allow issuers to embed revocation status in a separate, signed list, offering a more privacy-preserving approach than querying a central on-chain contract for every verification.

credential-schema-design
FOUNDATION

Step 1: Designing Credential Schemas

The schema is the blueprint for your verifiable credentials, defining the data structure and ensuring interoperability across systems. A well-designed schema is critical for trust and utility.

A credential schema is a formal specification of the data model for a verifiable credential. It defines the properties, data types, and structure of the claims being attested. For academic credentials, this includes fields like degreeName, issuingInstitution, dateAwarded, and gradePointAverage. Using a standardized schema ensures that verifiers—such as employers or other universities—can understand and process the credential data consistently, regardless of the issuer. Schemas are typically published to a decentralized registry, like the Indy Schema Registry or a blockchain, to create a permanent, immutable reference.

When designing a schema, you must balance specificity with flexibility. A schema for a Bachelor of Science degree should be detailed enough to prevent fraud but generic enough to be used by multiple institutions. Key considerations include using established data types (e.g., string, integer, datetime), avoiding Personally Identifiable Information (PII) in the schema itself where possible, and aligning with existing standards like W3C Verifiable Credentials Data Model. The schema's unique identifier, often a DID or a URI, is what links the issued credential back to its official definition.

Here is a simplified example of a JSON schema definition for a university diploma. This schema would be published to a registry, and its unique id would be referenced in every credential issued against it.

json
{
  "@context": ["https://www.w3.org/ns/credentials/v2"],
  "@type": ["JsonSchema"],
  "id": "did:example:123456789abcdefghi;schema:uni_diploma_v1",
  "name": "University Diploma Schema",
  "author": "did:example:university_issuer",
  "schema": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
      "degreeName": { "type": "string" },
      "fieldOfStudy": { "type": "string" },
      "issuingInstitution": { "type": "string" },
      "dateAwarded": { "type": "string", "format": "date-time" },
      "gradePointAverage": { "type": "number", "minimum": 0.0, "maximum": 4.0 }
    },
    "required": ["degreeName", "issuingInstitution", "dateAwarded"]
  }
}

After defining your schema, the next step is versioning. If you need to add a new field (e.g., honorsDesignation) or change a data type, you must create a new version of the schema (e.g., uni_diploma_v2). This prevents breaking existing credentials that rely on the old structure. Always reference the exact schema version in the credential's credentialSchema field. Good schema design is a foundational activity that dictates the long-term viability and interoperability of your entire verifiable credentials system.

issuer-setup
IMPLEMENTATION

Step 2: Building the Issuer Backend

This section details the server-side implementation for issuing W3C Verifiable Credentials, covering key generation, credential signing, and secure issuance workflows.

The issuer backend is a secure server application responsible for creating and signing Verifiable Credentials (VCs). Its core functions are managing the issuer's Decentralized Identifier (DID) and its associated cryptographic keys, constructing credential data according to the W3C data model, and generating a cryptographic proof (like a JSON Web Token or a Linked Data Proof) that binds the credential to the issuer's DID. For academic credentials, this backend would be operated by the university's IT department, replacing the function of a traditional registrar's office with a cryptographically verifiable system.

Start by setting up a Node.js or Python project and installing essential libraries. For a Node.js implementation, you'll need did-jwt-vc and ethr-did-resolver from the Identity Foundation to create JWT-based VCs tied to Ethereum keys. In Python, the vc-js or pyld libraries are common choices for working with JSON-LD and Linked Data Proofs. The first critical step is generating or loading the issuer's DID document and private key. For example, you can generate an ethr DID linked to a specific Ethereum network using the ethr-did library: const issuer = await EthrDID.create({...}). This DID becomes the permanent, decentralized identifier for your university.

Next, define the credential structure using the W3C Verifiable Credentials data model. This is a JSON object containing the @context, type, issuer, issuanceDate, and the core credentialSubject data (e.g., student name, degree, GPA). The credentialSchema property should point to a published JSON schema that defines the allowed fields and formats for your academic credentials, enabling standardized validation. Here is a minimal example structure:

json
{
  "@context": ["https://www.w3.org/2018/credentials/v1"],
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "did:ethr:0x5...",
  "issuanceDate": "2023-10-05T14:48:00.000Z",
  "credentialSubject": {
    "id": "did:example:student123",
    "name": "Jane Doe",
    "degree": "Bachelor of Science"
  }
}

The final step is signing the credential to produce a Verifiable Credential. Using the did-jwt-vc library, you create a signed JWT payload from the credential. The signing process cryptographically binds the credential data to the issuer's DID, creating proof that cannot be forged without the issuer's private key. The output is a compact JWT string (e.g., eyJhbGciOiJFUzI1Nksi...) that can be delivered to the student. Your backend should expose a secure API endpoint (e.g., POST /api/issue-credential) that authenticates the student's request (via OAuth or API key), fetches their data from the student records system, constructs the VC, signs it, and returns the final JWT. All private keys must be stored securely using a Hardware Security Module (HSM) or a cloud key management service like AWS KMS.

holder-wallet-integration
IMPLEMENTATION

Step 3: Holder Wallet Integration

This step focuses on the student's digital wallet, the secure container for their academic credentials. We'll implement the core functions to receive, store, and present Verifiable Credentials.

The holder wallet is a student-controlled application, typically a mobile app or browser extension, that acts as a secure digital vault. Its primary functions are to receive and store Verifiable Credentials (VCs) issued by the university, manage the user's Decentralized Identifiers (DIDs), and create Verifiable Presentations (VPs) for sharing proof with verifiers like employers. Unlike a traditional crypto wallet, its focus is on identity data, not financial assets. Popular frameworks for building such wallets include Trinsic Studio, Veramo, and Sphereon's SSI-SDK, which provide the necessary cryptographic tooling for DIDs and VCs.

The core integration involves three key interactions with the issuer's backend from Step 2. First, the wallet must generate or import a DID for the student, such as a did:key or did:ethr. Second, it listens for or fetches credential offers. When the university issues a credential, it sends a credential offer (often via a QR code or deep link) containing a one-time URL. The wallet retrieves the actual VC from this endpoint. Third, the wallet cryptographically verifies the issuer's signature on the VC and stores it securely, often in an encrypted local database.

When a student needs to prove their degree to a third party, the wallet creates a Verifiable Presentation. This is a wrapper around the selected VC(s) that includes a proof signed by the holder's DID, demonstrating control of the credential without revealing unnecessary data. For example, using Selective Disclosure with BBS+ signatures, a student could prove they are over 21 from a driver's license VC without exposing their birth date or address. The presentation is typically shared via another QR code or a direct API call to the verifier's system, completing the trust triangle between issuer, holder, and verifier.

Security is paramount. The wallet must safeguard the user's private keys, which control their DIDs and enable signing presentations. Best practices include using hardware security modules (HSMs) on mobile devices, secure enclaves, or even integrating with hardware wallets like Ledger or Keystone for key management. The wallet should also allow users to audit their data footprint, showing all credentials held, presentations made, and to whom they were shared, ensuring true user sovereignty over their academic identity.

verifier-implementation
SYSTEM ARCHITECTURE

Step 4: Implementing the Verifier

This step details how to build the verification service that checks the validity of academic credentials presented by a holder.

The verifier is the component that receives a Verifiable Presentation (VP) from a credential holder (e.g., a graduate applying for a job) and validates it. Its primary responsibilities are to: verify the cryptographic proof attached to the VP, ensure the credential has not been tampered with or revoked, and confirm the credential's schema matches the expected format for, say, a Master's Degree. In a typical flow, your application's backend will host this verification logic, exposing an API endpoint that accepts a VP in JWT or JSON-LD format.

Core verification involves several checks using the issuer's public Decentralized Identifier (DID) and its associated DID Document. First, you must resolve the issuer's DID (e.g., did:ethr:0x123...) to fetch their public key. Using libraries like did-jwt-vc for JWT credentials or jsonld-signatures for JSON-LD, you then cryptographically verify the signature on the Verifiable Credential (VC) embedded within the presentation. This proves the credential was issued by the claimed university and has not been altered.

Beyond the signature, you must check the credential status. If the issuer uses a revocation registry (like on Hyperledger Indy) or a smart contract for status lists (W3C Status List 2021), the verifier queries this registry to ensure the credential is still active. You also need to validate the credential's expiration time (expirationDate) and the presentation's validity window. For JSON-LD credentials, additional checks ensure the credential's structure complies with the expected context definitions and schema.

Here is a simplified Node.js example using the did-jwt-vc library to verify a JWT VC:

javascript
const { verifyCredential } = require('did-jwt-vc');
const { getResolver } = require('ethr-did-resolver');
// Configure resolver for the issuer's DID method (e.g., ethr)
const resolver = getResolver({ rpcUrl: 'https://mainnet.infura.io/v3/YOUR_KEY' });

async function verifyAcademicCredential(jwt) {
  const verification = await verifyCredential(jwt, resolver);
  // Check verification result
  if (verification.verified) {
    console.log('Credential valid. Issuer:', verification.payload.iss);
    // Add your business logic checks here (e.g., degree type, issuance date)
  } else {
    console.error('Verification failed:', verification.error);
  }
}

After successful cryptographic and status checks, your application must enforce its own business logic policies. This includes verifying that the credential's credentialSubject.id matches the presenter's DID, checking that the degree type and institution in the credential data meet your requirements, and validating the issuance date is within an acceptable timeframe. The final output is a trusted boolean decision and the parsed credential data, which can be stored for audit trails. This enables fully automated, trust-minimized verification of academic credentials without contacting the issuing university.

privacy-with-zkp
VERIFIABLE CREDENTIALS

Step 5: Adding Privacy with Selective Disclosure and ZK Proofs

Implement selective disclosure and zero-knowledge proofs to protect sensitive data while maintaining credential verifiability.

Selective disclosure allows a credential holder to reveal only specific claims from a credential without exposing the entire document. For academic credentials, a graduate could prove they hold a degree from a specific university without revealing their GPA, date of birth, or student ID. This is a core privacy feature of the W3C Verifiable Credentials Data Model. It prevents data minimization violations and reduces the risk of identity correlation across different verifiers.

To implement selective disclosure, you must structure your credential schema with discrete, individually verifiable claims. Using JSON-LD with the credentialSubject property is standard. For a BSc credential, the signed JSON-LD document would contain all claims. The holder then creates a derived verifiable presentation that includes only the selected claims (e.g., "alumniOf": "University X") and a cryptographic proof linking it back to the original issuer-signed credential. Libraries like jsonld-signatures can facilitate this process.

For claims that require even stronger privacy, such as proving one is over 18 or that a GPA is above a 3.0 without revealing the exact value, zero-knowledge proofs (ZKPs) are necessary. Here, the credential holder generates a ZK-SNARK or ZK-STARK proof that attests to the truth of a predicate about their private data. For example, using a ZKP circuit, they can prove GPA > 3.0 is true without disclosing the actual GPA. Frameworks like Circom or SnarkJS are used to write and compile these circuits.

A practical implementation involves two main components: a prover (the wallet/agent held by the student) and a verifier (the university's or employer's system). The prover uses the original signed credential and a ZKP circuit to generate a proof. The verifier only needs the public verification key and the proof to confirm the statement's validity. This process keeps the underlying data entirely private. Protocols like zk-SNARKs used by ZCash or STARKs from StarkWare provide the cryptographic backbone.

Integrating these features requires careful architecture. The issuer's system must support the creation of ZKP-friendly credential formats. The verifier's system needs to integrate verification logic, often via smart contracts on chains like Ethereum or Polygon for trustless verification. This step transforms a basic credential system into a privacy-preserving platform, enabling use cases like anonymous age verification for conferences or credential sharing for job applications without exposing sensitive personal history.

DEVELOPER TOOLING

Comparison of VC Implementation Frameworks

A technical comparison of major open-source frameworks for issuing and verifying W3C Verifiable Credentials.

Framework FeatureVeramoTransmuteSphereon SSI-SDK

Core Language / Runtime

Node.js / TypeScript

Node.js / TypeScript

Node.js / TypeScript

DID Method Support

did:ethr, did:key, did:web, plugin system

did:key, did:web, did:jwk

did:key, did:ethr, did:ion, did:jwk

VC Data Model Compliance

W3C VC v1.1

W3C VC v1.1

W3C VC v1.1

JSON-LD Signatures (LD-Proofs)

JWT Signatures (JWT-VC)

Built-in Storage Plugins

ORM, Key-Value, DIDComm

In-memory, Filesystem

Agent, Vault, Filesystem

DIDComm v2 Messaging

Selective Disclosure (SD-JWT)

EIP-712 Ethereum Signatures

Official React Native Support

Primary Maintainer

Consensys Mesh

Transmute Industries

Sphereon

DEVELOPER FAQ

Frequently Asked Questions

Common technical questions and troubleshooting for implementing a blockchain-based academic credential system using verifiable credentials (VCs).

Verifiable Credentials (VCs) are a W3C standard for creating tamper-proof digital credentials. In an academic context, they allow an issuer (like a university) to cryptographically sign a student's credential data (degree, grade, transcript) and issue it directly to the holder (the student).

The core components are:

  • Issuer: The university's signing system, which holds a Decentralized Identifier (DID) and private key.
  • Holder: The student's digital wallet, which stores the VC.
  • Verifier: An employer or other institution that can cryptographically verify the credential's authenticity and issuer without contacting the university.

The VC data model uses JSON-LD or JWT formats and is secured with digital signatures (like Ed25519 or secp256k1). The credential's integrity and the issuer's DID are recorded on a blockchain (like Ethereum or Polygon) or other Verifiable Data Registry, enabling trustless verification.

conclusion
IMPLEMENTATION SUMMARY

Conclusion and Next Steps

You have now built a foundational system for issuing and verifying academic credentials on-chain using verifiable credentials (VCs). This guide covered the core components: creating a decentralized identifier (DID), issuing a signed credential, and verifying its proof.

The system you've implemented provides a significant upgrade over traditional paper or centralized digital records. It enables cryptographic proof of authenticity, user-controlled data portability via identity wallets, and instant, trustless verification by any third party. Key technical achievements include generating a did:ethr DID anchored to the Sepolia testnet, structuring a W3C-compliant credential with a BachelorsDegree type, and signing it with the issuer's private key to create a verifiable data integrity proof using EcdsaSecp256k1RecoverySignature2020.

To move from a proof-of-concept to a production-ready system, consider these next steps:

Enhance Issuer Governance

Implement a multi-signature wallet or a DAO structure for credential issuance to prevent single points of failure. Explore using attestation registries like Ethereum Attestation Service (EAS) or verifiable credential schemas on platforms like Ceramic Network to standardize credential types and make them publicly discoverable.

Build a Verifier Portal

Create a simple web application for verifiers (like employers or other institutions) to submit a credential's JWT and instantly check its validity status, issuer DID, and revocation state on-chain.

Further development should focus on critical real-world features. Implementing revocation is essential; you can use a smart contract as a revocation registry or leverage status list credentials. For broader interoperability, ensure your credentials comply with profiles like OpenBadges 3.0 or LearnCard's ecosystem. Finally, explore selective disclosure using zero-knowledge proofs (e.g., with Polygon ID) to allow graduates to prove they hold a degree from your university without revealing their exact GPA or student ID, significantly enhancing privacy.