Cryptography & Compliance Infrastructure

Zero-Knowledge Proofs in Financial Infrastructure

Banks store your passport scan, biometrics, and income history in centralised databases to satisfy regulations written before cryptography offered a better option. Zero-knowledge proofs let you prove everything and reveal nothing. This is the engineering playbook.

Arrnaya·May 6, 2026·28 min read·ZK Proofs · KYC · AML · Privacy

Section 01

The Compliance Paradox: Why Data-Sharing KYC Is Broken

Every time a person opens a crypto exchange account, a neobank, or a DeFi protocol with onboarding, they hand over their passport scan, proof of address, selfie, sometimes biometrics — to an institution whose security posture they cannot audit, whose data retention policies they cannot verify, and whose future breach they cannot prevent.

The regulatory intent is legitimate: verify that users are who they say they are, that they are not on sanctions lists, that they are not moving proceeds of crime. But the mechanism — centralised storage of raw identity documents — is a product of 1990s database thinking applied to 2020s threat models. The Equifax breach (147 million records), the Binance KYC leak (60,000 user photographs), and dozens of smaller exchange leaks illustrate the compounding cost of storing what you only needed to verify.

"The problem was never verification. The problem is that verification became an excuse for permanent data collection. Zero-knowledge proofs separate the proof from the payload — and in doing so, collapse an entire category of risk.

The architecture of traditional KYC creates three compounding problems. First, every institution that onboards a user becomes a data custodian with perpetual liability. Second, users repeat this process across dozens of platforms — each one a new attack surface. Third, the data, once collected, is often shared laterally across group entities, sold to data brokers, or retained long after the regulatory minimum period, with no cryptographic guarantee of deletion.

Zero-knowledge proofs offer a structural exit from this compounding liability. A ZK proof is a cryptographic object that proves a statement is true without revealing the evidence behind it. Applied to compliance, this means: prove that a user is over 18, is not sanctions-listed, and is a verified resident of a qualifying jurisdiction — without transmitting the passport number, date of birth, or home address to any counterparty.

DimensionTraditional KYCZK-KYC
Data transmittedRaw documents, biometrics, address proofCryptographic proof of attributes
Institutional storageCentralised DB (liability honeypot)No raw data stored
Re-verificationRepeat per institutionReusable proof across verifiers
Breach impactFull identity exposureZero — no raw data to leak
Regulatory equivalenceExplicitly acceptedEmerging — MAS, MiCA exploring
Proof freshnessDocument expiry dateProgrammable TTL in circuit
Selective disclosureNot possible — all or nothingNative — prove specific claims
Audit trailCentralised logsOn-chain nullifier registry

Table 1: Traditional KYC vs ZK-KYC across key compliance dimensions

Section 02

Zero-Knowledge Proof Foundations

A zero-knowledge proof is a protocol between a prover and a verifier. The prover demonstrates knowledge of a secret witness w satisfying a public statement x— defined by a relation R(x, w) = true — without revealing w. For financial compliance, the statement might be "this address has completed KYC with a licensed provider and is not sanctions-listed"; the witness is the user's actual identity data and the identity provider's signature over it.

Three properties define a ZK proof system:

Completeness

If the statement is true and the prover is honest, the verifier will be convinced. A valid witness always produces a valid proof.

Soundness

A cheating prover cannot convince the verifier of a false statement, except with negligible probability. Security reduces to computational hardness assumptions.

Zero-Knowledge

The verifier learns nothing about the witness beyond the truth of the statement. Formally: a simulator can produce an indistinguishable transcript without the witness.

Modern ZK proof systems — zkSNARKs (Succinct Non-interactive ARguments of Knowledge) and zkSTARKs — add two further properties critical for blockchain deployment: succinctness (the proof is short regardless of witness size) and non-interactivity (no back-and-forth between prover and verifier — the proof is a static object that anyone can verify).

zkSNARK RelationCRYPTOGRAPHIC DEFINITION
// A zkSNARK for relation R proves:
//   Knowledge of witness w such that R(x, w) = 1
//   Without revealing w to the verifier

Setup:    (pk, vk) ← Setup(R)          // Trusted or universal setup
Prove:    π ← Prove(pk, x, w)           // Prover generates proof
Verify:   {0,1} ← Verify(vk, x, π)     // Verifier checks proof

// Financial compliance instantiation:
R(x, w) = 1  iff:
  x = (sanctions_merkle_root, issuer_pubkey, min_age)
  w = (identity_data, issuer_signature, merkle_path)
  AND:
    issuer_signature.verify(identity_data, issuer_pubkey) = true
    age_from(identity_data) >= min_age
    merkle_nonmembership(identity_data.hash, sanctions_merkle_root, merkle_path) = true

The statement x (the public input) is known to both parties and committed on-chain. The witness w never leaves the prover's device. The proof π is a compact byte array — typically 192–288 bytes for Groth16 — that the smart contract verifier checks in a single transaction. If it passes, the contract knows the statement is true. If it fails, the transaction reverts. No personal data crosses the wire.

Section 03

ZK-KYC Architecture: Identity Without Disclosure

The ZK-KYC stack separates identity verification into three independent roles: the issuer (a licensed KYC provider who verifies the user once), the holder (the user, who stores their credentials locally), and the verifier (a protocol, exchange, or institution that needs compliance assurance). The issuer never interacts with the verifier. The verifier never sees the issuer's data. The proof is the only link between them.

ZK-KYC FlowSEQUENCE DIAGRAM
┌──────────┐          ┌──────────────┐          ┌─────────────┐          ┌──────────────┐
│  User    │          │  KYC Issuer  │          │  ZK Wallet  │          │  Verifier    │
│ (Holder) │          │  (e.g. Sumsub│          │  (Privado)  │          │  (Protocol)  │
└────┬─────┘          └──────┬───────┘          └──────┬──────┘          └──────┬───────┘
     │                        │                         │                        │
     │── [1] Submit docs ────►│                         │                        │
     │                        │── [2] Verify identity ──┤                        │
     │                        │                         │                        │
     │◄─ [3] Issue VC ────────│                         │                        │
     │   {age, country, KYC_  │                         │                        │
     │   level, expiry, sig}  │                         │                        │
     │                        │                         │                        │
     │── [4] Store VC ───────────────────────────────►  │                        │
     │                        │                         │                        │
     │                        │                         │                        │
     │   ── ── ── ── LATER: Protocol Interaction ── ── ── ── ──                 │
     │                        │                         │                        │
     │── [5] Request proof ────────────────────────────────────────────────────►│
     │                        │                    [6] Generate ZK proof         │
     │                        │                        from VC + circuit         │
     │◄── ── ── ── ── ── ── ── ── ── ── [7] Return π + public inputs ──────────│
     │                        │                         │                        │
     │── [8] Submit tx + π ────────────────────────────────────────────────────►│
     │                        │                    [9] Verify(vk, x, π) on-chain │
     │                        │                    [10] Record nullifier hash    │
     │◄── [11] Access granted ──────────────────────────────────────────────────│

Steps 1–3 happen once. The KYC issuer verifies the user's identity through standard document checks (liveness detection, document scanning, sanctions screening) and issues a verifiable credential (VC) — a signed JSON-LD object containing the verified attributes. This VC is stored in the user's identity wallet, encrypted with their private key.

Steps 5–11 happen at every protocol interaction. The user generates a ZK proof from their VC — proving specific claims from it — and the verifier checks only the proof. A nullifieris recorded on-chain for each proof: a deterministic hash derived from the credential and the verifier's identifier, preventing the same credential from being reused to bypass per-wallet limits while preserving user pseudonymity across protocols.

◆ KEY DESIGN INSIGHT

The nullifier schema prevents both double-use and tracking across protocols:nullifier = hash(credential_hash || verifier_id || epoch)Same user, same credential, different verifier → different nullifier. Privacy preserved. Same user, same verifier, same epoch → same nullifier. Replay prevented.

The credential schema determines what claims can be proven. A minimal KYC credential schema for DeFi protocol compliance might include: kyc_level, country_code, age_over_18, accredited_investor, sanctions_cleared, and expiry_timestamp. A proof can selectively disclose any subset of these claims — the circuit constrains only the claims the verifier needs, leaving all other attributes private.

Section 04

ZK-AML: Transaction Compliance Without Exposure

AML compliance has a harder problem than KYC. KYC is a one-time identity check; AML is ongoing transaction monitoring. The standard approach — feeding transaction data to centralised screening services (Chainalysis, Elliptic, TRM Labs) — works but creates a surveillance layer that sees every transaction across every screened entity. ZK-AML aims to preserve the compliance guarantee while removing the need for transaction disclosure.

Three ZK-AML patterns are deployed in production or near-production today:

01

Sanctions Exclusion Proof

A sanctions list (OFAC SDN, UN Consolidated, EU Consolidated) is committed as a Merkle root on-chain. The user proves Merkle non-membership — that their address hash does not appear in the committed set — without revealing which address they own. The verifier checks only the root (public) and the proof (opaque). Regulators can update the Merkle root; all prior non-membership proofs automatically expire.

02

Transaction Volume Circuit

For travel rule and structuring detection, a circuit proves that a set of signed transaction records — held privately by the prover — satisfy volume constraints: aggregate volume < threshold, no single transaction > limit, and velocity checks (no more than N transactions per hour). The verifier receives the proof, not the transactions.

03

Source-of-Funds Attestation

An institutional counterparty proves that funds originate from a set of approved sources — licensed exchanges, verified wallets — committed in a Merkle tree of trusted addresses. The proof certifies 'all inputs to this transaction came from approved sources' without revealing which exchange or wallet was the specific source.

Circom — Sanctions Non-Membership Circuit (simplified)CIRCUIT DESIGN
pragma circom 2.1.0;
include "circomlib/circuits/poseidon.circom";
include "circomlib/circuits/merkleProof.circom";

// Proves: address is NOT in the sanctions Merkle tree
// Public:  sanctions_root (committed on-chain)
// Private: address, merkle_path, path_indices

template SanctionsExclusion(tree_depth) {
    // Public inputs
    signal input sanctions_root;

    // Private inputs (never revealed)
    signal input address;
    signal input merkle_path[tree_depth];
    signal input path_indices[tree_depth];

    // 1. Hash the address to a leaf
    component hasher = Poseidon(1);
    hasher.inputs[0] <== address;
    signal leaf <== hasher.out;

    // 2. Compute the Merkle root for this leaf using the provided path
    component merkleCheck = MerkleProof(tree_depth);
    merkleCheck.leaf <== leaf;
    merkleCheck.pathElements <== merkle_path;
    merkleCheck.pathIndices <== path_indices;
    signal computed_root <== merkleCheck.root;

    // 3. CONSTRAINT: computed root must NOT equal sanctions root
    //    (enforce non-membership — if address IS in tree, proof fails)
    component neq = IsZero();
    neq.in <== computed_root - sanctions_root;
    neq.out === 0;  // Must be zero diff = ZERO, i.e. NOT in tree
    // NOTE: full non-membership requires Sparse Merkle Tree (SMT)
    //       with ordered leaves and boundary proof — see iden3/go-merkletree
}

In production, Sparse Merkle Trees (SMTs) replace standard Merkle trees for non-membership proofs. An SMT assigns a canonical position to every possible leaf; a non-membership proof demonstrates that the path from root to the expected position is empty. The iden3 team's go-merkletree-sql library and Aztec's indexed-merkle-tree are the two most production-ready implementations.

Section 05

Proof System Selection: Groth16, PLONK & STARKs

Choosing a proof system is an engineering trade-off between setup trust requirements, proof size, verification cost, prover efficiency, and cryptographic assumption strength. For financial applications where on-chain verification gas cost and proof reusability matter, the choice typically narrows to three systems:

PropertyGroth16PLONK / FFLONKSTARKs
Trusted setupPer-circuit (toxic waste risk)Universal (one ceremony)None required
Proof size~192 bytes ✓✓~768 bytes ✓~100–500 KB ✗
Verification gas (EVM)~250k gas ✓~300–400k gas ✓Not native (requires L2)
Prover time (10k constraints)~1–2s mobile~3–5s mobile~5–15s mobile
Recursion/aggregationPossible (Halo2, SnarkPack)Native (UltraPLONK)Native (FRI-based)
Post-quantum securityNo (ECDLP)No (ECDLP)Yes (hash-based)
Circuit languagesCircom, BellmanHalo2, PLONKY2Cairo, Starknet
Best forOn-chain KYC gates, gas-criticalMulti-circuit compliance suitesRollup proofs, L2 settlement

Table 2: ZK proof system comparison for financial compliance applications

For most early-stage ZK-KYC deployments, Groth16 remains the pragmatic choice: the smallest on-chain footprint, the most audited circuit libraries (Circom ecosystem), and the widest toolchain support (snarkjs, circom, Hardhat plugins). The per-circuit trusted setup is a real risk — mitigated by running a large multi-party computation (MPC) ceremony where even one honest participant guarantees security. Zcash's Sapling ceremony (90 participants) and the Tornado Cash ceremony (1,114 contributions) are the reference implementations. For production deployments serving regulated institutions, running a ceremony with 50+ independent participants across multiple jurisdictions is the minimum bar.

PLONK/FFLONK becomes attractive when a compliance system needs many circuit variants (different claim types, jurisdiction-specific rule sets) because the universal setup amortises across all circuits. Aztec's Noir language and Halo2 from the Zcash Foundation are production-grade PLONK-family implementations with active financial application development.

"Post-quantum resistance matters for long-lived compliance records. A sanctions non-membership proof stored on-chain today might be computationally broken in 15 years. STARKs, whose security rests on hash functions rather than elliptic curve assumptions, provide a durable guarantee. For most active transaction verification, the quantum threat is distant — but for permanent on-chain identity anchors, it deserves consideration in system design.

Section 06

Production Systems: Polygon ID, Privado & Verite

Three ecosystems have reached production deployment for ZK-based identity in financial applications:

Privado ID (formerly Polygon ID)

PRODUCTION

iden3 protocol · Groth16 · Circom circuits · Sparse Merkle Tree state

Privado ID implements the iden3 identity protocol: identity trees, credential schema registry, and ZK query language. Identity providers issue W3C Verifiable Credentials to users; the Privado wallet generates Groth16 proofs in response to verifier queries. The on-chain component is a Polygon-native smart contract that validates proofs against committed identity state roots. Deployed in production by Fractal ID, Quadrata, and several Southeast Asian digital asset exchanges.

iden3/circom0xPolygonID/js-sdkiden3/go-merkletree-sql

Verite (Circle / Centre)

PRODUCTION

W3C VCs · JWT/JWS presentation · EIP-712 on-chain attestations · issuer registry

Verite is a credential interchange standard for financial services, co-developed by Circle, Coinbase, and ConsenSys. Unlike Privado, Verite does not use ZK proofs natively — it uses signed Verifiable Presentations. A ZK extension (Verite + ZK) is in development, which would allow on-chain verification of Verite-issued KYC credentials without revealing underlying credential data. The existing framework is production-deployed for USDC institutional on-ramps.

circlefin/veritedecentralized-identity/did-jwt-vc

Aztec Protocol (ZK-native L2)

MAINNET

PLONK (UltraPLONK) · Noir · Private note model · Proof aggregation

Aztec takes a different approach: rather than bolting ZK proofs onto existing public chains, it provides a ZK-native execution environment where all state is private by default. Transactions are encrypted; the contract logic proves validity without revealing inputs. For compliance, Aztec applications can expose selective disclosure hooks — revealing only what a regulator-approved circuit requires while keeping transaction details private. The Aztec compliance escrow pattern allows regulatory access under court order without creating a general surveillance capability.

AztecProtocol/aztec-packagesnoir-lang/noir
SystemZK Proof TypeOn-chain VerificationIssuer ModelBest Fit
Privado IDGroth16 (iden3)Polygon/EVMLicensed KYC providersProtocol-level gating
VeriteSigned VP (ZK extension WIP)EIP-712 attestationCircle, licensed issuersStablecoin compliance
AztecPLONK (UltraPLONK)Aztec L2 nativeSelf-sovereign + escrowPrivate DeFi, custody
SismoHydra-S1 (Groth16)Polygon, GnosisOn-chain data groupsDAO gating, airdrops
HolonymGroth16 (custom)Ethereum, OptimismHolonym issuer networkSybil resistance

Table 3: Production ZK identity systems comparison for financial applications

Section 07

Circuit Design for Compliance Applications

Writing a ZK circuit for compliance is more like writing a hardware specification than application code. Every operation must be expressed as a system of polynomial constraints over a prime field. Conditionals, comparisons, and data structures that feel trivial in normal programming become non-trivial constraint engineering challenges. The most common source of exploitable bugs in production ZK systems is underconstraint — a variable that should be constrained to a specific range is left partially free, allowing an adversary to satisfy the circuit with a false witness.

Range Check — A Common Underconstraint PitfallSECURITY CRITICAL
// INSECURE: This does NOT constrain 'age' to be >= 18
// An adversary can supply any field element that satisfies the comparison
template AgeCheck_INSECURE() {
    signal input age;
    signal input min_age;
    signal output valid;

    valid <== age - min_age;  // ← WRONG: not a boolean constraint
}

// SECURE: Use a bitwise range decomposition to enforce age is in [0, 2^8)
// then constrain comparison using Num2Bits + LessThan gadgets
template AgeCheck_SECURE() {
    signal input age;
    signal input min_age;  // public input

    // Decompose age into 8 bits — proves it's a valid 8-bit integer
    component bits = Num2Bits(8);
    bits.in <== age;

    // LessThan gadget with n=8 bits (range-constrained)
    component lt = LessThan(8);
    lt.in[0] <== min_age;   // min_age < age → valid
    lt.in[1] <== age;
    lt.out === 0;            // 0 means NOT (min_age < age), so age >= min_age
    // Or: use GreaterEqThan gadget from circomlib for clarity
}

The circomlib library (maintained by iden3) provides audited gadgets for common operations: bitwise arithmetic, Poseidon hashing, EdDSA signature verification, Merkle path verification, and comparison operators. Never reimplement these — circuit bugs are not caught by testing the way application bugs are, because a circuit that generates valid proofs may still be exploitable through a carefully crafted false witness that satisfies underspecified constraints.

⚠ CIRCUIT SECURITY RULES

  • All inputs that should be bounded (ages, timestamps, amounts) must pass through Num2Bits(n) before use in arithmetic.
  • Signal assignments use === (constraint) not <== (assign) for outputs that must be enforced.
  • Every signal that flows into a conditional must be boolean-constrained: b * (b - 1) === 0
  • Use Poseidon hash, not SHA-256, inside circuits (SHA-256 requires ~25k constraints; Poseidon requires ~240).
  • Formal verification (Ecne, ZKAP) should accompany any audit for production compliance circuits.

For a production ZK-KYC system handling accredited investor verification, the circuit typically needs to verify: the issuer's EdDSA signature over the credential, the credential's expiry timestamp relative to the current block timestamp, the jurisdiction claim against a country allowlist (Merkle membership proof), and the specific attribute being queried (e.g., kyc_level >= 2). A well-designed circuit for this full check runs to approximately 35,000–55,000 constraints using circomlib gadgets — manageable for mobile proving in 2–5 seconds.

Section 08

Performance Engineering & Gas Cost Analysis

Performance has historically been ZK's Achilles heel. Proof generation for complex circuits was measured in minutes on desktop hardware as recently as 2022. The engineering progress since then has been significant — but understanding current bottlenecks is essential before designing a production system that relies on real-time compliance gating.

Proving Time ModelPERFORMANCE FORMULA
// Groth16 prover time (approximate):
T_prove ≈ k₁ · C · log(C) / CPU_threads   (for CPU proving)
T_prove ≈ k₂ · C / GPU_cores              (for GPU proving)

// Where:
//   C = number of constraints in the circuit
//   k₁ ≈ 40 ns per constraint·log-factor (Apple M2, snarkjs WASM)
//   k₂ ≈ 2 ns per constraint (RTX 3090, RapidSnark)

// Empirical benchmarks (2025 hardware, snarkjs WASM):
//   C =  10,000  → ~1.2s  (simple age + sanctions check)
//   C =  30,000  → ~4.1s  (full KYC claim + country allowlist)
//   C = 100,000  → ~16s   (complex AML volume circuit)
//   C = 500,000  → ~95s   (too slow for client-side; needs proving server)

// RapidSnark (native, M2):
//   C = 100,000  → ~0.8s  (GPU acceleration possible)
//   C = 500,000  → ~3.2s

// Rule of thumb: keep compliance circuits under 50,000 constraints
// for acceptable client-side proving on mid-range smartphones (2024+)
NetworkProof TypeVerification GasCost @ 30 gweiCost @ 0.5 gwei (L2)
Ethereum L1Groth16~260,000~$5.20
Ethereum L1PLONK~380,000~$7.60
Polygon PoSGroth16~260,000~$0.008
Arbitrum OneGroth16~260,000~$0.04
zkSync EraGroth16~260,000~$0.02
Aztec L2PLONK (native)~180,000~$0.005
Polygon CDK (ZK L2)Groth16 (batched)~1,200 amortised~$0.0001

Table 4: ZK proof verification gas costs across deployment targets (May 2026, ETH ~$2,800)

For high-throughput compliance applications (exchange login, per-transaction AML checks), the unit economics only work on L2 networks or through proof aggregation. Recursive proof aggregation — batching hundreds of individual compliance proofs into a single aggregate proof verified on-chain — reduces per-proof gas cost by 2–3 orders of magnitude. Polygon's zkEVM validium mode and Aztec's proof aggregation layer both support this pattern.

◆ PROVING SERVER ARCHITECTURE

When circuits exceed ~50k constraints, delegate proof generation to a proving server. The user's wallet sends the encrypted witness to the server, which generates the proof and returns π. The server never learns plaintext witness values — encryption uses the circuit's public key, and the server processes it homomorphically. For maximum trust minimisation, use a decentralised proving network (Risc0 Bonsai, Gevulot, Succinct Labs) rather than a centralised API endpoint.

Section 09

FATF Travel Rule: The ZK Approach

FATF Recommendation 16 requires Virtual Asset Service Providers (VASPs) to collect and transmit originator and beneficiary information for transactions above the threshold (USD 1,000 / EUR 1,000 in most jurisdictions). This is the direct regulatory collision point for ZK privacy: the regulation explicitly requires data sharing between VASPs, which ZK is designed to avoid.

The ZK-compatible Travel Rule architecture separates what the regulation requires from what the regulation forces. FATF requires that:

  • Originator VASP verifies originator identity (KYC obligation — satisfiable with ZK)
  • Beneficiary VASP verifies that originator data is available if requested by authorities (data access obligation)
  • Sanctions screening occurs on both sides (satisfiable with ZK non-membership proof)
  • Data is retained for 5 years (storage obligation — requires encrypted off-chain escrow)
ZK Travel Rule ProtocolFLOW DESIGN
// ZK-compatible FATF Travel Rule flow:

1. ORIGINATOR VASP (Sender side):
   a. Perform standard KYC on originator
   b. Generate ZK credential: prove(originator_is_KYC_verified, not_sanctions_listed)
   c. Encrypt raw originator data → E_kyc (AES-256-GCM, key escrowed with regulator)
   d. Commit: H(E_kyc) → on-chain travel rule registry

2. TRANSACTION:
   a. Attach π_kyc (ZK proof of KYC) and H(E_kyc) (encrypted data commitment) to tx
   b. Beneficiary VASP receives π_kyc + H(E_kyc)

3. BENEFICIARY VASP (Receiver side):
   a. Verify π_kyc on-chain → confirms originator is KYC'd and sanctions-clear
   b. Perform own ZK sanctions check on beneficiary address
   c. Store H(E_kyc) in compliance log for 5 years
   d. Does NOT receive raw personal data — but can retrieve E_kyc on authority demand

4. ON AUTHORITY REQUEST (regulator subpoena):
   a. Originator VASP provides E_kyc decryption key to regulator
   b. Regulator decrypts → full originator data available
   c. On-chain H(E_kyc) provides tamper-proof audit trail of what was escrowed

// Result: Day-to-day operations use ZK proofs (privacy preserved)
//         Regulatory access preserved through escrow mechanism
//         No data shared between VASPs in normal operations

MAS (Singapore) published a Technology Risk Management Notice in late 2025 acknowledging ZK-based compliance architectures as "technically viable" for meeting Travel Rule requirements, provided that the encrypted data escrow is accessible to MAS within 48 hours of a legal demand. BNM (Malaysia) is expected to follow with similar guidance by Q3 2026. The EU's MiCA regulation and the DORA framework both permit ZK-based identity proofs in the context of regulated crypto-asset service providers, subject to supervisory inspection rights.

OpenVASP, Notabene, and TRM Labs are each developing ZK-native Travel Rule extensions to their existing inter-VASP messaging standards. The critical engineering challenge is not the ZK proof itself — it is the key management architecture for the encrypted escrow: who holds the decryption keys, how are they rotated, and how do you guarantee availability to authorities without creating a backdoor to the general public.

⚡ REGULATORY WATCH

The escrow key architecture is the political fault line. Threshold secret sharing (Shamir 3-of-5 among originator VASP, beneficiary VASP, and three regulators) satisfies the multi-party interest without a single-authority backdoor. This design is being piloted by MAS FinTech Regulatory Sandbox participants as of Q1 2026. Do not ship a production ZK Travel Rule system without legal review in each operating jurisdiction — the regulatory text still has ambiguity around whether ZK proofs satisfy the explicit "transmit originator information" language.

Section 10

Failure Modes & Attack Vectors

ZK systems fail differently from traditional software — and often silently. A compromised trusted setup, an underconstrained circuit, or a corrupted credential issuer can produce a system that generates valid-looking proofs for false statements. Unlike a buffer overflow that crashes a process, a ZK exploit may operate undetected until forensic analysis catches an impossible state. Here are the vectors that matter.

CRITICAL

Trusted Setup Compromise (Groth16)

If the 'toxic waste' from a Groth16 setup ceremony is not destroyed, the holder can generate proofs for false statements that pass on-chain verification. Mitigation: multi-party ceremony with 50+ independent participants; require at least one adversarial contribution. Alternatively, use PLONK with a universal setup that does not require per-circuit ceremonies.

CRITICAL

Circuit Underconstraint Bugs

A circuit that fails to fully constrain its signals allows an adversary to supply a witness that satisfies the R1CS/PLONK constraints without the underlying statement being true. The Tornado Cash contract had an underconstraint bug (fixed in v2) that allowed partial double-spending. Mitigation: formal verification using Ecne or ZKAP, independent audit by a ZK-specialised firm (Least Authority, Trail of Bits, ABDK).

HIGH

Credential Issuer Oracle Risk

A ZK proof is only as honest as the issuer who signed the credential. A compromised or colluding KYC provider can issue valid credentials for false identities — and the ZK proof will correctly prove that the credential is valid. Mitigation: issuer registry with multi-sig update rights, credential revocation lists committed on-chain, regulatory licensing requirements for issuers.

HIGH

Prover Centralisation

Delegating proof generation to a centralised proving API creates a censorship and availability risk: the proving service can refuse to generate proofs for certain users, or be compelled to do so by legal order. Mitigation: client-side proving for small circuits, decentralised proving networks (Gevulot, Risc0 Bonsai) for large circuits.

MEDIUM

Nullifier Registry Spam / DoS

An on-chain nullifier registry is a gas-burning target. An adversary who obtains a valid credential can generate large numbers of valid proofs with different nullifiers (by varying the verifier_id input) to inflate the registry and raise gas costs for legitimate users. Mitigation: rate-limiting at credential issuance, epoch-bounded nullifiers that expire, and spam fees collected at proof submission.

MEDIUM

Regulatory Non-Recognition

A technically valid ZK compliance system may not satisfy a regulator's interpretation of KYC/AML obligations. In many jurisdictions, KYC regulations were written assuming data transfer, not proof transfer. Deploying a ZK compliance system without regulatory pre-approval creates legal exposure if an examiner deems the proofs insufficient. Mitigation: engage regulators through sandbox programmes before production launch; obtain written guidance where possible.

LOW

Proof Replay Across Epochs

Without epoch binding in the circuit, a valid proof generated at time T remains valid at time T+N even if the underlying credential has been revoked. Mitigation: include block.timestamp or a sequencer-committed epoch value in the public inputs, forcing proof regeneration per session.

Section 11

Deployment Playbook: Five Phases

A realistic ZK compliance deployment for a regulated financial application — exchange, lending protocol, or payment provider — follows five phases spanning 6–18 months depending on regulatory complexity.

01

Regulatory Pre-Engagement

Month 1–2
  • Map ZK compliance approach to existing KYC/AML regulatory text in each operating jurisdiction
  • Engage MAS/BNM/FCA via FinTech sandbox or direct consultation — obtain written guidance on ZK proof acceptability
  • Define the compliance claims required (minimum viable KYC claims per regulatory obligation)
  • Retain ZK-specialised legal counsel familiar with FATF Recommendations 15 and 16
02

Circuit Design & Formal Verification

Month 2–5
  • Define credential schema with issuer (map to W3C VC standard, align with iden3 or Verite)
  • Write Circom/Noir circuits for required claim types; use circomlib gadgets exclusively for crypto primitives
  • Run Ecne formal verification to detect underconstrained signals before external audit
  • Commission ZK circuit audit (Least Authority, Trail of Bits, or ZKSecurity) — minimum 6-week engagement
  • Benchmark circuit performance on target device profiles (mid-range Android, iOS, proving server)
03

Trusted Setup or PLONK Universal Setup

Month 5–6
  • If Groth16: run Perpetual Powers of Tau ceremony contribution; contribute to Phase 2 per-circuit setup with 50+ participants
  • Coordinate with participants across independent jurisdictions — documented, public ceremony log
  • If PLONK/Halo2: use existing universal trusted setup (Hermez ceremony, Aztec Ignition) + circuit-specific contributions
  • Publish setup attestation reports and toxic waste destruction proofs (video evidence, multi-party attestation)
04

Issuer Integration & Testnet Deployment

Month 6–10
  • Integrate with licensed KYC issuer (Fractal ID, Synaps, Sumsub with Privado ID extension)
  • Deploy verifier smart contracts to testnet; integrate nullifier registry and Merkle root oracles
  • Build wallet SDK integration (Privado ID JS SDK or custom wallet flow for mobile)
  • Run end-to-end compliance simulation: issuance → proof generation → on-chain verification → nullifier check
  • Performance load test: 1,000 concurrent proof submissions, gas estimation at peak network conditions
05

Mainnet Launch & Monitoring

Month 10–18
  • Deploy to mainnet (target Polygon or L2 for gas economics; Ethereum for highest security guarantees)
  • Maintain on-chain sanctions Merkle root oracle — update within 24 hours of new OFAC/UN list publications
  • Implement revocation registry for compromised or expired credentials
  • Establish monitoring dashboards: proof failure rates, nullifier collision attempts, suspicious claim patterns
  • Schedule semi-annual circuit security reviews — ZK attack surface evolves rapidly

◆ RELATED INFRASTRUCTURE

ZK-KYC deployments are one layer of a broader compliance stack. See Institutional Custody Architecture for key management infrastructure that secures the credential signing keys, and Cross-Border Payments on Blockchain for how ZK-KYC integrates with stablecoin payment rails to satisfy Travel Rule requirements without exposing transaction data. The Stablecoin Architecture post covers the MiCA compliance layer where ZK attestations are now being explored as a reserve proof mechanism.

Section 12

Frequently Asked Questions

What is ZK-KYC and how does it differ from traditional KYC?+
ZK-KYC allows a user to prove identity attributes — such as 'I am over 18' or 'I am not on a sanctions list' — to a counterparty without revealing the underlying data. Traditional KYC requires sharing raw documents (passport scans, utility bills) that are then stored in centralised databases. ZK-KYC replaces data transfer with cryptographic proof, eliminating the storage honeypot while satisfying the same regulatory intent.
Which zero-knowledge proof system should I use for compliance applications?+
Groth16 offers the smallest proof size (~200 bytes) and fastest verification, making it ideal for on-chain verification. PLONK/FFLONK avoids the per-circuit trusted setup and is better for systems with many circuit variants. STARKs are post-quantum resistant and require no trusted setup but produce larger proofs (~100KB). For most financial compliance use cases where on-chain gas cost matters, Groth16 (with a well-audited multi-party setup ceremony) or PLONK is the practical choice.
Does FATF's Travel Rule prevent ZK-KYC adoption?+
Not necessarily. FATF requires VASPs to transmit originator and beneficiary information for transfers above $1,000. ZK proofs can satisfy Travel Rule requirements by proving that the originator data exists, has been verified by a licensed provider, and the counterparty is not sanctions-listed — without transmitting raw personal data between VASPs. Regulators in Singapore (MAS) and the EU (MiCA) are actively exploring ZK-based Travel Rule compliance architectures.
What is Polygon ID and how does it enable ZK-KYC?+
Polygon ID (now rebranded as Privado ID) is a self-sovereign identity system built on iden3 — a set of open-source ZK identity protocols. Identity providers issue verifiable credentials (VCs) to users, who store them in a sovereign identity wallet. When a service requires KYC, the user generates a ZK proof from their credentials proving specific claims, which the verifier checks on-chain without receiving raw personal data.
What are the main failure modes of ZK compliance systems?+
Key risks include: (1) Trusted setup compromise — if Groth16's toxic waste is not properly destroyed, the prover can generate false proofs. (2) Circuit underconstraint bugs — a subtle error in constraint definition can allow false statements to produce valid proofs. (3) Credential oracle risk — ZK proofs are only as reliable as the issuer who signs the underlying data. (4) Prover centralisation — outsourcing proof generation to a third-party prover creates a trust and censorship point. (5) Regulatory non-recognition — producing a ZK proof does not guarantee a regulator will accept it as satisfying KYC obligations.
How long does ZK proof generation take in production?+
Client-side proof generation for Groth16 with ~10k constraints takes 1–3 seconds on a modern smartphone. More complex circuits (50k+ constraints for full AML screening) can take 10–30 seconds client-side, or 200–500ms if delegated to a proving server. Hardware acceleration (GPUs, FPGAs) can reduce generation time by 10–50x for large circuits.
What is the on-chain gas cost of ZK proof verification?+
Groth16 verification costs approximately 250,000–350,000 gas on EVM-compatible chains. At 30 gwei base fee on Ethereum mainnet, that's roughly $3–8 per verification. On Layer-2s like Polygon or zkEVMs, costs drop to $0.001–$0.05. For high-throughput compliance checking, proof aggregation using recursive SNARKs can batch hundreds of verifications into a single on-chain call, amortising fixed costs.
How does ZK-AML work without seeing transaction data?+
ZK-AML circuits can prove properties about a transaction set without revealing individual transactions. For example: 'the total volume of this address in the last 30 days is below $10,000' or 'none of these transaction counterparties appear in a committed sanctions merkle tree'. The sanctions list is committed as a Merkle root on-chain; the user proves non-membership using a Merkle exclusion proof inside the ZK circuit, revealing only that the proof passed — not which entry was checked.

Final Verdict

ZK Compliance Is an Engineering Problem, Not a Future Promise

The tools exist: audited circuit libraries, production identity systems, regulatory sandboxes actively engaging with ZK architectures, and Layer-2 networks that make per-proof gas costs commercially viable. The FATF Travel Rule collision is real but navigable through encrypted escrow architectures that preserve regulatory access without creating a surveillance channel.

What remains is the hardest part: deploying carefully. Underconstrained circuits do not crash — they silently enable fraud. Trusted setups done lazily become backdoors. Issuers who cut corners on KYC undermine the entire proof chain. ZK compliance amplifies both the best and worst practices in your identity stack. Get the foundations right, and you ship a system that is simultaneously more private than any traditional KYC implementation and more verifiable than most.

Groth16ZK-KYCPrivado IDZK-AMLCircomFATF Travel Rule

Related Reading

Custody & Security

Institutional Custody Architecture

Payments

Cross-Border Payments on Blockchain

Stablecoins

Stablecoin Architecture

Tokenomics

Tokenomics Engineering

Payments & Cards

Crypto Debit Card Infrastructure

Tokenization

RWA Tokenization Guide

arrnaya.comZero-Knowledge Proofs in Financial Infrastructure · May 6, 2026ZK · Compliance · Cryptography