XMR Daily

Dandelion++ Explained: How Monero Hides Your IP When You Send

How Dandelion++ relays a Monero transaction through a stem before broadcasting it, the real monerod settings, what spy nodes still see and when to add Tor.

By the XMR Daily editorial teamPublished Facts checked Intermediate6 min read

The short version

Dandelion++ hides which node first broadcast a Monero transaction. The originating node passes it to one of two chosen outgoing peers, each relay passes it on again, and after about five hops on average a node broadcasts it to everyone. It has been on by default in monerod since v0.16.0.0 in May 2020 and needs no setup.

  • A new transaction travels a 'stem' of single hops before one node 'fluffs' it to all peers, so the first public broadcaster is usually not the sender.
  • monerod uses 2 stem peers per 10-minute epoch, a 20% chance of being a fluff node each epoch, and a 39-second average failsafe timer.
  • Dandelion++ does nothing about the remote node you submit to: that operator sees your IP address and the exact transaction.
  • A 2025 study found non-standard peers held 15.26% of a default node's outgoing connections, and 7.13% with the ban list and 32 outgoing connections.

Nothing written on the Monero blockchain identifies a sender, so the best remaining clue for an observer is off-chain: which IP address announced the transaction first. On a plain gossip network that question has an answer. An observer connected to enough nodes can time when each one first mentions a transaction and trace the wave back to its centre. Dandelion++ is the relay protocol monerod has used since 2020 to move that centre away from you.

What does Dandelion++ hide?

Dandelion++ hides which node created a transaction from the other nodes on the peer-to-peer network. It does this by changing the route a new transaction takes, not by encrypting anything. Peers still see each other’s IP addresses, and your internet provider still sees Monero traffic.

The protocol comes from a 2018 paper by Fanti and co-authors. Monero merged it in April 2020 and shipped it in v0.16.0.0 “Nitrogen Nebula” on 23 May 2020.

How a transaction travels: stem, then fluff

A Dandelion++ transaction is first handed along a chain of single peers (the stem) and only then broadcast to everyone (the fluff). In monerod it works like this:

  1. Every node divides time into epochs of about 10 minutes. At the start of each one it picks 2 of its outgoing connections as stem peers and flips a weighted coin: 20% of the time it will be a fluff node for that epoch, otherwise a stem node.
  2. When your node creates a transaction, it sends it to one of its two stem peers and to nobody else. This happens even if your node is a fluff node this epoch.
  3. A stem node that receives it forwards it to one of its own two stem peers. A fluff node that receives it broadcasts it to all its peers, and normal gossip takes over.
  4. Every node that handled the transaction during the stem starts a timer. If the transaction has not come back through normal gossip when the timer fires, the node broadcasts it itself. A peer that silently drops stem transactions cannot make them vanish.

The settings in cryptonote_config.h, as checked on 11 November 2026:

Setting Value What it means
Stem peers per epoch 2 Your node’s stem traffic goes to two fixed outgoing peers until the epoch ends
Epoch length 10 minutes plus up to 30 seconds Stem routes change this often
Fluff probability 20% With one node in five fluffing, a stem averages about five hops
Embargo timer 39 seconds on average Failsafe rebroadcast if the stem stalls
Default outgoing connections 12 The pool the two stem peers are drawn from

Stem peers are chosen from outgoing connections on purpose. Your node picked those peers. An adversary cannot place itself on your stem just by opening lots of inbound connections to you.

Key point: To an observer timing the gossip wave, the apparent origin is the fluff node, typically several hops from the sender. A stem relay that receives your transaction also cannot tell whether your node created it or was relaying it for someone else.

Does Dandelion++ protect you when you use a remote node?

Not from the remote node. Dandelion++ runs between nodes, and it starts only after a node has the transaction. What each party learns depends on where your wallet submits:

Your setup Remote node operator learns Other P2P peers learn Your ISP sees
Wallet to a public remote node Your IP and the exact transaction Nothing about you A connection to that node
Wallet to your own node, defaults No third party involved First stem peer sees your node’s IP but cannot be sure you originated Monero P2P traffic
Own node with --tx-proxy over Tor or I2P No third party involved Tor or I2P peers see the transaction without your IP Tor or I2P use, plus Monero sync traffic

If you use a remote node you do not run, connect to it over Tor from the wallet so the operator at least does not get your home IP. The trade-offs are laid out in remote node vs your own node.

How much do spy nodes weaken Dandelion++?

Dandelion++ assumes most of your peers are honest, and measurements suggest a meaningful minority are not. The 2025 paper “Friend or Foe? Identifying Anomalous Peers in Monero’s P2P Network” ran five measurement nodes (San Francisco, Amsterdam, Bangalore, Singapore and Sydney) and reported:

  • 1,924 of 13,050 reachable IP addresses, 14.74%, behaved in non-standard ways.
  • Seven /24 subnets under one network operator hosted 1,582 distinct peers.
  • With default settings, non-standard peers held 15.26% of a node’s outgoing connections on average.
  • With the community ban list loaded and 32 outgoing connections, that fell to 7.13%.

The authors call these peers non-standard, not proven spies. But the arithmetic is unkind. Stem peers are drawn from outgoing connections, so if they are picked evenly, at 15% the chance that at least one of your two stem peers in an epoch is non-standard is about 28%. At 7% it is about 14%. An adversary that sits on many stems can start ruling out candidate senders.

The Monero Research Lab recommended in late 2024 that node operators load a ban list of suspected spy IPs. The list’s README counted over 1,900 addresses. To use it:

monerod --ban-list /path/to/ban_list.txt

or put ban-list=/path/to/ban_list.txt in bitmonero.conf. The same study reported 1,022 anomalous IPs in its ban-list run that were not on the list, so treat it as a reduction and not a cure. Full instructions, including the GUI and Docker, are in the spy nodes and ban list guide.

What Dandelion++ cannot do

Dandelion++ protects against peers on the Monero network and nothing wider. Two gaps follow from that:

  • An ISP-level observer. Someone who can watch your line sees your node send a transaction message that it had not received from anyone. No relay pattern hides that.
  • On-off use. If you start monerod only to send a payment and then quit, an ISP can line up your connection times with your transactions. Monero’s anonymity-network documentation advises running the daemon as often as possible.

And one from the research: Dandelion++ anonymity does not improve as the network grows. Distant nodes barely affect the odds, so an adversary needs a share of your neighbourhood, not of the whole network.

When should you add Tor or I2P?

Add Tor or I2P when your adversary could plausibly run many nodes or watch your connection. For everyday payments from your own always-on node, Dandelion++ with the ban list is a reasonable baseline.

On your own node, the relevant option is --tx-proxy:

monerod --tx-proxy tor,127.0.0.1:9050,10

With it set, transactions that originate on your node are sent only to peers on the anonymity network. If no such peer is connected, monerod logs an error and holds the transaction. It does not fall back to clearnet. The daemon uses two outgoing anonymity connections for this and rotates them every 5 minutes.

A short decision list:

  • Phone wallet on a public remote node: route the wallet through Tor. Dandelion++ is not protecting you from that node.
  • Own node at home, ordinary use: keep it running, load the ban list.
  • Own node, sensitive payments: add --tx-proxy. Setup is in Monero over Tor and I2P.
  • Any setup: network privacy does not fix behaviour. The OpSec mistakes checklist covers the rest.

What is changing: transaction relay v2

Monero developers are reworking how nodes announce and fetch transactions under the name “Tx relay v2”. It is part of the FCMP++ beta stressnet builds. The v3.0 release notes of 25 September 2026 list major improvements to the protocol, and v3.1 on 26 October 2026 added denial-of-service protection for it. None of this is on mainnet yet, and it is tied to the FCMP++ upgrade, whose design is covered in how FCMP++ and Carrot work.

Questions readers ask

Do I need to turn on Dandelion++ in Monero?
No. Dandelion++ is built into monerod and has been enabled by default since v0.16.0.0, released on 23 May 2020. There is no wallet setting for it. Any transaction submitted through a current node is relayed with a stem phase first.
Is Dandelion++ the same as using Tor?
No. Dandelion++ changes the order in which ordinary clearnet peers hear about a transaction, and every peer still sees real IP addresses. Tor and I2P hide the IP address itself. With --tx-proxy set, monerod sends your own transactions only over the anonymity network.
How long does Dandelion++ delay a Monero transaction?
Usually a few seconds. Each stem hop takes a fraction of a second, and the failsafe that rebroadcasts a stalled stem transaction fires after 39 seconds on average. Compared with the two-minute block time, the delay is not noticeable when paying.
Does Dandelion++ hide that I am running Monero?
No. Your internet provider can see that your machine talks to Monero peers on port 18080, and so can those peers. Dandelion++ only obscures which node a given transaction started from.

Sources

  1. Dandelion++: Lightweight Cryptocurrency Networking with Formal Anonymity Guarantees (Fanti et al., arXiv 1805.11060)
  2. Another privacy-enhancing technology added to Monero: Dandelion++ (getmonero.org, April 2020)
  3. Monero 0.16.0.0 'Nitrogen Nebula' released (getmonero.org, May 2020)
  4. Monero source: cryptonote_config.h, Dandelion++ constants
  5. Monero docs: Anonymity Networks (Tor and I2P)
  6. Friend or Foe? Identifying Anomalous Peers in Monero's P2P Network (arXiv 2509.10214)
  7. Monero ban list README

Every figure in this article was checked against the sources above on 11 Nov 2026. Found an error? Tell us and we will correct it. How we check facts.

One email a week

The Monero news that mattered and one guide worth your time. Your address stays on our server and is deleted when you unsubscribe.