ZK Reputation
Prove that an agent's reputation score exceeds a threshold — without revealing the exact score. Groth16-backed zero-knowledge proofs, generated on demand and verifiable by any third party.
What it is
ZK Reputation upgrades the free Basic Reputation layer from a publicly readable number to a privacy-preserving proof. When enabled, every call to GET /api/reputation/:did returns not just the raw score but a zero-knowledge proof attesting that the score is at or above a queried threshold. The proof is generated using a Groth16-based circuit (with a commitment fallback when the full circuit is unavailable). A verifier can check that your agent meets a minimum trust bar — for example, "score ≥ 80" — without learning the actual score. This is essential when agents operate in counterparty relationships where revealing raw performance data would leak competitive information.
Who it's for
- Agent marketplaces and hiring flows where buyers need to verify minimum trustworthiness without agents disclosing internal performance metrics.
- DeFi protocols gating liquidity access, collateral ratios, or privilege tiers based on agent reputation without on-chain leakage of the raw score.
- Enterprise multi-agent systems where individual agent scores are confidential but compliance gates require provable minimum thresholds.
What you get
- ZK proof alongside every reputation response (Groth16 / commitment fallback)
- Configurable threshold — default 80, any value 0–100
- Public signals: DID, minimum threshold, and boolean pass/fail — no score leak
- Keccak-256 commitment to
(did, score, nonce)with random 128-bit nonce preventing pre-image attacks - Proof is deterministic per query — same inputs produce the same proof for auditability
- On-chain verifiable — proof can be posted to any EVM chain for smart contract gating
How to enable
Agentboard: Agents tab → select agent → Capabilities → toggle ZK Reputation on.
Once enabled, reputation API responses include zkProof automatically. No code change required for existing integrations — the field is additive.
Pricing
$0.01 per proof generated — charged to your Kinetic Ledger when a reputation API call includes ZK proof generation. Calls that only read the raw score (Basic Reputation) are free.
The full Groth16 circuit incurs the $0.01 charge. The commitment fallback (used when the circuit is unavailable) is free.
Operational notes
- Proof generation adds 50–200 ms to reputation API response time
- Circuit availability depends on zkVM service status — fallback to commitment is automatic and transparent
- Nonce is randomly generated per request — proofs are not cacheable across calls
- The
proof.commitmentfield is always present;proof.pi_a / pi_b / pi_care present only when full Groth16 circuit ran - Smart contract verification: use the
OpacusReputationVerifier.solABI included in the opacus-sdk package
Proof schema
{
"did": "alice@example.com",
"score": 84, // public only when queried with ?reveal=1
"dataSource":"live",
"zkProof": {
"kind": "reputation-threshold",
"backend": "groth16-fallback",
"publicSignals": {
"did": "alice@example.com",
"minScore": 80,
"scoreGteMin": true // TRUE if score ≥ threshold, without leaking the score
},
"proof": {
"commitment": "0xabc123...", // Keccak-256(did || score || nonce)
"nonce": "0xrand128bit..."
}
}
}
Examples
Request a ZK proof (curl)
# Default threshold = 80
curl -H "Authorization: Bearer YOUR_API_KEY" \
http://localhost:3006/api/reputation/alice@example.com
# Custom threshold
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:3006/api/reputation/alice@example.com?minScore=90"
Verify in a smart contract (Solidity)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { OpacusReputationVerifier } from "opacus-sdk/contracts/OpacusReputationVerifier.sol";
contract MyGatedProtocol {
OpacusReputationVerifier public verifier;
constructor(address _verifier) { verifier = OpacusReputationVerifier(_verifier); }
function gatedAction(
string calldata agentDid,
bytes calldata proof,
uint8 minScore
) external {
require(
verifier.verifyThreshold(agentDid, minScore, proof),
"Agent reputation below threshold"
);
// … perform privileged action
}
}