Best Viewed on Desktop
The technical documentation and app previews are optimized for desktop viewing.
β Back to HomeCompliance Tools
Privacy without compliance is a dead end. ZK-Sentinel resolves the tension between financial privacy and regulatory oversight (Buterin et al. 2023).
Proof of Innocence (V10)
Users prove their deposit belongs to an Association Set of vetted, non-illicit transactions β without revealing which specific deposit is theirs. Based on Buterin et al. [10] Privacy Pools model.
Selective Disclosure (V11)
Prove deposit properties to auditors without revealing the specific deposit: pool membership, ASP clean set, amount range (128-bit), time range (64-bit), audit nonce binding.
Partial Withdrawals (V11)
Withdraw a portion of the deposit. Change commitment is inserted as a new Merkle leaf, cryptographically indistinguishable from a fresh deposit. V11 leaf = Poseidonβ(C, amount).
Formal Definitions (from Paper Β§8)
ββ Proof of Innocence (V10) ββββββββββββββββββββββββββββββ PoI: β i : assocTree[pathElements, pathIndices] β associationSetRoot Proves: commitment β ASP clean set (Merkle proof) Reveals: nothing about which deposit ββ Partial Withdrawal Conservation (V11) βββββββββββββββ Legacy leaf: leaf = Poseidonβ(s, N_real, N_decoy, H_frase) V11 leaf: leaf = Poseidonβ(commitment, DENOMINATION) Conservation: withdrawAmount + fee + changeAmount = DENOMINATION Change commitment inserted as new leaf (indistinguishable from deposit) Anti-coercion preserved: dual nullifier operates identically ββ Selective Disclosure (V11) βββββββββββββββββββββββββββ Public signals (7): poolRoot, ASP_root, auditNonce, minAmount, maxAmount, minTimestamp, maxTimestamp Circuit verifications: 1. Commitment validity: c = Poseidonβ(s, N_r, N_d, H_f) 2. Pool membership: Merkle proof β poolRoot 3. ASP membership: Merkle proof β associationSetRoot 4. Amount range: minAmount β€ amount β€ maxAmount (128-bit range proof) 5. Time range: minTimestamp β€ ts β€ maxTimestamp (64-bit range proof) 6. Auditor binding: auditDigest = Poseidonβ(commitment, auditNonce) Auditor learns: "some deposit in the pool satisfies all criteria" Auditor CANNOT learn: which deposit, exact amount, exact timestamp
Proof of Innocence Flow
User ASP (Chainalysis/TRM) Contract β β β β 1. Request inclusion set βββΊ β β β βββ Risk score deposits β β βββ Association Set (AS) ββ β (exclude OFAC/illicit) β β β β β 2. Generate PoI proof β β β Input: my_deposit β AS β β β Output: Ο (ZK proof) β β β β β 3. Submit proof βββββββββββββββββββββββββββββββββββββββΊ β β βββ verifyPoI(Ο) β βββ β Deposit is in clean set β β (but which one? Unknown) β βββ Withdrawal approved ββββββββββββββββββββββββββββββ β
ZKML Coercion Detection
LSTM Model
Full DevicesMLP Model
Constrained DevicesPyTorch ββONNXβββΊ Calibration βββΊ Quantization βββΊ Halo2 Circuit βββΊ Verifier.sol
β β β β
Sample data FP β Fixed-point ~21K-58K On-chain
for ranges for ZK circuit constraints KZG pairing
10 biometric features: heart_rate, HRV, skin_conductance, typing_speed,
typing_errors, pause_duration, touch_pressure, gesture_smoothness,
time_of_day, location_familiar
ia_inference = 1 if MLP(features) > 0.5 (normal)
ia_inference = 0 if MLP(features) β€ 0.5 (coercion detected)
β feeds directly into arithmetic selector: a = ia_inference Γ frase_correcta