DID 核心 — 设计
日期: 2026-03-04 状态: 已批准 范围: 全量 PRD(P0 + P1 + P2),方案 A 分层渐进
1. 概述
1.1 目标
在 BabyDriver L2 上实现原生去中心化身份 (DID) 系统,作为系统合约部署,提供:
W3C DID Core 兼容的身份注册与解析
Verifiable Credentials (VC) 发行、验证、撤销
PLONK ZK 身份证明(复用 zksync 原生证明系统)
Ethereum L1 双向 DID 同步
社会恢复、企业 IAM、匿名凭证
1.2 设计决策
DID 方法
did:ethr:baby:0x...
成熟生态,复用 ethr-did-registry,Veramo 直接兼容
ZK 证明
PLONK (zksync 原生 boojum)
与底层 ZK 基础设施统一,universal trusted setup
部署方式
全部系统合约 (0x8017-0x8019)
原生内置、gas 特权、与 OracleHub 一致
跨链
Ethereum L1 双向 (Mailbox)
复用现有 L1⟷L2 消息通道
实现策略
分层渐进 (5a→5b→5c)
每阶段可独立验证,P0 最快落地
1.3 标准兼容
W3C DID Core 1.0
EIP-4361 (Sign-In with Ethereum)
ethr-did-registry 合约接口
W3C Verifiable Credentials Data Model
2. 系统合约架构
2.1 地址分配
0x8016
OracleHub
价格预言机 (已完成)
Phase 2
0x8017
DIDRegistry
DID 注册/解析/更新/撤销
5a (P0)
0x8018
CredentialRegistry
VC 发行/验证/撤销
5a (P0)
0x8019
IdentityVerifier
ZK 身份证明验证 + 合规授权
5a (P0)
2.2 DIDRegistry (0x8017)
核心存储:
DID 文档结构:
DID 标识符格式: did:ethr:baby:0x1234...
关键函数:
createDID()
onlySystemCall
5a
updateDocument(bytes32[] methods, bytes32 serviceHash)
onlyController
5a
addDelegate(address delegate, uint256 validity)
onlyController
5a
revokeDelegate(address delegate)
onlyController
5a
resolveDID(address identity) → DIDDocument
公开读取
5a
deactivateDID()
onlyController
5a
syncToL1(address identity)
onlyController
5b
receiveFromL1(address identity, bytes32 docHash)
onlyBootloader
5b
addGuardian(address guardian)
onlyController
5c
removeGuardian(address guardian)
onlyController
5c
socialRecover(address identity, address newController, bytes[] sigs)
公开
5c
cancelRecovery()
onlyController
5c
事件:
2.3 CredentialRegistry (0x8018)
核心存储:
凭证结构:
关键函数:
issueCredential(address subject, bytes32 credType, bytes32 claimHash, uint64 expiry, bytes sig)
onlySystemCall
5a
verifyCredential(bytes32 credId) → bool
公开读取
5a
revokeCredential(bytes32 credId)
onlyIssuer
5a
isCredentialValid(bytes32 credId) → bool
公开读取
5a
getCredentialsBySubject(address) → bytes32[]
公开读取
5a
getCredentialsByIssuer(address) → bytes32[]
公开读取
5a
CredentialId 计算: keccak256(abi.encode(issuer, subject, credType, claimHash, issuedAt))
2.4 IdentityVerifier (0x8019)
双模式验证(P0 ECDSA → P1 ZK PLONK 升级):
关键函数:
verifyIdentity(address identity, bytes32 credType) → bool
公开读取
5a
checkCompliance(address identity, bytes32 requirement) → bool
公开读取
5a
authorizeTransaction(address identity, bytes txData) → bool
onlySystemCall
5a
verifyZKProof(bytes proof, uint256[] publicInputs) → bool
公开
5b
getCreditScore(address identity) → uint256
公开读取
5b
setVerificationMode(VerificationMode mode)
onlyAdmin
5b
Oracle 集成 (5b):
3. ZK 身份证明(PLONK)
3.1 架构
3.2 PLONK 电路
电路 1: KYC 合规证明 (P1)
私有输入
name, nationality, birthDate, kycLevel, issuerSignature
公开输入
credentialHash, isOver18, isNotSanctioned, kycLevelMeetsRequirement
证明
"我持有有效 KYC 凭证,满足年龄/制裁/等级要求" — 零知识
电路 2: 信用评分证明 (P1)
私有输入
creditHistory[], oracleSignatures[], actualScore
公开输入
scoreAboveThreshold, threshold
证明
"我的信用评分 >= X" — 不暴露具体分数
电路 3: 匿名集合成员证明 (P2)
私有输入
identity, merkleProof
公开输入
merkleRoot, nullifier
证明
"我是认证用户集合的成员" — 不暴露身份
3.3 PLONK 集成路径
复用 zksync-era 的 boojum 库:
使用
boojum定义 DID 电路约束电路编译为 Verifier key
用户端用
boojumwitness generator 生成 proofIdentityVerifier.verifyZKProof()调用预编译的 PLONK 验证逻辑
3.4 隐私保护机制
选择性披露
ZK 电路只暴露公开输入
5b (P1)
匿名凭证
Nullifier-based(防双花)
5c (P2)
数据最小化
链上只存哈希,原始数据链下
5a (P0)
凭证撤销
Merkle Tree 撤销列表(高效批量查询)
5a (P0)
4. L1 ⟷ L2 跨链 DID 同步
4.1 架构
4.2 同步流程
L2 → L1 同步(DID 创建/更新):
用户在 L2 调用
DIDRegistry.syncToL1(identity)合约 emit
DIDSynced(identity, documentHash)事件L2→L1 消息通过 Mailbox 发送(batch finalize 时提交)
L1
DIDFacet.syncFromL2()接收并存储最小镜像(address → bytes32 docHash)
L1 → L2 同步(外部 DID 导入):
用户在 L1 调用
DIDFacet.pushToL2(identity, docHash)通过 Mailbox
requestL2Transaction()发送到 L2L2
DIDRegistry.receiveFromL1()处理导入验证 L1 消息来源(
msg.sender == BOOTLOADER)
4.3 L1 DIDFacet
部署在 era Diamond Proxy 中:
只存储最小数据
mapping(address => bytes32) l2DidHashes提供
resolveDID(address) → bytes32查询接口第三方 DApp 可通过 L1 验证用户是否拥有有效 BabyDriver DID
5. 社会恢复 + 企业 IAM (P2)
5.1 社会恢复
恢复流程:
用户丢失密钥 → 联系 guardian
threshold个 guardian 签名同意DIDRegistry.socialRecover(identity, newController, signatures)48h delay 后生效(给原所有者反应时间)
原 controller 可在 delay 内
cancelRecovery()
5.2 企业 IAM
关键函数:
createEnterprise(bytes32 name)— 创建企业身份空间addRole(bytes32 name, bytes32[] permissions)— 定义角色assignRole(address member, bytes32 role)— 分配角色revokeRole(address member, bytes32 role)— 撤销角色hasPermission(address member, bytes32 permission) → bool— 权限检查
6. 系统集成点
6.1 OracleHub (0x8016) 集成
IdentityVerifier 调用 OracleHub 获取信用评分
信用评分 VC 的数据源来自 Oracle 聚合价格
6.2 Bridge 集成
FastWithdrawalPool 调用
IdentityVerifier.checkCompliance()做合规检查大额跨链转账触发 DID 合规验证
6.3 SIWE 登录 (EIP-4361)
前端使用 Sign-In with Ethereum 消息签名
签名消息包含 BabyDriver chain_id (271)
后端验证签名 → 查询 DIDRegistry → 返回身份信息
7. 交付计划
5a (P0, ~5天) — 核心身份层
交付物:
DIDRegistry 系统合约 (0x8017) — 注册/解析/更新/撤销/委托
CredentialRegistry 系统合约 (0x8018) — VC 发行/验证/撤销
IdentityVerifier 系统合约 (0x8019) — ECDSA 验证模式
SIWE 登录集成 (EIP-4361)
完整 Foundry 测试套件
Constants.sol + SYSTEM_CONTRACT_LIST 注册
验证标准: 创建 DID → 发行 VC → 验证 VC → 解析 DID 全流程
5b (P1, ~5天) — ZK + Oracle + 跨链
交付物:
PLONK 电路: KYC 合规证明 + 信用评分证明 (boojum)
IdentityVerifier 升级: verifyZKProof() 真实 PLONK 验证
Oracle 集成: getCreditScore() 从 OracleHub 读取
L1 DIDFacet (Diamond Proxy) + 双向 Mailbox 同步
ZK witness generator (用户端)
验证标准: ZK proof 生成 → 链上验证 → L1 查询 L2 DID
5c (P2, ~4天) — 高级功能
交付物:
社会恢复 (Guardian + threshold 3/5 + 48h delay)
多设备管理 (多 verificationMethod)
匿名集合成员证明 (Nullifier-based)
企业 IAM (角色 + 权限 + 成员管理)
验证标准: 社会恢复 E2E + 企业角色权限检查 + 匿名证明验证
8. 需要修改的文件清单
era-contracts-l1 (系统合约)
system-contracts/contracts/Constants.sol
添加 DID_REGISTRY/CREDENTIAL_REGISTRY/IDENTITY_VERIFIER 地址
5a
system-contracts/contracts/DIDRegistry.sol
新建系统合约
5a
system-contracts/contracts/CredentialRegistry.sol
新建系统合约
5a
system-contracts/contracts/IdentityVerifier.sol
新建系统合约
5a
system-contracts/contracts/interfaces/IDIDRegistry.sol
新建接口
5a
system-contracts/contracts/interfaces/ICredentialRegistry.sol
新建接口
5a
system-contracts/contracts/interfaces/IIdentityVerifier.sol
新建接口
5a
system-contracts/scripts/constants.ts
注册 DID 系统合约地址
5a
l1-contracts/contracts/state-transition/chain-deps/facets/DIDFacet.sol
L1 DID 查询 facet
5b
era-core (Rust 节点)
core/lib/constants/src/contracts.rs
添加 DID 系统合约 Rust 常量
5a
core/lib/types/src/system_contracts.rs
注册到 SYSTEM_CONTRACT_LIST
5a
baby-modules (BabyDriver 自研)
baby-modules/did-circuits/
PLONK 电路 (boojum)
5b
baby-modules/did-sdk/
TypeScript SDK (Veramo 集成)
5b
保留的参考仓库
refs/ethr-did-registry/
DIDRegistry 合约参考
refs/veramo/
TypeScript DID 框架参考
refs/siwe/
SIWE 登录参考
refs/ERC725/
ERC-725 标准参考
refs/did-jwt/
JWT 签名/验证参考
refs/spruceid-ssi/
Rust SSI 基础设施参考
Last updated