Monero Dandelion++ — How XMR Hides Transaction Origins

TL;DR: Dandelion++ hides which node broadcast a transaction. Instead of flooding the network immediately (revealing the origin), transactions pass through a random "stem" of 2-5 nodes before "fluffing" into normal broadcast. Enabled by default since 2020. No configuration needed. Complements Tor for complete IP privacy.

The Problem: Transaction Broadcast Reveals You

When you send a Monero transaction, your wallet passes it to the node you're connected to, which broadcasts it to all its peers, who broadcast to their peers, and so on. This "flooding" pattern is fast but has a privacy problem: the first node to broadcast is almost certainly the sender.

Without Dandelion++: A network observer watching many nodes can identify which node first propagated a transaction. If they can link that node's IP to a person, they know who sent the transaction — even though ring signatures hide the sender on-chain.

With Dandelion++: The transaction is secretly forwarded through a chain of random nodes before being broadcast. The observer sees it "appear" from a random node in the network, not the real sender.

How It Works: Stem and Fluff

Stem Phase

Transaction passes through 2-5 random nodes, one at a time. Each node forwards to exactly ONE peer.

Secret, linear propagation

Fluff Phase

At a random point, a node "fluffs" — broadcasting normally to ALL peers. Standard flooding begins.

Public, normal broadcast

You (sender)Node ANode BNode CNode D (fluffs!) → all peers

Observer sees: "Transaction appeared from Node D"
Reality: You sent it, but Nodes A, B, C are all equally likely origins

The Decision: Stem or Fluff?

Each node that receives a transaction in the stem phase independently decides whether to continue stemming (forward to one peer) or fluff (broadcast to all). The decision is probabilistic — each node fluffs with ~10% probability per hop. This means:

Dandelion++ vs Original Dandelion

FeatureDandelion (v1)Dandelion++ (v2)
Stem routingFixed path per epochRandom per transaction
Sybil resistanceWeak (attacker controls path)Strong (random peer selection)
Graph analysis resistanceModerateHigh
Adopted by MoneroNoYes (since 2020)
Academic paperVenkatakrishnan et al. 2017Fanti et al. 2018 (ACM CCS)

The "++" version was specifically designed to resist adversaries who run many nodes (Sybil attacks). In the original Dandelion, an attacker controlling stem nodes could trace the origin. Dandelion++ randomizes peer selection per transaction, making Sybil attacks much harder.

Dandelion++ vs Tor vs I2P

ProtectionDandelion++TorI2P
Hides TX origin nodeYesPartiallyPartially
Hides your IP from nodesNoYesYes
Hides activity from ISPNoYesYes
Built into MoneroYes (default)OptionalOptional
Extra latencyMinimal (~seconds)Moderate (~3-5s)Moderate (~2-4s)
ConfigurationNone (automatic)Manual or FeatherManual

They're complementary, not alternatives. Dandelion++ hides which node broadcast a transaction (network-level). Tor hides your IP from the node (connection-level). For maximum privacy: use both. Dandelion++ runs automatically; add Tor via Feather Wallet for complete coverage.

Limitations

Dandelion++ is not perfect. Known limitations:

Complete Privacy Stack

Monero's privacy is built in layers. Dandelion++ is one layer:

On-chain: Ring Signatures (hide sender) + Stealth Addresses (hide receiver) + RingCT (hide amount)

Address-level: Subaddresses (unlinkable addresses)

Network-level: Dandelion++ (hide TX origin node) + Tor/I2P (hide your IP)

Future: FCMP++ (full-chain membership proofs — eliminates ring size limitations entirely)