Change in Bitcoin is toxic. Even in coinjoins! đź’€
Different coinjoin implementations have unique ways of dealing with toxic change. Should change be included, isolated, or outright eliminated in coinjoins? Let’s explore:
Among all coinjoin designs, there are three major implementations: JoinMarket, Whirlpool and us, Wasabi. All have different ways of dealing with toxic change. The ultimate goal is to help users protect their privacy with ease. Summarized briefly:
Wasabi 1.0 and JoinMarket include toxic change in coinjoins.
Whirlpool isolates toxic change from coinjoins.
Wasabi 2.0 (WabiSabi) eliminates toxic change from coinjoins.
What are these different strategies all about? Which one is better? We’ll try our best to sum it all up. You can also read the full article on this topic below. (Hint: getting rid of change sounds like a great plan.)
https://bitcoinmagazine.com/technical/toxic-change-wabisabi-bitcoin-coinjoin-privacy
In Wasabi 1.0 and JoinMarket, coinjoins have single fixed denominations. A user will most likely generate change as they don’t have the exact same value as the one required by the coinjoin. Read more about this here: https://docs.wasabiwallet.io/using-wasabi/ChangeCoins.html
Including toxic change in coinjoins is fee and block space efficient, but toxic change still burdens the user when spending their balance in the future. If toxic change and private outputs from coinjoins are consolidated, the privacy gained is undone.
What about isolating toxic change before the coinjoin happens? This is what Whirlpool’s coinjoin implementation does with Tx0, a self spend transaction that peels the change into another sub-wallet. This sounds good on the surface, right?
Think again. Isolating change from coinjoins has lots of issues. It’s inefficient as it requires at least 2 txs with Whirlpool (Tx0 + coinjoin tx). Typically, more than 2 txs are needed due to the small size of coinjoins, but that’s a topic for another time.
Users should also be careful not to consolidate different toxic changes. Each toxic change in Whirlpool is isolated in the same sub-wallet, which puts the burden back on the user.
Change can be a meaningful amount of money. So, what to do with it? Unknown. Registering toxic change in other coinjoins is bad in Whirlpool as it connects multiple Tx0s together.
So how does one manage toxic change in coinjoins? What if there is no change? Make change disappear from coinjoins so that users don’t have to deal with it while wallet developers can sleep better at night knowing users don’t make errors that could ruin their privacy.
Say hello to WabiSabi and arbitrary amount coinjoins. https://wasabiwallet.io
With fixed denomination coinjoins, Wasabi 1.0, JoinMarket and Whirlpool generate change outputs most of the time. JoinMarket has more edge cases that can be discussed in another thread.
With arbitrary amount coinjoins, change is almost always eliminated. Lonely whales may be the exception. In one single coinjoin transaction, a user can get not only a reasonably good anon set (more on that later) but also get rid of his toxic change outputs.
Good UX.
Good privacy.
Good efficiency.
Best of both worlds? Yup.
Eliminating toxic change outputs in coinjoins has major implications for privacy and is only made possible thanks to arbitrary amount coinjoins. With WabiSabi, there are 79 denominations for a given output, which provides lots of possibilities and usually result in no non-standard denominations.
Yes, lonely whales may receive change outputs with non-standard denominations, which can be considered toxic. Then what? Coinjoin again, for free. Just pay mining fees and get good privacy. That's it.