1. Giới thiệu
Decentralized Identity (DID) đang trở thành nền tảng cốt lõi của các ứng dụng Web3. Thay vì để người dùng phụ thuộc vào Facebook, Google hay MetaMask để xác thực, DID giúp họ tự kiểm soát danh tính và dữ liệu trên blockchain.
Bài viết này hướng dẫn developer cách xây dựng và triển khai DID thực tế với Ceramic + IDX, đồng thời mở rộng sang SpruceID, Lit Protocol, và Polygon ID để hiểu cách các hệ thống này khác nhau. Mục tiêu là giúp dev có thể tạo, xác minh, lưu trữ và tích hợp DID vào social app, DeFi app, hoặc credit scoring system một cách thực tế nhất.
2. Kiến trúc kỹ thuật của DID
Theo chuẩn W3C DID Specification, mỗi DID bao gồm:
- DID Document: chứa public key và service endpoint.
- DID Method: định nghĩa cách định danh (ví dụ
did:ethr,did:key,did:3). - Verification Method: cơ chế xác minh danh tính.
Ceramic Network chịu trách nhiệm lưu trữ và xử lý DID document, còn IDX (Identity Index) là API layer giúp dev đọc/ghi dữ liệu liên quan đến danh tính người dùng.
3. Thiết lập môi trường phát triển
Cài Node.js và các package cần thiết:
mkdir did-tutorial && cd did-tutorial
npm init -y
npm install @ceramicnetwork/http-client @ceramicnetwork/3id-did-provider @glazed/did-datastore dids key-did-resolver
Kết nối tới Ceramic testnet:
import { CeramicClient } from '@ceramicnetwork/http-client'
const API_URL = 'https://ceramic-clay.3boxlabs.com'
const ceramic = new CeramicClient(API_URL)
console.log('Connected to Ceramic testnet node:', API_URL)
4. Tạo và xác thực DID trên Ceramic + IDX
Tạo DID:
import { DID } from 'dids'
import { Ed25519Provider } from 'key-did-provider-ed25519'
import KeyResolver from 'key-did-resolver'
import { randomBytes } from '@stablelib/random'
const seed = randomBytes(32)
const provider = new Ed25519Provider(seed)
const did = new DID({ provider, resolver: KeyResolver.getResolver() })
await did.authenticate()
console.log('Your DID:', did.id)
Lưu hồ sơ người dùng (user profile) lên Ceramic thông qua IDX:
import { DataModel } from '@glazed/datamodel'
import { DIDDataStore } from '@glazed/did-datastore'
import modelAliases from './model.json'
const datastore = new DIDDataStore({ ceramic, model: modelAliases, did })
await datastore.set('basicProfile', {
name: 'Nam Pham',
description: 'Blockchain Developer – ReFi & DeFi Researcher',
twitter: '@namphamrefi'
})
console.log('Profile saved on Ceramic network.')
5. Tạo & xác minh Verifiable Credential (VC)
Tạo VC để chứng minh danh tính đã được xác minh:
import { createVerifiableCredentialJwt, verifyCredential } from 'did-jwt-vc'
const vcPayload = {
sub: did.id,
nbf: Math.floor(Date.now() / 1000),
vc: {
'@context': ['https://www.w3.org/2018/credentials/v1'],
type: ['VerifiableCredential', 'KYC'],
credentialSubject: {
id: did.id,
verifiedEmail: 'dev@blockchain.vn'
}
}
}
const vcJwt = await createVerifiableCredentialJwt(vcPayload, { issuer: did })
console.log('VC JWT:', vcJwt)
const verifiedVC = await verifyCredential(vcJwt, KeyResolver.getResolver())
console.log('Verified VC:', verifiedVC)
6. DID + Solidity: Lưu & xác minh danh tính on-chain
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract DIDRegistry {
struct Identity {
string did;
address owner;
}
mapping(address => Identity) public identities;
event DIDRegistered(address indexed user, string did);
function registerDID(string calldata _did) external {
identities[msg.sender] = Identity(_did, msg.sender);
emit DIDRegistered(msg.sender, _did);
}
function verifyDID(address _user, string calldata _did) external view returns (bool) {
return (keccak256(abi.encodePacked(identities[_user].did)) == keccak256(abi.encodePacked(_did)));
}
}
Contract này cho phép:
- Đăng ký DID cho từng địa chỉ ví
- Xác minh xem DID có khớp với người gửi không
7. Tích hợp DID vào các hệ thống khác
7.1. Tích hợp vào DeFi (Credit Score & Borrow System)
DID có thể gắn liền với on-chain credit scoring – hệ thống đánh giá độ uy tín dựa trên hành vi ví.
Một số dữ liệu có thể gắn với DID:
- Lịch sử vay/trả trên Aave, Moola, Compound
- Lượng tài sản thế chấp trung bình
- Số lần bị thanh lý hoặc rút non
Ví dụ khi tích hợp:
interface ICreditOracle {
function getCreditScore(address user) external view returns (uint256);
}
contract DIDLending {
ICreditOracle public oracle;
mapping(address => uint256) public borrowLimit;
constructor(address _oracle) {
oracle = ICreditOracle(_oracle);
}
function updateBorrowLimit(address user) external {
uint256 score = oracle.getCreditScore(user);
borrowLimit[user] = score * 10**16; // 1 điểm = 0.01 token vay
}
function getBorrowLimit(address user) external view returns (uint256) {
return borrowLimit[user];
}
}
DID trong trường hợp này dùng để xác minh “ai là ai”, còn Credit Oracle tính điểm từ dữ liệu blockchain (sử dụng VC hoặc Ceramic datastore).
7.2. Tích hợp vào Decentralized Social
Ceramic + IDX hỗ trợ trực tiếp lưu trữ hồ sơ người dùng (profile) cho decentralized social.
Ví dụ: mỗi người có DID riêng, và post trên mạng xã hội được ký bằng DID của họ, có thể kiểm chứng.
const post = {
content: "Bài viết đầu tiên trên mạng xã hội phi tập trung!",
author: did.id,
timestamp: new Date().toISOString()
}
// Lưu lên Ceramic
await datastore.set('socialPost', post)
Ưu điểm:
- Không ai có thể xóa bài viết trừ chính chủ sở hữu DID
- Có thể chứng minh tính xác thực của từng bài đăng
- Dễ tích hợp cross-app (ví dụ dùng chung profile giữa Lens và Torum)
7.3. Tích hợp vào DAO / Governance
Trong DAO, DID giúp mỗi thành viên có chứng nhận danh tính minh bạch, tránh tình trạng Sybil attack (một người tạo nhiều ví để chiếm quyền vote).
Cấu trúc xác minh đơn giản:
function isVerifiedMember(address user, string calldata did) external view returns (bool) {
return didRegistry.verifyDID(user, did);
}
Có thể mở rộng:
- Gắn Verifiable Credential để xác định vai trò (dev, investor, founder)
- Kết hợp DID với Soulbound NFT để lưu “reputation” vĩnh viễn
7.4. Tích hợp vào hệ thống thanh toán & ReFi
DID giúp định danh các doanh nghiệp hoặc cá nhân trong ReFi (Regenerative Finance) — ví dụ các tổ chức trồng rừng, phát hành carbon credit.
- Mỗi tổ chức có DID riêng, kèm VC xác minh dữ liệu trồng rừng.
- Người mua carbon credit có thể kiểm chứng nguồn gốc thông qua DID Document và VC hash lưu on-chain.
Điều này giúp tăng tính minh bạch và khả năng kiểm toán của các dự án môi trường.
8. So sánh các Framework DID phổ biến
| Framework | Ưu điểm | Nhược điểm | Ứng dụng lý tưởng |
|---|---|---|---|
| Ceramic + IDX | Dễ tích hợp, lưu data linh hoạt | Thiếu cơ chế bảo mật nâng cao | Social, DeFi credit |
| SpruceID | Tích hợp Sign-In With Ethereum | Phức tạp hơn khi mở rộng | DApp login |
| Lit Protocol | Có mã hóa dữ liệu DID | Phí gas cao | Private data & encryption |
| Polygon ID | Có sẵn zkProof | SDK nặng | KYC, ẩn danh, DAO voting |
9. Bộ công cụ hỗ trợ Developer
| Tool | Chức năng |
|---|---|
| Ceramic Studio | Giao diện web tạo schema, quản lý data |
| Glaze CLI | Tool CLI cho Ceramic/IDX |
| IDX Playground | Test và hiển thị dữ liệu DID |
| Polygon ID Wallet SDK | Dành cho mobile app có DID |
| Spruce Kit | Tích hợp SIWE (Sign-In With Ethereum) |
10. Hướng mở rộng
Sau khi nắm được các bước cơ bản, dev có thể mở rộng:
- Kết hợp zkProof để ẩn danh hóa dữ liệu người dùng DID
- Tạo Soulbound NFT từ VC để lưu thông tin reputation
- Phát triển Oracle DID cung cấp điểm tín dụng cho DeFi platform
- Kết nối DID + ReFi để xác minh tổ chức môi trường hoặc dữ liệu bền vững
11. Kết luận
Ceramic và IDX là nền tảng thực tiễn và dễ tiếp cận nhất để developer Việt Nam xây dựng DID. Khi kết hợp với Solidity, DID có thể tích hợp sâu vào DeFi, DAO, social, hoặc ReFi, mở ra khả năng kiểm chứng danh tính, credit score và reputation hoàn toàn minh bạch, phi tập trung.
Hướng phát triển tiếp theo cho dev là kết hợp Ceramic + zkProof để tạo hệ thống DID bảo mật và ẩn danh, phục vụ social app, DAO và các giao thức DeFi yêu cầu uy tín mà vẫn giữ quyền riêng tư.