Skip to content

roothash-pay/zkid-contracts

Repository files navigation

🧩 zkID:基于 BN254 的属性级身份证明体系

zkID 是一个基于 BN254 椭圆曲线 的链上 KYC(Know Your Customer)解决方案,结合 BLS 多节点签名Poseidon 哈希承诺ZK-SNARK 零知识证明,实现去中心化、可验证、隐私保护的身份认证体系。


🎯 5.1 设计目标

zkID 的目标是构建一种 可验证隐私保护可扩展 的去信任化身份系统。

用户在完成链下 KYC 实名认证后,可以在 不泄露任何个人隐私信息 的前提下,
向任意链上业务合约证明自己满足某项属性条件(例如「年龄 ≥ 18 岁」)。

该系统结合:

  • BN254 椭圆曲线:提供高效配对验证;
  • BLS 聚合签名:确保 Oracle 层的去中心化可信;
  • ZK-SNARK 电路:在不公开原始信息的情况下完成属性证明。

核心思想:

  • 🟣 Oracle 说真话(签名)
  • 🟢 用户自己算(生成 zk-proof)
  • 🔵 链上验结果(pairing + verifier)

🧱 5.2 系统角色

  1. 用户(User):提交隐私信息、生成零知识证明。
  2. Oracle(ID Oracle):完成链下 KYC 验证,并基于结果生成承诺点与 BLS 签名。
  3. Verifier 合约:在链上验证 Oracle 签名及 zk-proof,有效判断用户是否满足特定属性。

🔄 5.3 系统总体流程

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)
     │<─────────────────────────────────────────────────│
     │             ✅ 验证通过                          │

⚙️ 6. 架构实现

6.1 总体架构

1. Oracle 服务(Go)

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 公钥

  • 返回给用户:


2. 证明端 Prover(Go)

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 …]) 上传链上进行验证。

3. 链上(Solidity)

链上通过 Oracle 签名验证与 ZK 验证器合约完成最终校验。

  • OracleSigVerifier.sol

使用 EVM 预编译的 BN254 pairing 验证 Oracle 签名:

pairing(σ, g2) == pairing(P, pk_oracle)

  • Groth16Verifier.sol

由 gnark 或 snarkjs 自动生成的 ZK 证明验证器;

验证 Prover 生成的证明有效性。

  • PolicyRouter.sol

整合两步验证逻辑:先验签,再验 ZK;

业务合约只需依赖验证结果即可完成访问控制。

🧩 技术选型(Go 侧)

  • 模块 技术栈 / 库 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 与电路中必须使用完全一致的 HashToCurve 规则以确保验证一致性。

🧱 系统分层职责 层级 模块 职责 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)

Author: Vant liber

zkID · 基于零知识的隐私身份系统

「Oracle 说真话,用户自己算,链上验结果」


About

zkID is an on-chain KYC solution that integrates decentralized Oracle verification, enabling trustless and privacy-preserving identity authentication.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors