zkID 是一个基于 BN254 椭圆曲线 的链上 KYC(Know Your Customer)解决方案,结合 BLS 多节点签名、Poseidon 哈希承诺 与 ZK-SNARK 零知识证明,实现去中心化、可验证、隐私保护的身份认证体系。
zkID 的目标是构建一种 可验证、隐私保护、可扩展 的去信任化身份系统。
用户在完成链下 KYC 实名认证后,可以在 不泄露任何个人隐私信息 的前提下,
向任意链上业务合约证明自己满足某项属性条件(例如「年龄 ≥ 18 岁」)。
该系统结合:
- BN254 椭圆曲线:提供高效配对验证;
- BLS 聚合签名:确保 Oracle 层的去中心化可信;
- ZK-SNARK 电路:在不公开原始信息的情况下完成属性证明。
核心思想:
- 🟣 Oracle 说真话(签名)
- 🟢 用户自己算(生成 zk-proof)
- 🔵 链上验结果(pairing + verifier)
- 用户(User):提交隐私信息、生成零知识证明。
- Oracle(ID Oracle):完成链下 KYC 验证,并基于结果生成承诺点与 BLS 签名。
- Verifier 合约:在链上验证 Oracle 签名及 zk-proof,有效判断用户是否满足特定属性。
zkID 系统由三层组成:
| 层级 | 主要职责 |
|---|---|
| Oracle 签发层 | 负责生成 BN254 承诺点(P)并对其签名; |
| 用户证明层 | 基于私密信息生成 zk-proof; |
| 链上验证层 | 验证 Oracle 签名与 zk-proof 的有效性。 |
┌────────────┐ ┌─────────────┐ ┌────────────────┐
│ 用户 │ │ ID Oracle │ │ Verifier合约 │
└────┬───────┘ └──────┬──────┘ └────────────┬───┘
│ 提交身份信息 │ │
│─────────────────────────>│ │
│ │ 生成 P = H2C(Poseidon(m, r))
│ │ 签名 σ = Sign(sk, Hash(P, policy))
│<─────────────────────────│ │
│ 获得 (P, σ, policy) │ │
│ 生成 zk-proof(m, r, P) │
│─────────────────────────────────────────────────>│
│ │ 验签 e(σ, g2) == e(P, pk)
│ │ 验证 zk-proof verifyProof(P)
│<─────────────────────────────────────────────────│
│ ✅ 验证通过 │
Oracle 是系统的权威签发者,负责为用户的身份属性生成 BN254 承诺点与签名。
- 使用
gnark-crypto实现 BN254 椭圆曲线、配对、Poseidon 哈希; - 计算:
h = Poseidon(did, m, r, policy_id, version)
-
将
h哈希到 G1 曲线点: P = HashToCurve_BN254(h) -
使用 Oracle 私钥签名: σ = sk_oracle * P // G1 签名 pk = sk_oracle * g2 // G2 公钥
-
返回给用户:
Prover 负责在链下构建并生成零知识证明,证明用户的属性满足特定条件。
- 使用
gnark构建电路约束:
h' = Poseidon(did, m, r, policy_id, version)
P' = H2C(h')
assert(P' == P)
assert(m.age >= threshold)使用 Groth16 生成 ZK 证明:
proof = groth16.Prove(circuit, witness)
将 proof + public inputs (P.x, P.y, threshold[, did …]) 上传链上进行验证。
链上通过 Oracle 签名验证与 ZK 验证器合约完成最终校验。
- OracleSigVerifier.sol
使用 EVM 预编译的 BN254 pairing 验证 Oracle 签名:
pairing(σ, g2) == pairing(P, pk_oracle)
- Groth16Verifier.sol
由 gnark 或 snarkjs 自动生成的 ZK 证明验证器;
验证 Prover 生成的证明有效性。
- PolicyRouter.sol
整合两步验证逻辑:先验签,再验 ZK;
业务合约只需依赖验证结果即可完成访问控制。
-
模块 技术栈 / 库 Groth16 / BN254)
-
电路 / 证明 gnark
-
椭圆曲线 / 配对 gnark-crypto/ecc/bn254
-
Poseidon 哈希 gnark-crypto/ecc/bn254/fr/poseidon 或 gnark/std/hash/poseidon
-
Hash-to-Curve 方案A(推荐):电路中实现 ZK 友好 H2C(简化 SWU / try-and-increment)
方案B(快速原型):限定 2~3 次 try-and-increment,失败路径用选择器屏蔽
🧱 系统分层职责 层级 模块 职责 Oracle 层 Oracle Service 负责签发属性承诺与签名 证明层 Prover 生成零知识证明,链下执行 链上层 PolicyRouter.sol, OracleRegistry, Groth16Verifier 统一策略验证入口,完成链上验签与验 ZK
🔒 信任模型一览
┌────────────────────────────┐
│ zkID System │
└────────────────────────────┘
│
│ 注册 ORACLE_PK + Verifier
▼
┌──────────────────┐ ┌──────────────────┐
│ ID Oracle │ │ User/DApp Prover│
│ (权威签发者) │ │ (生成 ZK 证明) │
│ 持有 oracleSK │ │ 调用 gnark 生成 │
│ 负责签名 σ │ │ proof │
└──────────────────┘ └──────────────────┘
│ │
│ (P, σ, h, policy,ver) │ proof + public inputs
└───────────────┬───────────┘
│
▼
┌────────────────────────┐
│ PolicyRouter.sol │
│ ├─ OracleSigVerifier │
│ ├─ Verifier_AgeGE_V1 │
│ └─ OracleRegistry │
└────────────────────────┘
Go 环境
go get github.com/ConsenSys/gnark
go get github.com/ConsenSys/gnark-crypto
电路编译
go run main.go build-circuit
证明生成
go run main.go prove
Solidity 验证
forge test
ConsenSys gnark Documentation
Ethereum Precompiles — EIP-197: Pairing
Poseidon Hash Function
Hash-to-Curve Standard (IETF Draft)
zkID · 基于零知识的隐私身份系统
「Oracle 说真话,用户自己算,链上验结果」