ZK 身份 + Oracle — 实现
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: Add Groth16/circom ZK identity proofs and Oracle credit score integration to the BabyDriver DID system.
Architecture: Three circom circuits (KYC, CreditScore, Enterprise) generate Groth16 proofs off-chain. IdentityVerifier (0x8019) dispatches to per-circuit Groth16Verifier contracts for on-chain verification via BN256 ecPairing (~200k gas). Credit scores are stored in OracleHub (0x8016) using CREDIT:* symbols and read by IdentityVerifier.
Tech Stack: circom 2.x, snarkjs 0.7+, circomlib (Poseidon, EdDSA, comparators), Foundry (Solidity tests), Node.js 20+
Design Doc: docs/plans/2026-03-04-zk-identity-oracle-design.md
Design Note — EdDSA vs ECDSA: The design doc specifies ECDSA signatures, but circom handles EdDSA (Baby Jubjub curve) natively with ~5k constraints vs ~1.5M for secp256k1 ECDSA. All circuits use EdDSA/Poseidon for signature verification. Issuers and oracles generate EdDSA keypairs specifically for ZK circuits. This is the standard approach (Semaphore, Tornado Cash, etc.).
Task 1: circom Environment Setup + Project Structure
Files:
Create:
baby-modules/did-circuits/package.jsonCreate:
baby-modules/did-circuits/.gitignoreCreate:
baby-modules/did-circuits/circuits/lib/merkle_proof.circomCreate:
baby-modules/did-circuits/scripts/compile.shCreate:
baby-modules/did-circuits/scripts/setup.sh
Step 1: Install circom compiler
circom is a Rust binary. Install from source:
cd /tmp
git clone https://github.com/iden3/circom.git
cd circom
cargo build --release
cargo install --path circomVerify:
Expected: circom compiler 2.x.x
Step 2: Create project structure
Step 3: Create package.json
Create baby-modules/did-circuits/package.json:
Step 4: Create .gitignore
Create baby-modules/did-circuits/.gitignore:
Step 5: Create Merkle proof helper circuit
Create baby-modules/did-circuits/circuits/lib/merkle_proof.circom:
Step 6: Create compile script
Create baby-modules/did-circuits/scripts/compile.sh:
Step 7: Create setup script (trusted setup)
Create baby-modules/did-circuits/scripts/setup.sh:
Step 8: Install dependencies + verify
Expected: Both commands succeed, node_modules/circomlib/circuits/poseidon.circom exists.
Step 9: Commit
Task 2: KYCComplianceProof Circuit
Files:
Create:
baby-modules/did-circuits/circuits/kyc_compliance.circomCreate:
baby-modules/did-circuits/test/kyc_compliance.test.jsCreate:
baby-modules/did-circuits/input/kyc_input.json
Step 1: Write the KYC circuit
Create baby-modules/did-circuits/circuits/kyc_compliance.circom:
Step 2: Write the test
Create baby-modules/did-circuits/test/kyc_compliance.test.js:
Step 3: Compile the circuit
Expected: kyc_compliance.r1cs + kyc_compliance_js/ created in build/. No errors.
Step 4: Run the tests
Expected: All 8 tests pass.
Step 5: Commit
Task 3: CreditScoreProof Circuit
Files:
Create:
baby-modules/did-circuits/circuits/credit_score.circomCreate:
baby-modules/did-circuits/test/credit_score.test.js
Step 1: Write the CreditScore circuit
Create baby-modules/did-circuits/circuits/credit_score.circom:
Step 2: Write the test
Create baby-modules/did-circuits/test/credit_score.test.js:
Step 3: Compile the circuit
Expected: credit_score.r1cs + credit_score_js/ created.
Step 4: Run the tests
Expected: All 7 tests pass.
Step 5: Commit
Task 4: EnterpriseIdentityProof Circuit
Files:
Create:
baby-modules/did-circuits/circuits/enterprise_identity.circomCreate:
baby-modules/did-circuits/test/enterprise_identity.test.js
Step 1: Write the Enterprise circuit
Create baby-modules/did-circuits/circuits/enterprise_identity.circom:
Step 2: Write the test
Create baby-modules/did-circuits/test/enterprise_identity.test.js:
Step 3: Compile the circuit
Expected: enterprise_identity.r1cs + enterprise_identity_js/ created.
Step 4: Run the tests
Expected: All 5 tests pass.
Step 5: Run all circuit tests together
Expected: All 20 tests pass (8 KYC + 7 Credit + 5 Enterprise).
Step 6: Commit
Task 5: Trusted Setup + Verifier Contract Generation
Files:
Generated:
baby-modules/did-circuits/contracts/KycComplianceVerifier.solGenerated:
baby-modules/did-circuits/contracts/CreditScoreVerifier.solGenerated:
baby-modules/did-circuits/contracts/EnterpriseIdentityVerifier.solCreate:
contracts/src/did/IGroth16Verifier.sol
Step 1: Run trusted setup for all circuits
Expected: For each circuit, creates *_final.zkey, *_vkey.json, and Solidity verifier. This takes 2-5 minutes.
Step 2: Verify generated verifier contracts compile
Check that the generated Solidity files exist:
Expected: Three .sol files.
Step 3: Create IGroth16Verifier interface
Create contracts/src/did/IGroth16Verifier.sol:
Step 4: Generate a full proof to verify the pipeline works
Expected: snarkjs: OK!
Step 5: Commit
Task 6: IdentityVerifier Upgrade (ZK Verification)
Files:
Create:
contracts/src/did/MockGroth16Verifier.solModify:
contracts/src/did/IdentityVerifierLocal.solModify:
contracts/test/IdentityVerifier.t.solModify:
era-contracts-l1/system-contracts/contracts/interfaces/IIdentityVerifier.solModify:
era-contracts-l1/system-contracts/contracts/IdentityVerifier.sol
Step 1: Create MockGroth16Verifier for testing
Create contracts/src/did/MockGroth16Verifier.sol:
Step 2: Update IdentityVerifierLocal with ZK functions
Replace contracts/src/did/IdentityVerifierLocal.sol with:
Step 3: Add ZK tests to IdentityVerifier.t.sol
Append to contracts/test/IdentityVerifier.t.sol — add these new test functions and imports.
Add import for MockGroth16Verifier at the top (after existing imports):
Add new state variables (after existing ones in the contract body):
Add to setUp() (after existing setup):
Add these test functions (before the Helpers section):
Step 4: Run the tests
Expected: All 19 existing + 12 new = 31 tests pass.
Step 5: Update IIdentityVerifier system contract interface
Modify era-contracts-l1/system-contracts/contracts/interfaces/IIdentityVerifier.sol — add new events and functions:
After the existing events, add:
After currentMode(), add:
Step 6: Update IdentityVerifier system contract
Modify era-contracts-l1/system-contracts/contracts/IdentityVerifier.sol:
Add import after existing imports:
Add storage after _compliance:
Add errors after existing errors:
Add ZK verification function (after checkCompliance):
Add admin functions (in the Admin section):
Add credit score functions (after Admin section):
Step 7: Compile system contracts
Expected: Compilation succeeds. No errors.
Step 8: Full regression
Expected: All tests pass (existing 58 DID + 133 other + 12 new ZK = 203 total).
Step 9: Commit (main repo + era-contracts-l1)
Main repo:
era-contracts-l1 (separate repo):
Task 7: Oracle Credit Score Integration Tests
Files:
Modify:
contracts/test/IdentityVerifier.t.sol
Step 1: Add Oracle credit score tests
Add these tests to contracts/test/IdentityVerifier.t.sol (before the Helpers section):
Add helper function in Helpers section:
Step 2: Run the tests
Expected: All 37 tests pass (19 original + 12 ZK + 6 Oracle).
Step 3: Full regression
Expected: All tests pass (~209 total).
Step 4: Compile system contracts
Expected: No errors.
Step 5: Compile era-core (Rust)
Expected: Compiles successfully (no Rust changes in Phase 5b, just verification).
Step 6: Commit
Step 7: Update dev-log
Append Phase 5b record to docs/dev-log.md:
Step 8: Final commit
Summary
1
circom project structure + Merkle helper
-
2
KYCComplianceProof circuit
8 JS
3
CreditScoreProof circuit
7 JS
4
EnterpriseIdentityProof circuit
5 JS
5
Trusted setup + Verifier contracts
pipeline verification
6
IdentityVerifier ZK dispatch
12 Foundry
7
Oracle credit score integration
6 Foundry
Total
20 JS + 18 Foundry
Last updated