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.
Transaction passes through 2-5 random nodes, one at a time. Each node forwards to exactly ONE peer.
Secret, linear propagation
At a random point, a node "fluffs" — broadcasting normally to ALL peers. Standard flooding begins.
Public, normal broadcast
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:
| Feature | Dandelion (v1) | Dandelion++ (v2) |
|---|---|---|
| Stem routing | Fixed path per epoch | Random per transaction |
| Sybil resistance | Weak (attacker controls path) | Strong (random peer selection) |
| Graph analysis resistance | Moderate | High |
| Adopted by Monero | No | Yes (since 2020) |
| Academic paper | Venkatakrishnan et al. 2017 | Fanti 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.
| Protection | Dandelion++ | Tor | I2P |
|---|---|---|---|
| Hides TX origin node | Yes | Partially | Partially |
| Hides your IP from nodes | No | Yes | Yes |
| Hides activity from ISP | No | Yes | Yes |
| Built into Monero | Yes (default) | Optional | Optional |
| Extra latency | Minimal (~seconds) | Moderate (~3-5s) | Moderate (~2-4s) |
| Configuration | None (automatic) | Manual or Feather | Manual |
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.
Dandelion++ is not perfect. Known limitations:
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)