# A private flow through JoinMarket Bitcoin privacy starts on the base layer where cooperative transactions with equal amount outputs - known as coinjoins - are used. This document aims to provide an introduction to using JoinMarket, a decentralized, liquidity market based coinjoin implementation following basic good practices. - [Common definitions](#common-definitions) - [Mixdepth](#mixdepth) - [Sweep](#sweep) - [Status labels](#status-labels) - [Orderbook](#orderbook) - [Minimum size to coinjoin](#minimum-size-to-coinjoin) - [Maximum size to coinjoin](#maximum-size-to-coinjoin) - [Screenshots from the orderbook](#screenshots-from-the-orderbook) - [The flow of funds](#the-flow-of-funds) - [Running the Tumbler](#running-the-tumbler) - [Sending transactions manually and running the Yield Generator](#sending-transactions-manually-and-running-the-yield-generator) - [Deposit](#deposit) - [Sweep](#sweep-1) - [Send or participate in multiple coinjoins](#send-or-participate-in-multiple-coinjoins) - [The Taker role](#the-taker-role) - [The Maker role](#the-maker-role) - [Leaving the JoinMarket wallet](#leaving-the-joinmarket-wallet) - [When](#when) - [How](#how) - [Do](#do) - [Don't](#dont) - [More Reading](#more-reading) - [Questions and discussions](#questions-and-discussions) ## Common definitions ### Mixdepth * One of the accounts in the JoinMarket wallet. * Abbreviated to `m0` / `m1` / `m2` / `m3` / `m4` * All are derived from the same BIP32 and BIP39 compatible HD seed. ### Sweep * It means sending one or multiple utxos without creating change. * It is achieved by sending all utxos (except the ones frozen) from an account. * The amount is not fixed and fees come off the sum of the inputs. ### Status labels * applied automatically by JoinMarket via a [simple script](https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/a0991fad0be03f133236f635c95691e807bfeecb/jmclient/jmclient/wallet_utils.py#L457) * `deposit`: output of a simple transaction to new address * `cj-out`: one of the equal amount outputs * `change-out`: one of the unique amount outputs from a cj * `non-cj-change`: output of a transaction without equal amounts * `reused`: a utxo on an address which has been used previously ### Orderbook * Any platform collecting the public orders of the peers. * General docs on the order book (including how to run without Bitcoin Core): * A public example: ### Minimum size to coinjoin * The default is 100k sats (+/-10%) so that is a safe choice. * On the example below offers start at 6 peers offering min 27300 sats. * Running the Tumbler would require to start with a higher amount as the fees can take up a significant portion. ### Maximum size to coinjoin * The max amount offered is limited by the wallet of each Maker. * It is the highest amount in one single mixdepth (-0-10%). * Multiple bitcoin amounts are offered by several (10+) peers. * On the example below 21 peers offer 19+ BTC ### Screenshots from the orderbook * Taken in March 2022. * On the website click the top of a column to order by it's attribute.

## The flow of funds * First need to state that [one single coinjoin doesn't improve privacy much](https://github.com/JoinMarket-Org/joinmarket-clientserver/issues/1047#issuecomment-944995635). * Participating in more coinjoins is essential. Find below the two main ways to achieve this. ## Running the Tumbler * Using the Tumbler is a higher time preference option and usually is the best tool to use if the funds are needed in the near future - it can take multiple hours, up to days. * Multiple coinjoins are sent through the accounts including sweeping transactions at the start and at the end. * Breaks up the deposited amounts and sends to at least 3 final addresses without leaving change behind. * For the best outcome avoid merging between the final addresses. * The initiator acts repeatedly as a Taker and [pays all the miner and coinjoin fees](https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/tumblerguide.md#a-note-on-fees); * It is implemented in the JoinMarket-QT GUI and in the command line as the `tumbler.py`. * For a detailed usage guide see: * * Video demonstration of the Tumbler function in QT GUI: * * Discussed further in: * * ## Sending transactions manually and running the Yield Generator ### Deposit * Send to a new address in m0 - could be any of the accounts, but suggesting using the first one for simplicity. * Deposit a single or multiple coins from a single funding source at a time. * Select the newly deposited coin(s) with freeze/unfreeze if there are others in the account. ### Sweep * Start with [detaching the deposited coins from their history](https://github.com/JoinMarket-Org/joinmarket-clientserver/issues/864#issuecomment-884540079). * Can send to a new address in the same account (could be any, but keep it simple). * There is no change created, so there is need to separate the `cj-out` from the `change-out`. ### Send or participate in multiple coinjoins * Stretch out in time to avoid timing analyses. #### The Taker role * the Taker is the initiator and coordinator of the coinjoin - takes the liquidity on offer. * As the coordinator it has the most privacy benefits. * The Taker pays all the fees (miner and coinjoin fees). * Send coinjoins to a new address in the next mixdepth. * In a coinjoin multiple coins can be merged by sending custom amounts or sweeping. #### The Maker role * The Makers are offering their coins to be used in coinjoins - market makers. * Being a Maker can be thought of as providing a service, but also comes with privacy benefits. * Activate the Yield Generator (Maker / Earn) to start. * To get selected more often it is best to have a a sizeable Fidelity Bond. See: * * * As a Maker the coins will circle through the accounts automatically: ``` ... m0 -> m1 -> m2 -> m3 -> m4 -> m0 -> m1 -> m2 -> m3 -> m4 ... ``` * Only the `cj-out` propagates to the next account. * The `change-out` stays behind in the same account where the funding utxo was. ### Leaving the JoinMarket wallet #### When * The more coinjoins the funds were through the better. * Consider that the privacy benefit from coinjoins is breaking down with time as the peers are gradually exposed or clustered. * If deposited only to m0 and followed the steps above all coins in m4 must have been through at least 5 coinjoins. * In a long running, active Maker wallet some funds could have made multiple circles - there is no indication of this by default #### How ##### Do * Can only send (merge coins) from one account at a time. * Send to multiple separate destinations (separate wallets with different purposes - not to be merged later). * Sweep whole accounts or coins and don't leave change behind. * Fund lightning nodes or send to cold storage via coinjoin(s). * Pay with Payjoin to [BIP78 compatible wallets](https://en.bitcoin.it/wiki/PayJoin_adoption) to obfuscate the amount sent. ##### Don't * Avoid sending out the whole amount which entered the wallet a few transactions ago all at once. * Don't merge a change from a previous transaction when sending to a new destination. ## More Reading * * ## Questions and discussions * IRC through Matrix: * Telegram: