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.
- 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.
- 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.
-
applied automatically by JoinMarket via a simple transaction analyses
- Any platform collecting the public orders of the peers.
- General docs on the order book (including how to run without Bitcoin Core): https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/orderbook.md
- A public example: https://nixbitcoin.org/orderbook
- 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.
- 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 taken from https://nixbitcoin.org/orderbook in March 2022.
- Click the top of the line to order by it's attribute
- First need to state that one single coinjoin doesn't improve privacy much.
- Participating in more coinjoins is essential. Find below the two main ways to achieve this.
- 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;
- 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:
- 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.
- Start with detaching the deposited coins from their history.
- 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 thechange-out
.
-
Stretch out in time to avoid timing analyses.
-
The Taker acts as the coinjoin coordinator
- has the most privacy benefits
- pays the fees (miner and coinjoin fees)
- the Taker is the initiator and coordinator of the coinjoin - takes the liquidity on offer.
- 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 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.
- 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
- 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 to obfuscate the amount sent.
- 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.
- https://github.com/JoinMarket-Org/joinmarket-clientserver/tree/master/docs
- https://en.bitcoin.it/Privacy
- IRC through Matrix: https://matrix.to/#/#joinmarket:libera.chat
- Telegram: https://t.me/joinmarket.org