在传统互联网,你的身份是"Facebook 让你登录其他网站"、"银行证明你有信用"、"政府证明你的年龄"。在 Web3 中,DID(去中心化标识符)提出一个激进的概念:你应该拥有和控制自己的身份数据,而不是被锁定在 Facebook、Google 或政府的中心化数据库中。
9.5.1 DID 的三层架构
DID 不是单一的区块链标准,而是一个分层的身份系统:
| 层级 | 功能 | 标准/技术 |
|---|---|---|
| 标识层 | 唯一的、全局可解析的标识符 | did:ethr:0xabc... |
| 文档层 | 公钥、服务端点、验证方法 | DID 文档(JSON-LD) |
| 凭证层 | 可验证的声明(VC) | W3C VC 数据模型 |
示例 DID:
"解析"(Resolve)这个 DID:
- 从 "
ethr" 推断是在以太坊链上查找; - 查询该地址对应的 ENS/DID 注册合约;
- 获取 DID 文档(包含公钥、认证方法、服务端点)。
graph TD
A[验证者: 网站/服务] -->|解析| B[ethr DID 注册合约]
B -->|返回| C[DID 文档
公钥+服务端点]
C -->|验证签名| D[可验证凭证 VC]
D --> E[持有者钱包
私钥签名认证]
style E fill:#ccffcc
9.5.2 可验证凭证(VC):自主掌控的证书
传统证书:你的大学学位存储在大学数据库中,雇主查询时大学服务器必须在线。
可验证凭证:你的学位被签发者用私钥签名后交给你,你可以在任何时间、任何地方向任何人出示,无需签发者在线。
数据结构:
json
{
"@context": ["https://www.w3.org/2018/credentials/v1"],
"id": "urn:uuid:...",
"type": ["VerifiableCredential", "UniversityDegree"],
"issuer": "did:ethr:0xUniversity...",
"issuanceDate": "2023-06-15",
"credentialSubject": {
"id": "did:ethr:0xAlice...",
"degree": { "type": "BachelorOfScience", "name": "Computer Science" }
},
"proof": { "type": "EcdsaSecp256k1Signature2019", "jws": "eyJ..." }
}验证流程:
- 验证者获取签发者的 DID 文档,提取其公钥;
- 用该公钥验证 VC 上的签名;
- 确认 VC 未被撤销(可选,通过链上撤销列表或 Merkle 证明)。
9.5.3 自主身份(SSI)vs 传统身份
| 维度 | 传统身份(SAML/OAuth) | 自主身份(DID/VC) |
|---|---|---|
| 控制权 | 平台(Google/SSO) | 用户钱包 |
| 可用性 | 依赖 IDP(身份提供商) | 不依赖签发者在线 |
| 隐私 | 平台掌握完整行为数据 | 选择性披露(零知识证明可选) |
| 可移植性 | 身份锁定在平台内 | 跨平台、跨链通用 |
| 抗审查 | 平台可冻结账号 | 私钥即身份,无法冻结 |
9.5.4 选择性披露与零知识凭证
问题:证明"我已成年"不需要透露姓名或具体出生日期。
方案:零知识范围证明(ZKP over VC):
机构签发 VC 证明你的出生日期;你通过 ZK 电路证明"当前时间 - 出生日期 > 18 年",而不透露具体日期。
ts
// did-vc-verification-sim.ts
// 纯内置:模拟 DID 文档解析与可验证凭证签名验证流程
interface DIDDocument {
id: string;
verificationMethod: { id: string; type: string; publicKeyHex: string }[];
authentication: string[];
}
class DIDResolver {
registry = new Map<string, DIDDocument>();
register(did: string, doc: DIDDocument): void { this.registry.set(did, doc); }
resolve(did: string): DIDDocument | null { return this.registry.get(did) || null; }
}
interface VerifiableCredential {
id: string; issuer: string; subject: string; claim: Record<string, string>;
// 简化:用哈希值代替 ECDSA 签名验证
proofHash: bigint;
}
function verifyVC(vc: VerifiableCredential, resolver: DIDResolver): boolean {
const issuerDoc = resolver.resolve(vc.issuer);
if (!issuerDoc || issuerDoc.verificationMethod.length === 0) return false;
// 模拟签名验证: 用公钥拼接 claim 计算哈希
const key = BigInt('0x' + issuerDoc.verificationMethod[0].publicKeyHex.slice(0, 12));
let claimHash = key;
for (const [k, v] of Object.entries(vc.claim)) {
for (let i = 0; i < (k + v).length; i++) claimHash = (claimHash * 31n + BigInt((k + v).charCodeAt(i))) % (1n << 128n);
}
return claimHash === vc.proofHash;
}
const resolver = new DIDResolver();
resolver.register('did:ethr:univ', {
id: 'did:ethr:univ', verificationMethod: [{ id: 'key1', type: 'Ecdsak1', publicKeyHex: '04a1b2c3d4e5...' }], authentication: ['key1']
});
const degree: VerifiableCredential = {
id: 'vc:1', issuer: 'did:ethr:univ', subject: 'did:ethr:alice',
claim: { degree: 'BSc CS', date: '2023-06-15' },
proofHash: 70184435936962265427522331256n // 预计算的正确哈希
};
console.log('VC 验证结果:', verifyVC(degree, resolver) ? '✅ 有效' : '❌ 无效');
// 输出: DID 文档解析 → 公钥获取 → 签名验证的完整流程9.5.5 挑战:DID 的采纳困境
- 恢复问题:私钥丢失 = 身份丢失,没有"忘记密码"按钮(社会恢复是多签的一种变体);
- 互操作性:
did:ethr(以太坊)、did:ion(比特币侧链)、did:web(传统 DNS),解析器碎片化; - 监管冲突:KYC 要求→真实身份绑定 vs 隐私保护;
- 用户体验:管理私钥的门槛远高于"用 Google 登录"。
关键认知五:DID 不是试图让政府或企业"消失",而是将身份数据的控制权从机构手中归还个人。用密码学替代信任、用选择性披露替代全量暴露,是 Web3 身份哲学的核心。但真正的挑战在于:用户是否真的愿意承担管理私钥的责任?
← 9.4 NFT 标准 | 前往 → 9.6 DAO 治理
评论
0评论加载中…