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 PayJoins[1] 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.
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 coinjoins[2]. 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 transaction[3]. 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
References
- https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/release-notes/release-notes-0.5.2.md#payjoin-feature-aka-pay-to-endpointp2ep
- https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/JOINMARKET-QT-GUIDE.md
- https://mastodon.social/@waxwing/101387762796750634