ZK 身份 + Oracle — 设计
日期: 2026-03-04 状态: 已批准 前置: Phase 5a (DID 核心 — 已完成) 范围: ZK 身份证明 + Oracle 信用评分(不含 L1 DIDFacet)
1. 概述
1.1 目标
在 Phase 5a 的 DID 系统合约基础上,添加:
ZK 身份证明: 用户本地生成零知识证明,链上验证合规性而不暴露隐私数据
Oracle 信用评分: 链上行为分析 + 链下数据聚合,通过 OracleHub (0x8016) 提供信用评分
企业身份维度: KYC/信用评分均支持个人 + 企业机构两个维度
1.2 关键设计决策
ZK 证明系统
Groth16/circom
boojum 使用 Goldilocks field,电路为 VM 专用,自定义电路需 recursion wrapping 极其复杂
链上验证
BN256 ecPairing 预编译
EIP-197,~200k gas,成熟稳定
信用评分数据源
混合模式(链上+链下)
链上行为客观可验证,链下数据补充监管需求
电路数量
3 个(KYC + 信用 + 企业)
覆盖个人 + 企业合规场景
可信设置
Powers of Tau ceremony
Groth16 需要 circuit-specific trusted setup
1.3 为什么不用 boojum
经过对 zksync-era boojum 库的深入研究:
Goldilocks field (p ≈ 2^64): boojum 使用 64-bit 域,与 BN256 (254-bit) 不兼容,链上验证需要递归包装
VM 专用电路: 13 个 base circuits 全部服务于 VM 执行(MainVM, CodeDecommitter, RAM, etc.),不支持自定义逻辑
递归开销: 自定义电路 → Goldilocks proof → 递归 wrapping → BN256 proof,工程量巨大
circom 优势: 直接生成 BN256 proof,社区成熟(Semaphore, Tornado Cash, zkSync 自身的 Account Abstraction 也用 ECDSA 验证),开发效率高 10x+
2. ZK 电路架构
2.1 整体流程
2.2 电路 1: KYCComplianceProof(个人 + 企业)
用途: 证明 "我持有有效 KYC 凭证且满足合规要求" — 不暴露姓名、国籍等隐私
私有输入 (witness):
name
string→hash
姓名哈希
nationality
uint8
国籍代码
birthDate
uint64
出生日期
kycLevel
uint8
KYC 等级 (1-4)
issuerSignature
(R, S)
发行者 ECDSA 签名
orgType
uint8
机构类型: 0=个人, 1=企业, 2=DAO, 3=政府
orgLicenseHash
bytes32
营业执照/注册证哈希
orgComplianceLevel
uint8
企业合规等级 (1-5)
employeeRole
uint8
操作者在企业中的角色
公开输入:
credentialHash
bytes32
凭证哈希 (链上可验)
isOver18
bool
年龄满足
isNotSanctioned
bool
非制裁名单
kycLevelMeetsRequirement
bool
KYC 等级达标
isOrgCompliant
bool
企业合规 (orgType=0 时固定 true)
orgComplianceMeetsLevel
bool
企业合规等级达标
issuerPubKey
(Qx, Qy)
发行者公钥 (链上校验可信)
电路约束 (~15,000 constraints):
ECDSA 签名验证:
verify(issuerPubKey, message, (R, S))— ~10,000 constraints年龄计算:
currentTimestamp - birthDate >= 18 years制裁名单:
nationality ∉ sanctionedList(Poseidon Merkle 成员证明)KYC 等级:
kycLevel >= requiredLevel凭证哈希:
credentialHash == Poseidon(name, nationality, birthDate, ...)企业维度 (orgType > 0 时启用):
orgLicenseHash ≠ 0(持有有效执照)orgComplianceLevel >= requiredOrgLevelemployeeRole ∈ authorizedRoles(操作者有权限)
2.3 电路 2: CreditScoreProof(个人 + 企业)
用途: 证明 "我的信用评分 >= 阈值" — 不暴露具体分数
私有输入 (witness):
personalScore
uint256
个人信用分 (0-1000)
personalFactors
uint256[8]
评分因子 (tx count, holding time, etc.)
orgScore
uint256
企业信用分 (0-1000,个人填 0)
orgFactors
uint256[8]
企业评分因子 (revenue, audit, etc.)
oracleSignature
(R, S)
Oracle 签名证明评分真实性
oracleTimestamp
uint64
评分时间
公开输入:
personalScoreAboveThreshold
bool
个人分 >= 阈值
orgScoreAboveThreshold
bool
企业分 >= 阈值
personalThreshold
uint256
个人阈值
orgThreshold
uint256
企业阈值
oraclePubKey
(Qx, Qy)
Oracle 公钥
freshnessValid
bool
评分未过期
电路约束 (~12,000 constraints):
Oracle 签名验证:
verify(oraclePubKey, (personalScore, orgScore, timestamp), sig)个人分比较:
personalScore >= personalThreshold企业分比较:
orgScore >= orgThreshold(orgScore=0 时跳过)时效性:
currentTimestamp - oracleTimestamp <= maxAge评分范围:
0 <= personalScore <= 1000,0 <= orgScore <= 1000
2.4 电路 3: EnterpriseIdentityProof
用途: 证明 "我是某认证企业的授权操作者" — 不暴露企业内部架构
私有输入 (witness):
operatorAddress
address
操作者地址
orgRootDID
address
企业根 DID
orgMerkleProof
bytes32[]
企业成员 Merkle 证明
roleLevel
uint8
角色级别
delegationChain
address[]
委托链路
公开输入:
orgMerkleRoot
bytes32
企业成员树根
isAuthorized
bool
操作者被授权
minRoleLevel
uint8
最低角色级别
nullifier
bytes32
防重放
电路约束 (~8,000 constraints):
Merkle 包含证明:
verify(orgMerkleRoot, operatorAddress, orgMerkleProof)角色验证:
roleLevel >= minRoleLevel委托链有效性: 每级委托有 DID 签名
Nullifier:
nullifier = Poseidon(operatorAddress, actionNonce)— 防重放
2.5 链上验证合约 (Groth16Verifier)
部署模式: 每个电路生成一个 Verifier 合约,IdentityVerifier (0x8019) 持有各 Verifier 地址,统一调度。
3. Oracle 信用评分系统
3.1 架构
3.2 评分因子
个人评分 (CREDIT:PERSONAL:)
交易活跃度
20%
链上
tx_count / time_period
DeFi 参与
15%
链上
unique_protocols * avg_tvl
持币时长
15%
链上
weighted_avg_hold_days
违约记录
-25%
链上+链下
清算/违约次数
KYC 等级
10%
链上
kyc_level * weight
账户年龄
10%
链上
days_since_first_tx
外部信用
5%
链下
credit_bureau_score / normalize
企业评分 (CREDIT:ORG:)
链上交易量
20%
链上
volume / time_period
合规等级
20%
链上+链下
compliance_level
审计状态
15%
链下
audit_passed ? bonus : penalty
员工 DID 覆盖率
10%
链上
active_employee_dids / total
运营历史
15%
链上
months_active * consistency
监管评级
10%
链下
regulatory_rating / normalize
行业黑名单
-10%
链下
blacklist_check
综合评分 (CREDIT:COMPOSITE:): max(personalScore, orgScore) * 0.6 + min(personalScore, orgScore) * 0.4
3.3 OracleHub Symbol 扩展
现有 OracleHub 使用 string symbol 作为键(如 "ETH/USD")。信用评分复用相同接口:
无需修改 OracleHub 合约 — 评分数据通过现有 updatePrice() 接口写入,getLatestPrice() 读取。
3.4 CreditScoreAggregator (Rust 服务)
位于 baby-modules/credit-score/,作为 WiringLayer 集成到节点:
更新频率: 每 10 分钟重新计算活跃用户/企业的信用评分。
4. IdentityVerifier 升级方案
4.1 新增函数
在现有 IdentityVerifier (0x8019) 基础上添加:
4.2 新增存储
4.3 verifyZKProof 实现逻辑
5. 项目结构
6. 交付计划
Task 1: circom 环境搭建 + 项目结构 (~0.5 天)
安装 circom 2.x + snarkjs
创建
baby-modules/did-circuits/结构配置 package.json (circomlib 依赖)
验证:
circom --version+ 编译示例电路
Task 2: KYCComplianceProof 电路 (~1 天)
编写 circom 电路 (私有输入/公开输出/约束)
包含 ECDSA 验证 + 年龄检查 + 制裁名单 + 企业维度
编写 JS 测试 (witness 生成 + proof 生成 + 验证)
验证: 全部测试通过
Task 3: CreditScoreProof 电路 (~1 天)
编写信用评分电路 (个人+企业双维度)
Oracle 签名验证 + 阈值比较
JS 测试
验证: 全部测试通过
Task 4: EnterpriseIdentityProof 电路 (~0.5 天)
编写企业身份电路 (Merkle 成员证明 + 角色验证)
JS 测试
验证: 全部测试通过
Task 5: Trusted Setup + Verifier 合约生成 (~0.5 天)
Powers of Tau ceremony (开发用)
每个电路 phase 2 setup
snarkjs 导出 Solidity Verifier 合约
验证: 3 个 Verifier 合约编译通过
Task 6: IdentityVerifier 升级 (~1 天)
添加 verifyZKProof() + setCircuitVerifier() + getCreditScore()
更新 IIdentityVerifier 接口
更新 Local 版本 + Foundry 测试
集成测试: 完整 proof 生成 → 链上验证 → compliance 更新
验证: 所有现有测试 + 新测试通过
Task 7: Oracle 信用评分集成 (~0.5 天)
IdentityVerifier 读取 OracleHub credit symbols
Foundry 测试: mock OracleHub 返回评分 → getCreditScore() 验证
验证: 信用评分读取 + ZK 信用证明端到端
总计: ~5 天
7. 风险和缓解
circom ECDSA 电路约束数过多
证明生成慢
使用 circom-ecdsa 优化库,约束 ~10k 可接受
Groth16 trusted setup 安全性
生产安全
开发用小规模 ceremony,主网前用 Hermez 的 Powers of Tau
信用评分 Oracle 被操纵
评分不可信
多源聚合 + 异常检测 + 最低源数量 (复用 OracleHub 机制)
ZK proof 链上验证 gas 过高
成本
Groth16 固定 ~200k gas,BabyDriver L2 gas 成本远低于 L1
企业维度增加电路复杂度
开发时间
orgType=0 时自动跳过企业约束,保持个人路径简洁
Last updated