Vesper · VESP · known weaknesses

Breaking Vesper.

Every way Vesper can be traced, attacked, or let you down, as far as we know, in one place, with what fixes each and when. Monero's developers did this on camera and it is the most trust-building thing any coin has done. This page is updated with every release. If you find something missing, that is the bounty.

The register, as of node v0.9.0 (testnet-1), 19 October 2026

What an attacker can do today.

WeaknessWho can exploit itSeverityWhat closes it
The sender's crowd is 48. A payment's input hides among 48 outputs, three times Monero's ring. Decoys are drawn from a measured spending pattern (the rule Monero's wallets use); an attacker who knows that pattern still names the real coin 2.1% of the time (fair for 48 is 2.1%), and if Vesper's users spend differently from Monero's the gap widens until it is re-measured on testnet-1. A crowd of 48 is still not a crowd of everyone.A statistical analyst with the whole chainmediumPhase 3 stage two: membership proof among all outputs (research). 64 was measured (1.8%, 82 ms per payment) and judged not worth the cost yet.
Network origin is partly hidden, not hidden. A payment travels node to node (a stem) before any node broadcasts it, so the first announcer is a relay. An attacker running a share of the nodes still names the sender's node about that share of the time: measured 7% at 5% of nodes, 11% at 10%, 23% at 20%, against 15%, 25% and 39% with plain broadcast. Nothing between nodes is encrypted, so someone watching the wire is not stopped, and linking many payments from one sender within one 10-minute epoch is not modelled.A network observer running many nodes; an internet providermedium--proxy through Tor hides your address from peers (built in). Encryption between nodes is outside this code; the production node.
A dishonest node can hand your wallet decoys of its choosing, shrinking your ring to one real output plus outputs it controls or knows, and it sees when your wallet looks and what it sends.The operator of a remote node you trustmediumRun your own node. Documented, same as Monero. --proxy hides your address from such a node, not your activity. Future: decoy sanity checks in the wallet.
The node has never met strangers. Per-address limits, a one-hour ban for rule-breakers, a peer table that checks gossip before trusting it, connection timeouts, caps on bodies, answers and blocks: all built and tested in simulation and on one PC, none of it against the open internet. Peers talk plain HTTP with no authentication.Anyone on the internet, once there is a public networkmediumThe public testnet is the test; the production node. Until then: private networks, or your own node behind Tor.
In a small network the stem is slow and thin. A payment can take 30 to 75 seconds to be broadcast while it travels the stem, and with only a few nodes the relays are easy to name.Nobody directly; it is a cost of phase 4 on small networkslowGrows out of the problem as the network grows; the timers are tunable rules.
The ledger lives in memory, about 0.65 kB per output: fine for a test network's first months, not for years.Anyone who runs a node, eventuallylowAn on-disk ledger and headers-first sync (planned).
Unaudited implementation. The constructions are standard; our code implementing them has been reviewed only by its authors. Privacy bugs are silent.Anyone who finds the bug firsthighIndependent cryptographic audit before genesis; the bounty; your review.
Public by design: the fee (every wallet pays the same minimum for a payment's size), the number of inputs and outputs, the payment's size, which block it landed in, and the 48 candidates for each spend. Outputs of one payment are siblings because they sit in one payment. A payment carries no timestamp and lists its inputs in key-image order, so neither the clock nor the order fingerprints a wallet.Anyoneby designStays. Uniform payment shape (always 2+ outputs in random order, same fee rule, same ring size) keeps the fingerprint small.
Mining reward amounts are public, and so is the development fund's income and spending.Anyoneby designStays. Issuance must be checkable; the fund is a glass box on purpose.
A view key sees every incoming payment, forever, and the key images of outputs held at export, so its holder can see those spends.Whoever you gave the view key toby designStays. Hand it out accordingly. One wallet has as many addresses as you like, but one view key still sees them all; a payment proof (proof pay / proof receive) shows one payment and nothing else.
The person who paid you knows what they paid you, the one-time key, and the amount, forever.Your counterpartyinherentStays on every coin. They cannot see your other outputs or balance.
Exchanges at the edges re-identify you. An exchange that knows your name on the way in and another on the way out can bracket a trail by timing and amounts at the doors.Exchanges and whoever can compel themmediumNot fixable by a protocol. Atomic swaps and non-custodial on-ramps reduce it; disclosure is your choice via view keys.
Graphics cards beat CPUs on the current proof of work (Argon2id); Bitcoin's chips cannot run it, but a GPU farm has an edge over laptops.A well-funded minermediumRandomX, the likely production algorithm, before any public network.
Early hashrate concentration. In the first weeks one party, possibly the founder, may hold more than half the mining power; the chain is then as honest as that party.Whoever has the most hardwaremedium at launchDisclosure of founder mining; recruiting miners through the testnet; a difficulty rule that recovers in about 40 minutes if miners leave.
After a miner exodus, blocks are slow for about 40 minutes while difficulty steps down (ASERT-style, 10-minute half-life, limited to a quarter per block).Nobody directly; it is a liveness costlowAccepted trade-off; the alternative (faster drops) invites cheap-block floods.
Payments are large: about 4 kB binary, 9.5 kB as JSON, versus 250 bytes for Bitcoin. A ring of 48 costs space, so do range proofs, and the ledger never deletes. Blocks are capped at 4,000,000 bytes.Anyone who runs a node: storage and bandwidthlowBulletproofs+ (smaller proofs), an on-disk ledger and headers-first sync (planned).
One address for everything, if you choose to. Reusing one address across contexts is safe on chain, but off chain it lets people who know it in one context recognise it in another.People you have given your address tolow, and yoursBuilt: wallet new-address gives each payer their own address, all unlinkable, even when payers compare notes. The wallet also spends from one address at a time where it can.
Not post-quantum. A large quantum computer could forge coins and recover private view keys from published addresses, linking every past one-time key to its address. Sealed amounts would survive.A quantum computer that does not yet existfutureThe same migration every curve-based coin faces; no plan yet, stated so nobody assumes one.
Your wallet file is the money. Lose it or its password and the coins are gone; leak it and they are someone else's. Malware on the machine while the wallet is open reads the keys.Anyone who gets the file, or your machinehigh, and yoursEncrypted by default (scrypt, 128 MiB). A 55-character recovery code, shown once, rebuilds the wallet on any computer: write it on paper. Hardware-wallet support planned.
What is not on this list, and why that matters. Receivers, amounts and (within a crowd of 48) senders are hidden, and nobody has shown otherwise. On testnet-1 nothing here is money: tVESP has no value, which is the point of breaking it there first. The self-test ships with a check named for what the chain still leaks; if a line above ever stops being true, that test and this page change together. "Untraceable" appears nowhere on these pages until stage two and an audit say it can.
Fixed already

Things that were true and no longer are.

2026-10-15
Fixed. The node had no connection timeout, so 64 idle connections (a "slowloris", a few lines of code) locked every peer and wallet out for as long as they stayed open. Now 20 s, at most 8 slots per address, and the node's own computer is never turned away.
2026-10-15
Fixed. Only the number of payments per block was limited, so a valid 18 MB block was possible that no node could relay or fetch, which would have split the network. Blocks are now at most 4,000,000 bytes, by consensus.
2026-10-15
Fixed. Every address a peer mentioned was trusted at once, so one attacker could fill a node's whole peer table (an "eclipse"), decide what it sees and be the first hop of every payment. Gossip is now candidates, checked two a round, at most 2 per network block.
2026-10-15
Fixed. Inputs were listed biggest coin first, so their order said which hidden input held more. Inputs are now listed in key-image order and blocks refuse any other order.
2026-10-15
Fixed. A wallet on another computer could tell from a fast "not new" answer that its payment was already on this node's stem. Every hand-in is now checked all the same and called new.
2026-10-15
Fixed. The first phase-4 build answered a stem it already held with "loop", so anyone holding a payment could ask every node and learn which nodes were on its stem, then trace it back: up to 38% of payments at 5% spies, worse than no stem at all. Found in review the day it was built, before any network ran it. Hand-offs are now answered at once and alike, duplicates dropped silently, loops end by timer.
2026-10-15
Fixed. Decoys were picked by rank in the output line, and an attacker who knows how people spend named the real coin 7.3% of the time on a young chain and 22% on a busy year-old one. Decoys are now drawn as ages from the measured spending distribution: 7.2%, 6.5%, 6.1% (fair 6.2%).
2026-10-15
Designed out. Subaddresses arrived with the Janus check: an output built from one of your addresses that lands on another (to learn both are yours if you confirm it) is refused, because the wallet re-derives the payment key from a sealed anchor. Monero's subaddresses still carry this one.
2026-10-15
Fixed. A node whose clock was behind treated its own newest saved blocks as "from the future" and set them aside as damaged at start. The future-time rule now applies only to blocks arriving from peers.
2026-10-14
Fixed. One changed character in the saved chain file stopped the node from starting. It now keeps the good blocks, sets the damaged file aside and fetches the rest from peers.
2026-10-11
Fixed. Any website open in your browser could stop your miner or redirect its rewards through the node's local API. The node now refuses cross-site requests. The same hole was found and closed in the learning chain.
2026-10-11
Fixed. Two different blocks could in principle share an ID (the Merkle-tree duplication flaw behind Bitcoin's CVE-2012-2459). Designed out; and a node now records a block only under an ID it computed itself, so a peer cannot delay a real block by sending junk under its ID.
2026-10-11
Fixed. Replacing a whole ring after a reorganisation removed one decoy leaked which output was real. Now only the lost decoy is replaced.
2026-10-11
Fixed. Two payments to the same one-time key used to share one spent marker, so only one could ever be spent (Monero's "burning bug"). Spent markers are now tied to each output's position, so both are spendable, and no key-uniqueness rule is needed: such a rule would let a stranger cancel a waiting payment.
2026-10-11
Fixed. Wallets downloaded every output on the chain to find their own. They now read only new blocks, so the cost of privacy stopped growing with the chain.
2026-10-11
Fixed. Proof of work was Bitcoin's SHA-256, so rented Bitcoin hashrate could overrun the chain in hours. Switched to memory-hard Argon2id.
2026-10-11
Fixed. Difficulty adjusted once every ten blocks, a known hash-and-run target for small chains. Now adjusts every block.
2026-10-11
Fixed. A power cut while saving a block could leave the chain file unreadable.
2026-10-11
Fixed. Spending a mining reward revealed that payment's total (public reward in, sealed outputs out). Rings removed the link to the spent output.
2026-10-10
Fixed. Amounts were visible on chain. Sealed with commitments and range proofs in phase 2.
Found one?

How to report, and what you get.

  1. Check this register and the whitepaper's threat model. If it is listed, it is known; tell us anyway if you can show it is worse than described.
  2. Write it up so we can reproduce it: what you saw, how, with what data. Chain file, transaction IDs, a script if you have one.
  3. Send it privately: open a GitHub issue in the repository titled "security: contact requested" with no details, and a private channel is arranged from there (the same route is in SECURITY.md). Public disclosure before a fix forfeits the bounty, never the credit.
  4. You are credited here by name or handle when the fix ships, and paid from the bounty pool according to severity, in public.

The bounty rules are on the Join page. This page is the only marketing a privacy coin should need: a list of its own flaws, kept honestly.