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.json

  • Create: baby-modules/did-circuits/.gitignore

  • Create: baby-modules/did-circuits/circuits/lib/merkle_proof.circom

  • Create: baby-modules/did-circuits/scripts/compile.sh

  • Create: 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 circom

Verify:

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.circom

  • Create: baby-modules/did-circuits/test/kyc_compliance.test.js

  • Create: 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.circom

  • Create: 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.circom

  • Create: 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.sol

  • Generated: baby-modules/did-circuits/contracts/CreditScoreVerifier.sol

  • Generated: baby-modules/did-circuits/contracts/EnterpriseIdentityVerifier.sol

  • Create: 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.sol

  • Modify: contracts/src/did/IdentityVerifierLocal.sol

  • Modify: contracts/test/IdentityVerifier.t.sol

  • Modify: era-contracts-l1/system-contracts/contracts/interfaces/IIdentityVerifier.sol

  • Modify: 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

Task
Deliverable
Tests

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