Murad Farzulla — Farzulla Research — ORCID
Andrew Maksakov — Dissensus AI (Section 5.4, PET-AML stack)
Preprint DOI: 10.5281/zenodo.17917938
This paper challenges the assumption that comprehensive transaction surveillance is necessary for CBDC financial stability and crime prevention. It proposes an alternative architecture built on anonymized pattern detection, transaction-level intervention, and opt-in deanonymization, and argues that the surveillance–privacy trade-off is weaker than CBDC design documents assume.
The Zenodo record above is the January v1.1.0 deposit. It predates the merge of Section 5.4 (v2.0.0, February) and the July revision passes; a re-deposit is pending.
Two things are in flight and are not reflected in the main.tex on this branch:
- Section 4.5 is being rewritten. The original §4.5 "validation" reported
AUC = 1.000 with watchlist access adding zero marginal value. That was a data-generating
artifact — launderers were defined to hold 3–6 wallets against 1–2, so
num_walletsseparated the classes by construction.detection/(below) is the honest replacement harness. The manuscript's headline numbers still quote the old figures until the rewrite lands. - Positioning pass, 21 July. The §2.4 gap claim was falsified against a 30-year
cryptographic-compliance lineage (trustee e-cash → Compact E-Cash → GGM16 →
Platypus/PEReDi → Privacy Pools) plus BIS Aurora/Hertha, and the paper was repositioned
around what survives. Full change log and the revised manuscript are on the
jul2026-workingbranch.
git checkout jul2026-working # current manuscript + compiled PDF + change logsStart there with WORKING-STATE.md (where the paper is and what's open), then
CHANGES-FOR-ANDREW.md (the 21 July revision, item by item) and FORWARD_NOTE.md
(why the bibliography was replaced).
Target venue: MDPI FinTech, regular track, mid-September.
main.tex # LaTeX source (stale February version on main; current on jul2026-working)
references.bib # bibliography — corrected July 2026, see below
pet_aml_sim.py # PET-AML stack simulation (Section 5.4)
detection/ # Section 4.5 detection-validation pipeline
Self-contained, seeded, and gated. Four evidence tiers (T1 structure-only on unlinked pseudonyms → T2 + pseudonymous linkage → T3 + identity attributes → T4 + watchlist), with entity-disjoint cross-validation, entity-clustered bootstrap CIs, a label-permutation negative control, and a TOST equivalence test for the paper's T2 ≈ T4 claim.
A pre-registered degeneracy audit runs before any headline number and hard-fails if any
single feature reaches entity-level AUC > 0.95. Run it against the original DGP and it fails
on num_wallets at 1.000; on the shipped DGP the worst feature sits ≈ 0.84–0.92.
cd detection/
python3 run_all.py # seed 20260707, 800 entities, δ = 0.03 — ≈40 s
python3 run_all.py --seed 42 # every number regenerates from the one seed
python3 test_pipeline.py # regression testsRequires Python 3.11+ with numpy, scipy, scikit-learn, pandas (developed on 3.14 /
numpy 2.3.5 / scipy 1.16.3 / sklearn 1.8.0 / pandas 2.3.3). The committed results/ were
regenerated byte-identically on a clean checkout — if your run differs, the environment
differs, and that's worth knowing before we quote anything.
Reference numbers, real-data adapters (AMLworld, Elliptic) and the honest read of what these
synthetic results do and do not license: detection/README.md.
PSI watchlist screening, ZK policy proof generation/verification, secure MPC risk propagation, queueing delays. Pure Python 3, no dependencies.
python3 pet_aml_sim.py --days 2 --tx-per-day 20000 --psps 8 --seed 7Note: the copy of pet_aml_sim.py on this branch (main) still has the escalation-ordering
bug described below — it has been fixed, but only on jul2026-working, alongside the
manuscript update that depends on it. Use that branch if you want the corrected simulator; this
one is kept as-is because main.tex here (the stale February version) still quotes the old
"zero escalations" result, and updating the code without updating the text would make the two
contradict each other on the same branch.
git checkout jul2026-working # corrected pet_aml_sim.py + matching manuscriptOriginal issue, for reference: risk_tier was read inside the transaction loop (travel-rule
check and escalation, ~lines 468/475) but only assigned by run_batch risk propagation after
the loop completed — so tier-based escalation could never fire, and the "zero escalations"
result was guaranteed by construction rather than by the architecture. Fixed on
jul2026-working by running risk propagation once per simulated day instead of once at the end;
a reseeded rerun there now reports a real (small) escalation count.
references.bib was corrected in July 2026. Five entries in the February version carried
fabricated author sets (OfflineCBDC2024, ZKPSurvey2025, UFLaw2024, OxfordCBDCSurvey2025,
Koti2024Graphiti); all are now verified against Crossref / IACR ePrint / publisher records,
along with fixes to Campanelli2019 (was Campanelli2017), Wang2025UnbalancedPSI,
choi2025cbdcprivacy, and the ECBConsultation2021 note. Eight entries were appended for the
positioning pass. Rationale per entry: FORWARD_NOTE.md on jul2026-working.
Plain article class, no local .cls and no external graphics — main.tex and
references.bib are all you need.
pdflatex main && bibtex main && pdflatex main && pdflatex main@misc{FarzullaMaksakov2026CBDC,
author = {Farzulla, Murad and Maksakov, Andrew},
title = {Privacy-Preserving Financial Surveillance: An Architectural
Framework for {CBDC} Implementation},
year = {2026},
doi = {10.5281/zenodo.17917938},
note = {Preprint}
}