<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.bitcoin.it/w/index.php?action=history&amp;feed=atom&amp;title=BIP_0156</id>
	<title>BIP 0156 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.bitcoin.it/w/index.php?action=history&amp;feed=atom&amp;title=BIP_0156"/>
	<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0156&amp;action=history"/>
	<updated>2026-04-24T07:44:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0156&amp;diff=68115&amp;oldid=prev</id>
		<title>934: Update BIP text with latest version from https://github.com/bitcoin/bips/blob/c134a853a9fc0657/bip-0156.mediawiki</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0156&amp;diff=68115&amp;oldid=prev"/>
		<updated>2020-08-02T07:48:01Z</updated>

		<summary type="html">&lt;p&gt;Update BIP text with latest version from https://github.com/bitcoin/bips/blob/c134a853a9fc0657/bip-0156.mediawiki&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:48, 2 August 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l13&quot;&gt;Line 13:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 13:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;           Pramod Viswanath &amp;lt;pramodv@illinois.edu&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;           Pramod Viswanath &amp;lt;pramodv@illinois.edu&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0156&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0156&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   Status: &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Draft&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   Status: &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Rejected&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   Type: Standards Track&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   Type: Standards Track&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   Created: 2017-06-09&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   Created: 2017-06-09&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>934</name></author>
	</entry>
	<entry>
		<id>https://en.bitcoin.it/w/index.php?title=BIP_0156&amp;diff=66821&amp;oldid=prev</id>
		<title>934: Update BIP text with latest version from https://github.com/bitcoin/bips/blob/b5723035e23896d0/bip-0156.mediawiki</title>
		<link rel="alternate" type="text/html" href="https://en.bitcoin.it/w/index.php?title=BIP_0156&amp;diff=66821&amp;oldid=prev"/>
		<updated>2019-09-24T17:59:46Z</updated>

		<summary type="html">&lt;p&gt;Update BIP text with latest version from https://github.com/bitcoin/bips/blob/b5723035e23896d0/bip-0156.mediawiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{bip}}&lt;br /&gt;
{{BipMoved|bip-0156.mediawiki}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  BIP: 156&lt;br /&gt;
  Layer: Peer Services&lt;br /&gt;
  Title: Dandelion - Privacy Enhancing Routing&lt;br /&gt;
  Author: Brad Denby &amp;lt;bdenby@cmu.edu&amp;gt;&lt;br /&gt;
          Andrew Miller &amp;lt;soc1024@illinois.edu&amp;gt;&lt;br /&gt;
          Giulia Fanti &amp;lt;gfanti@andrew.cmu.edu&amp;gt;&lt;br /&gt;
          Surya Bakshi &amp;lt;sbakshi3@illinois.edu&amp;gt;&lt;br /&gt;
          Shaileshh Bojja Venkatakrishnan &amp;lt;shaileshh.bv@gmail.com&amp;gt;&lt;br /&gt;
          Pramod Viswanath &amp;lt;pramodv@illinois.edu&amp;gt;&lt;br /&gt;
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0156&lt;br /&gt;
  Status: Draft&lt;br /&gt;
  Type: Standards Track&lt;br /&gt;
  Created: 2017-06-09&lt;br /&gt;
  License: CC0-1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Bitcoin&amp;#039;s transaction spreading protocol is vulnerable to deanonymization&lt;br /&gt;
attacks. Dandelion is a transaction routing mechanism that provides formal&lt;br /&gt;
anonymity guarantees against these attacks. When a node generates a transaction&lt;br /&gt;
without Dandelion, it transmits that transaction to its peers with independent,&lt;br /&gt;
exponential delays. This approach, known as diffusion in academia, allows&lt;br /&gt;
network adversaries to link transactions to IP addresses.&lt;br /&gt;
&lt;br /&gt;
Dandelion mitigates this class of attacks by sending transactions over a&lt;br /&gt;
randomly selected path before diffusion. Transactions travel along this path&lt;br /&gt;
during the &amp;quot;stem phase&amp;quot; and are then diffused during the &amp;quot;fluff phase&amp;quot; (hence&lt;br /&gt;
Dandelion). We have shown that this routing protocol provides near-optimal&lt;br /&gt;
anonymity guarantees among schemes that do not introduce additional encryption&lt;br /&gt;
mechanisms.&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
&lt;br /&gt;
Transaction diffusion in Bitcoin is vulnerable to deanonymization attacks.&lt;br /&gt;
Because transactions are sent to peers with independent, exponential delays,&lt;br /&gt;
messages spread through the network in a statistically symmetric manner. This&lt;br /&gt;
pattern allows colluding spy nodes to infer the transaction source. Breaking&lt;br /&gt;
this symmetry prevents the attack. However, we have shown that an adversary with&lt;br /&gt;
knowledge of the network topology can launch a much more effective &amp;quot;fingerprint&amp;quot;&lt;br /&gt;
attack if the symmetry breaking is not done properly.&lt;br /&gt;
&lt;br /&gt;
Consider a botnet-style adversary with access to the P2P graph. Botnets of size&lt;br /&gt;
comparable to the Bitcoin P2P network are common and cheap, and these&lt;br /&gt;
adversaries can learn the network structure with probe messages. We have shown&lt;br /&gt;
that such an adversary can achieve total deanonymization of the entire network&lt;br /&gt;
after observing less than ten transactions per node.&lt;br /&gt;
&lt;br /&gt;
Dandelion is a practical, lightweight privacy solution that provides the Bitcoin&lt;br /&gt;
network formal anonymity guarantees. While other privacy solutions aim to&lt;br /&gt;
protect individual users, Dandelion protects anonymity by limiting the&lt;br /&gt;
capability of adversaries to deanonymize the entire network.&lt;br /&gt;
&lt;br /&gt;
==How Dandelion Works==&lt;br /&gt;
&lt;br /&gt;
Dandelion enhances user privacy by sending transactions through an anonymity&lt;br /&gt;
phase before diffusing them throughout the network. At a high level, Dandelion&lt;br /&gt;
enhances privacy by (i) breaking the symmetry of diffusion and (ii) mixing&lt;br /&gt;
transactions by forwarding messages from different sources along the same path.&lt;br /&gt;
&lt;br /&gt;
Dandelion routing can be conceptualized in three phases. First, a privacy graph&lt;br /&gt;
is constructed. In practice, this privacy graph is constructed in a fully&lt;br /&gt;
decentralized manner and is a subgraph of the existing Bitcoin P2P network.&lt;br /&gt;
Next, transactions are forwarded along this privacy graph during the &amp;quot;stem&lt;br /&gt;
phase.&amp;quot; Finally, messages are broadcast to the network during the &amp;quot;fluff phase&amp;quot;&lt;br /&gt;
using the typical method of diffusion.&lt;br /&gt;
&lt;br /&gt;
[[File:bip-0156/1-dandelion.png|framed|center|alt=An illustration of Dandelion routing|Figure 1]]&lt;br /&gt;
Figure 1&lt;br /&gt;
&lt;br /&gt;
In order to select the privacy graph in a decentralized manner, each node&lt;br /&gt;
selects a subset of its outbound peers to be Dandelion destinations. Dandelion&lt;br /&gt;
transactions (transactions in their stem phase) that arrive at this node via&lt;br /&gt;
inbound connections are forwarded to these Dandelion destinations.&lt;br /&gt;
&lt;br /&gt;
In an ideal setting, we have found that a Hamiltonian circuit provides&lt;br /&gt;
near-optimal privacy guarantees. However, constructing a Hamiltonian circuit&lt;br /&gt;
through the Bitcoin P2P network in a decentralized, trustless manner is not&lt;br /&gt;
feasible. Thus, we recommend that each node select two Dandelion destinations&lt;br /&gt;
uniformly at random without replacement from its list of outbound peers. Our&lt;br /&gt;
tests have shown that this method provides comparable privacy with increased&lt;br /&gt;
robustness.&lt;br /&gt;
&lt;br /&gt;
During stem phase routing, there is a question of how to route messages in order&lt;br /&gt;
to protect privacy. For example, if two Dandelion transactions arrive at a node&lt;br /&gt;
from different inbound peers, to which Dandelion destination(s) should these&lt;br /&gt;
transactions be sent? We have found that some choices are much better than&lt;br /&gt;
others.&lt;br /&gt;
&lt;br /&gt;
Consider the case in which each Dandelion transaction is forwarded to a&lt;br /&gt;
Dandelion destination selected uniformly at random. This approach results in a&lt;br /&gt;
fingerprint attack allowing network-level botnet adversaries to achieve total&lt;br /&gt;
deanonymization of the P2P network after observing less than ten transactions&lt;br /&gt;
per node.&lt;br /&gt;
&lt;br /&gt;
[[File:bip-0156/2-attack.png|framed|center|alt=An illustration of a fingerprint attack|Figure 2]]&lt;br /&gt;
Figure 2&lt;br /&gt;
&lt;br /&gt;
During a fingerprint attack, a botnet-style adversary with knowledge of the&lt;br /&gt;
graph structure first simulates transaction propagation. This offline step lets&lt;br /&gt;
the adversary generate fingerprints for each network node. During the online&lt;br /&gt;
attack, the adversary collects transactions at its spy nodes and matches these&lt;br /&gt;
observations to the simulated fingerprints. Our simulations have shown that this&lt;br /&gt;
attack results in devastating, network-wide deanonymization.&lt;br /&gt;
&lt;br /&gt;
[[File:bip-0156/3-attack-plot.png|framed|center|alt=A plot illustrating total deanonymization|Figure 3]]&lt;br /&gt;
Figure 3&lt;br /&gt;
&lt;br /&gt;
To avoid this issue, we suggest &amp;quot;per-inbound-edge&amp;quot; routing. Each inbound peer is&lt;br /&gt;
assigned a particular Dandelion destination. Each Dandelion transaction that&lt;br /&gt;
arrives via this peer is forwarded to the same Dandelion destination. &lt;br /&gt;
Per-inbound-edge routing breaks the described attack by blocking an adversary&amp;#039;s&lt;br /&gt;
ability to construct useful fingerprints. Fingerprints arise when routing&lt;br /&gt;
decisions are made independently per transaction at each node. In this case, two&lt;br /&gt;
transactions from the same node generally take different paths through the&lt;br /&gt;
network. Crucially, this results in multiple, unique data points that are&lt;br /&gt;
aggregated to match with a fingerprint.&lt;br /&gt;
&lt;br /&gt;
Dandelion ensures that two transactions from the same node take the same network&lt;br /&gt;
path, limiting adversaries to the far-left of the graph in Figure 3. In other&lt;br /&gt;
words, adversary knowledge is limited to the case of one observed message rather&lt;br /&gt;
than a rich profile of multiple transaction paths. Dandelion also breaks the&lt;br /&gt;
symmetry of diffusion, making the source of the transaction difficult to infer.&lt;br /&gt;
&lt;br /&gt;
[[File:bip-0156/4-dandelion-plot.png|framed|center|alt=A plot illustrating limited deanonymization|Figure 4]]&lt;br /&gt;
Figure 4&lt;br /&gt;
&lt;br /&gt;
After a transaction has traveled along a Dandelion stem for a random number of&lt;br /&gt;
hops, it transitions into the fluff phase of routing. The transaction is shared&lt;br /&gt;
with the network through the existing process of diffusion. In practice, this&lt;br /&gt;
fluff mechanism is enforced by a weighted coin flip at each node. If the random&lt;br /&gt;
value is below some threshold, the Dandelion transaction is transformed into a&lt;br /&gt;
typical transaction. In our testing, we have chosen a probability of ten percent&lt;br /&gt;
that a given Dandelion transaction enters fluff phase when leaving a given node.&lt;br /&gt;
This value strikes a good balance between stem path length and transaction&lt;br /&gt;
spreading latency.&lt;br /&gt;
&lt;br /&gt;
Note that Dandelion&amp;#039;s expected precision guarantees are a population-level&lt;br /&gt;
metric, whereas the expected recall guarantees can be interpreted as an&lt;br /&gt;
individual-level metric. Expected recall is equivalent to the probability that&lt;br /&gt;
an adversary associates a single transaction with a given source. These&lt;br /&gt;
guarantees are probabilistic. They do not address scenarios in which a node has&lt;br /&gt;
been eclipsed by other nodes, or when a node is specifically targeted by an&lt;br /&gt;
ISP-like adversary. Individuals who are concerned about targeted deanonymization&lt;br /&gt;
should still use Tor.&lt;br /&gt;
&lt;br /&gt;
At a high level, Dandelion is like an &amp;quot;anonymity inoculation&amp;quot; for the public at&lt;br /&gt;
large - including users who are not aware of Bitcoin&amp;#039;s privacy issues. Higher&lt;br /&gt;
adoption leads to greater benefits, even for users who do not use Tor. Early&lt;br /&gt;
adopters of Dandelion still receive privacy benefits. In the worst case when no&lt;br /&gt;
neighbors support Dandelion, transactions make at least one hop before&lt;br /&gt;
diffusing. Note that any solution based only on routing cannot be perfectly&lt;br /&gt;
anonymous due to the fundamental lower bounds on precision and recall shown in&lt;br /&gt;
the original Dandelion paper. Dandelion provides near-optimal anonymity&lt;br /&gt;
guarantees among such solutions.&lt;br /&gt;
&lt;br /&gt;
==Specification==&lt;br /&gt;
&lt;br /&gt;
Dandelion can be specified with a handful of features: Dandelion transaction&lt;br /&gt;
support, Dandelion routing data and logic, periodic Dandelion route shuffling,&lt;br /&gt;
memory pool logic, the fluff mechanism, transaction embargoes, and Dandelion&lt;br /&gt;
transaction logic. Specification details are summarized below.&lt;br /&gt;
&lt;br /&gt;
===Dandelion transaction support===&lt;br /&gt;
&lt;br /&gt;
During the stem phase, transactions are &amp;quot;Dandelion transactions.&amp;quot; When a&lt;br /&gt;
Dandelion transaction enters fluff phase, it becomes a typical Bitcoin&lt;br /&gt;
transaction. Dandelion transactions and typical transactions differ only in&lt;br /&gt;
their &amp;lt;code&amp;gt;NetMsgType&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dandelion (stem phase) transactions MUST be differentiable from typical Bitcoin&lt;br /&gt;
transactions.&lt;br /&gt;
&lt;br /&gt;
===Dandelion routing data and logic===&lt;br /&gt;
&lt;br /&gt;
Dandelion routing during the stem phase requires notions of inbound peers,&lt;br /&gt;
outbound peers, Dandelion destinations, and Dandelion routes. Inbound peers&lt;br /&gt;
consist of all currently connected peers that initiated the peer connection.&lt;br /&gt;
Outbound peers consist of all currently connected peers that were connected to&lt;br /&gt;
by this node. Dandelion destinations are a subset of outbound peers. The number&lt;br /&gt;
of Dandelion destinations is limited by the&lt;br /&gt;
&amp;lt;code&amp;gt;DANDELION_MAX_DESTINATIONS&amp;lt;/code&amp;gt; parameter. In the reference&lt;br /&gt;
implementation, this parameter is set to two. Our tests have shown that this&lt;br /&gt;
value provides both privacy and robustness (see the reference paper for more&lt;br /&gt;
details on the parameter tradeoffs). Dandelion routes are a map of inbound peers&lt;br /&gt;
to Dandelion destinations. Every inbound peer is mapped to a Dandelion&lt;br /&gt;
destination.&lt;br /&gt;
&lt;br /&gt;
Note that a Dandelion node may choose a different&lt;br /&gt;
&amp;lt;code&amp;gt;DANDELION_MAX_DESTINATIONS&amp;lt;/code&amp;gt; parameter without splitting from the&lt;br /&gt;
privacy graph. When mapping inbound connections to outbound connections for&lt;br /&gt;
Dandelion routes, we implement the following routing logic. First, select a set&lt;br /&gt;
of Dandelion destinations from the set of outbound peers. This set of Dandelion&lt;br /&gt;
destinations is of size less than or equal to&lt;br /&gt;
&amp;lt;code&amp;gt;DANDELION_MAX_DESTINATIONS&amp;lt;/code&amp;gt;. For each inbound connection, first&lt;br /&gt;
identify the subset of Dandelion destinations with the least number of routes.&lt;br /&gt;
For example, some subset of Dandelion destinations may be affiliated with zero&lt;br /&gt;
routes while all other Dandelion destinations are affiliated with one or more&lt;br /&gt;
routes. From this subset, select one Dandelion destination uniformly at random.&lt;br /&gt;
Establish a Dandelion route from the inbound connection to this Dandelion&lt;br /&gt;
destination.&lt;br /&gt;
&lt;br /&gt;
For a given Dandelion routing epoch, two distinct Dandelion destinations SHOULD&lt;br /&gt;
be selected uniformly at random from the set of outbound connections. All&lt;br /&gt;
Dandelion transactions that arrive via a given inbound connection MUST be&lt;br /&gt;
transmitted to the same Dandelion destination. When choosing a Dandelion&lt;br /&gt;
destination for a given inbound connection, the destination MUST be selected&lt;br /&gt;
uniformly at random from the set of Dandelion destinations with the least number&lt;br /&gt;
of inbound connections mapped to them.&lt;br /&gt;
&lt;br /&gt;
===Periodic Dandelion route shuffling===&lt;br /&gt;
&lt;br /&gt;
The map of Dandelion routes is cleared and reconstructed every ten minutes on&lt;br /&gt;
average. We have chosen the value of ten minutes heuristically in order to make&lt;br /&gt;
privacy graph learning difficult for adversaries. Note that a Dandelion node may&lt;br /&gt;
choose a different average shuffle time without splitting from the privacy&lt;br /&gt;
graph.&lt;br /&gt;
&lt;br /&gt;
Dandelion routes MUST be cleared and reconstructed at random intervals.&lt;br /&gt;
Dandelion routes SHOULD be cleared and reconstructed every ten minutes on&lt;br /&gt;
average.&lt;br /&gt;
&lt;br /&gt;
===Memory pool logic===&lt;br /&gt;
&lt;br /&gt;
Dandelion transactions are segregated from typical transactions. The&lt;br /&gt;
&amp;lt;code&amp;gt;mempool&amp;lt;/code&amp;gt; remains unchanged. Another instance of the&lt;br /&gt;
&amp;lt;code&amp;gt;CTxMemPool&amp;lt;/code&amp;gt; class, called the &amp;lt;code&amp;gt;stempool&amp;lt;/code&amp;gt;, is used for&lt;br /&gt;
Dandelion transactions. Information flows from &amp;lt;code&amp;gt;mempool&amp;lt;/code&amp;gt; to&lt;br /&gt;
&amp;lt;code&amp;gt;stempool&amp;lt;/code&amp;gt; in order to ensure proper transaction propagation.&lt;br /&gt;
Information does not flow from &amp;lt;code&amp;gt;stempool&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;mempool&amp;lt;/code&amp;gt;,&lt;br /&gt;
except when a Dandelion transaction fluffs into a typical transaction.&lt;br /&gt;
&lt;br /&gt;
When a Dandelion transaction arrives, the transaction MUST be added to the&lt;br /&gt;
stempool and MUST NOT be added to the mempool. When a typical Bitcoin&lt;br /&gt;
transaction arrives, the transaction MUST be added to the mempool and MUST be&lt;br /&gt;
added to the stempool. When a Dandelion transaction fluffs, the transaction MUST&lt;br /&gt;
be added to the mempool.&lt;br /&gt;
&lt;br /&gt;
===The fluff mechanism===&lt;br /&gt;
&lt;br /&gt;
When relaying a Dandelion transaction along a Dandelion route, there is a 10%&lt;br /&gt;
chance that the Dandelion transaction becomes a typical Bitcoin transaction and&lt;br /&gt;
is therefore relayed via diffusion. In our testing, this value strikes a good&lt;br /&gt;
balance between stem path length and transaction spreading latency. Note that a&lt;br /&gt;
Dandelion node may choose a different chance of fluffing without splitting from&lt;br /&gt;
the privacy graph.&lt;br /&gt;
&lt;br /&gt;
When a node prepares to transmit a Dandelion transaction, the node MUST flip a&lt;br /&gt;
biased coin. If the outcome is &amp;quot;Dandelion transaction,&amp;quot; then the node MUST&lt;br /&gt;
transmit the transaction to the appropriate Dandelion destination. Otherwise,&lt;br /&gt;
the node MUST convert the Dandelion transaction into a typical Bitcoin&lt;br /&gt;
transaction. A Dandelion transaction SHOULD fluff into a typical Bitcoin&lt;br /&gt;
transaction with a 10% probability.&lt;br /&gt;
&lt;br /&gt;
===Transaction embargoes===&lt;br /&gt;
&lt;br /&gt;
During the stem phase, transactions are relayed along a single path. If any node&lt;br /&gt;
in this path were to receive the Dandelion transaction and go offline, then the&lt;br /&gt;
transaction would cease to propagate. To increase robustness, every node that&lt;br /&gt;
forwards a Dandelion transaction initializes a timer at the time of reception.&lt;br /&gt;
If the Dandelion transaction does not appear in the memory pool by the time the&lt;br /&gt;
timer expires, then the transaction enters fluff phase and is forwarded via&lt;br /&gt;
diffusion.&lt;br /&gt;
&lt;br /&gt;
When a Dandelion transaction arrives, the node MUST set an embargo timer for a&lt;br /&gt;
random time in the future. If the Dandelion transaction arrives as a typical&lt;br /&gt;
Bitcoin transaction, the node MUST cancel the timer. If the timer expires before&lt;br /&gt;
the Dandelion transaction is observed as a typical Bitcoin transaction, then the&lt;br /&gt;
node MUST fluff the Dandelion transaction.&lt;br /&gt;
&lt;br /&gt;
===Dandelion transaction logic===&lt;br /&gt;
&lt;br /&gt;
The following cases define a node&amp;#039;s behavior when receiving network packets&lt;br /&gt;
referencing Dandelion transactions.&lt;br /&gt;
* Receive INV for Dandelion TX: If the peer is inbound and the Dandelion transaction has not been received from this peer, then reply with GETDATA.&lt;br /&gt;
* Receive GETDATA for Dandelion TX: If the peer is not inbound and the Dandelion transaction has been advertised to this peer, then reply with the Dandelion transaction.&lt;br /&gt;
* Receive Dandelion TX: If the peer is inbound, then relay the Dandelion TX to the appropriate Dandelion destination.&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
&lt;br /&gt;
A reference implementation is available at the following URL:&lt;br /&gt;
https://github.com/dandelion-org/bitcoin/tree/dandelion-feature-commits&lt;br /&gt;
&lt;br /&gt;
All features have been compressed into a single commit at the following URL:&lt;br /&gt;
https://github.com/dandelion-org/bitcoin/tree/dandelion&lt;br /&gt;
&lt;br /&gt;
==Compatibility==&lt;br /&gt;
&lt;br /&gt;
Dandelion does not conflict with existing versions of Bitcoin. A Bitcoin node&lt;br /&gt;
that supports Dandelion appears no differently to Bitcoin nodes running older&lt;br /&gt;
software versions. Bitcoin nodes that support Dandelion can identify feature&lt;br /&gt;
support through a probe message. Obviously, older nodes are not capable of&lt;br /&gt;
Dandelion routing. If a Bitcoin node supporting Dandelion has no peers that also&lt;br /&gt;
support Dandelion, then its behavior naturally decays to that of a Bitcoin node&lt;br /&gt;
without Dandelion support due to the Dandelion transaction embargoes.&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
&lt;br /&gt;
We would like to thank the Bitcoin Core developers and Gregory Maxwell in&lt;br /&gt;
particular for their insightful comments, which helped to inform this&lt;br /&gt;
implementation and some of the follow-up work we conducted. We would also like&lt;br /&gt;
to thank the Mimblewimble development community for coining the term &amp;quot;stempool,&amp;quot;&lt;br /&gt;
which we happily adopted for this implementation.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
# An Analysis of Anonymity in Bitcoin Using P2P Network Traffic http://fc14.ifca.ai/papers/fc14_submission_71.pdf&lt;br /&gt;
# Deanonymisation of clients in Bitcoin P2P network https://arxiv.org/abs/1405.7418&lt;br /&gt;
# Discovering Bitcoin’s Public Topology and Influential Nodes https://cs.umd.edu/projects/coinscope/coinscope.pdf&lt;br /&gt;
# (Sigmetrics 2017) Dandelion: Redesigning the Bitcoin Network for Anonymity https://arxiv.org/abs/1701.04439&lt;br /&gt;
# (Sigmetrics 2018) Dandelion++: Lightweight Cryptocurrency Networking with Formal Anonymity Guarantees https://arxiv.org/pdf/1805.11060.pdf&lt;br /&gt;
&lt;br /&gt;
==Copyright==&lt;br /&gt;
&lt;br /&gt;
To the extent possible under law, the author(s) have dedicated all copyright and&lt;br /&gt;
related and neighboring rights to this work to the public domain worldwide. This&lt;br /&gt;
work is distributed without any warranty.&lt;br /&gt;
&lt;br /&gt;
You should have received a copy of the CC0 Public Domain Dedication with this&lt;br /&gt;
work. If not, see https://creativecommons.org/publicdomain/zero/1.0/ .&lt;/div&gt;</summary>
		<author><name>934</name></author>
	</entry>
</feed>