JoinMarket

JoinMarket is a CoinJoin implementation aimed at improving the privacy and fungibility of bitcoin transactions.
A CoinJoin transaction requires other people to take part. The right resources (coins) have to be in the right place, at the right time, in the right quantity. This isn't a software or tech problem but an economic problem. JoinMarket works by creating a new kind of market that allocates these resources in the best way.
This works by allowing coinjoin transactions to be paid-for. On one side there are time-rich coinjoiners who collect fees when other peers create coinjoins with them, called market makers. On the other side there are time-stressed coinjoiners who can coinjoin instantly and pay a fee, called market takers. 
Because of this market for coinjoins, JoinMarket can be used to send equal-amount CoinJoin transactions of any amount up to about 200 btc (as of 2019), at any time desired by the user. The use of CoinJoin makes the system non-custodial as the private keys never leave the user's control. As the supply of held bitcoins is high, and risk of loss is very small, coinjoin fees can be expected to also be small. The JoinMarket wallet is a hierarchical deterministic wallet which allows users to easily avoid address reuse.
Recent versions also allow sending and receiving PayJoinshttps://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/release-notes/release-notes-0.5.2.md#payjoin-feature-aka-pay-to-endpointp2ep which are a special kind of coinjoin where the two involved parties pay each other. This CoinJoin type has different (probably better) privacy properties.
As market makers can earn coinjoin fees, it is possible for long-term holders of bitcoin to use JoinMarket as an investment vehicle to generate an income from their held bitcoins.
The project is coded in Python and was first released on bitcoin's mainnet in 2015.
Some data on volumes can be found here: http://bitcoinkpis.com/privacy
=== Scripts ===
The JoinMarket project has several application scripts which are used for different purposes.
==== Yield generator ====
Being a market maker allows holders of bitcoin to collect fees. With this, the Yield Generator script is used to earn an income from long-term held bitcoin. The investment is very low risk as the software only signs transactions that are valid and pay operators the correct amount in coinjoin fees. Although the coins must be held on an online hot wallet. The investment has no commitment as bitcoins can be withdrawn at any time. It also improves the privacy of the held bitcoins as well as privacy and fungibility in the entire ecosystem, which makes bitcoin as a currency more useful and thus increases its value.
==== Joinmarket-Qt ====
Joinmarket-Qt is a GUI application which allows users to create wallets and send coinjoinshttps://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/JOINMARKET-QT-GUIDE.md. It is essentially a simple GUI bitcoin wallet with sendpayment and tumbler scripts wrapped inside.
==== Send payment ====
The send payment script is used to create a single CoinJoin transaction that pays bitcoins somewhere. It acts as a market taker. 
==== Tumbler ====
Privacy is greatly improved by repeating coinjoins many times, for this reason the JoinMarket project includes the tumbler script where coinjoins are automatically created at random times and for random amounts. Bitcoins can be deposited into the JoinMarket HD wallet and the tumbler script will send them via many coinjoins to three or more destination addresses. This feature of using more than one destination address is required to beat amount correlation. For example a user who wants to deposit coins into an exchange would make use of the "Generate New Deposit Address" button to obtain more than one destination address, the exchange may then combine those coins with deposits from other customers which should resist any tracking based on amounts. The script is different from the send payment script because it takes much longer to run (needing to wait for many confirmations as well as having random waits) but has much stronger privacy properties.
==== Orderbook watcher ====
The orderbook watcher script is used to display and view all the coinjoin offers along with their prices.
=== Mixdepths ===
To avoid a later transaction recombining a change output with a coinjoin output, JoinMarket's wallets have the concept of a mixdepth. UTXOs from one mixdepth are never used as inputs along with coins from others, so mixdepths are like seperate identities which users can use to stop coins from different sources being mixed. Coins only move between them via coinjoins. The Deterministic wallet discourages users from doing address reuse. The wallet allows individual private keys and UTXOs to be imported, which can be used with reused addresses to have coinjoins created from them which would confuse any analysis based on the common-input-ownership heuristic.
=== Probable examples of JoinMarket CoinJoins ===
It's important to note that such identification is always deniable, because somebody could make fake CoinJoins that have the same structure as a JoinMarket transaction but are made by a single person.
* 55eac9d4a4159d4ba355122c6c18f85293c19ae358306a3773ec3a5d053e2f1b
* 402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a
* 722bb2662cb2ef9b4a2693e52ba82c44cea1042349f1aa6e71e28a3947aa4144
* 3b97544488cac0271a80b20822597342648d19ed02ac25041bd8d35e624d8e6b
* 7104bae698587b3e75563b7ea7a9aada41d9c787788bc2bf26dd201fd7eca8a2 - A probable PayJoin transactionhttps://mastodon.social/@waxwing/101387762796750634. Payjoins are indistinguishable from regular bitcoin transactions, but this one was published online by its creator.
== External links ==
* https://github.com/JoinMarket-Org/joinmarket-clientserver
* #joinmarket IRC channel on the Freenode network. Web interface.
* http://www.reddit.com/r/joinmarket
* https://bitcointalk.org/index.php?topic=919116.0
* https://twitter.com/joinmarket/
* https://imgur.com/C6w0Pgf - infographic
* https://github.com/AdamISZ/JMPrivacyAnalysis
== See also ==
* CoinJoin
* PayJoin
==References==
Category:Privacy
Category:Open Source
Category:Software