"Mixing" is a term often used with Bitcoin, regarding the trading of coins for the sake of disconnecting your identity from one end of the trail. It can help anonymize your cryptocurrency exchange by working with new coins that have a different history, while yours move on to have new lives of their own. Of course Bitcoin Cash, Litecoin, and Ethereum also have mixers. Some also call this "tumbling".
Ignoring a discussion on mixer internals, there's at a minimum, one problem you have with every mixer. You don't know if you trust the owners.
In reality, there's three possible vulnerabilities with mixer use in general.
- The mixer may not mix well enough.
- The mixer may be compromised.
- The mixer may be a honeypot, ran by the IRS, FBI, etc.
The mixer will always know, or at least be able to know, the address coins were sent from and the amount, and the destination. Thus even if from a blockchain analysis perspective the mix is "perfect", if the mixer is a bad actor they can disclose who really funded a particular wallet.
For a while I have thought the solution to this was quite easy. Surprisingly, haven't seen anyone else doing this. Just use two mixers.
In a nutshell:
Mixers want one piece of data: an address to send coins to. They'll reply with an input address, minimum/maximum limits, delay information, etc.
- Create mix A with final stage mixer. This mix will have the output address of your target wallet.
- Create mix B with your "entry" mixer. This mix will have mix A's input address as its output address.
- Send coins to mix B's input address.
Pretty simple. I finally wrote two different Python libraries for two different mixers, and a third CLI/library that chains the two together in a simple way.
pip3 install doublemixer
doublemixer mix --currency bitcoin --output_address 1a...
Fees are going to be higher than single stage mixing and I do take an affiliate cut with this at the library level, which is easy to override if you know how.