/coinmux

Decentralized, Trustless, Anonymous and Open Bitcoin Mixer

Primary LanguageRubyApache License 2.0Apache-2.0

Coinmux - Bitcoin Mixer

Decentralized1, Trustless, Anonymous2 and Open Bitcoin Mixer

Synopsis

Coinmux is an implementation of CoinJoin. It is currently in early development and only suitable for use on Bitcoin's Testnet network.

CoinJoin increases your Bitcoin privacy and helps bitcoins remain fungible. Your bitcoins along with others are joined into a single transaction with some of the output addresses at the same Bitcoin amount. These same amount output addresses are indistinguishable from one another and there is no way to match them to a specific input addresses.

CoinJoin is also safe. Even though you are combining your bitcoins with strangers on the Internet, Coinmux only signs transactions that have the inputs and outputs you specify. There is no chance of anyone stealing your coins - if your outputs are not 100% correct, Coinmux will not sign the transaction and your coins don't go anywhere!

CoinJoin is very inexpensive. The only fees involved are those used to pay Bitcoin miners their normal transaction fee. And that low fee is split between all participants!

You can view some of the transactions made during testing.

Release Notes

Protocol Specification

Roadmap

Notes

1 Its not totally decentralized yet. It makes some connections to webbtc.com to get transaction data since this cannot be retrieved over the Bitcoin network without a full copy of the blockchain.

2 Its not totally anonymous yet. Your IP address will be leaked when connecting over the P2P network. But your CoinJoin transaction's output is difficult to trace once added to the Bitcoin blockchain.

Installation

You can either run Coinmux from the pre-built Java Jar file or run directly from source. You should already have Java installed on your computer.

The latest version is: 0.2.1

Runnable Java Jar File Installation

Download the Java Jar file:

http://coinmux.com/releases/coinmux-latest.jar

Ruby Developer Installation

Install RVM and JRuby

curl --ssl https://get.rvm.io | bash -s stable --ruby=jruby-1.7.10

Clone the git repository to your computer.

git clone https://github.com/michaelgpearce/coinmux.git

Install application dependencies from the project directory. (You may need to reload your terminal shell.)

gem install bundler && bundle

Command Line Interface

All commands can be run with either java -jar coinmux-latest.jar [options] from the directory of the jar file or ./bin/coinmux [options] from your Coinmux project directory. The remainder of this document assumes you are using the Jar file. If you are using the ./bin/coinmux command, simply replace the start of the commands below.

Print options from the project directory

java -jar coinmux-latest.jar --help

Trying it out P2P over the Internet

Coinmux in P2P mode requires external access to ports 14141 TCP and UDP. If you are behind a firewall and your router supports UPNP, these ports will be opened for you automatically, otherwise you must manually allow access to these ports.

To begin, check to see if there are available CoinJoins already on the network. If not, Coinmux will create one automatically when you start a CoinJon.

java -jar coinmux-latest.jar --list

You will see something like this:

BTC Amount  Participants
==========  ============
0.0625      2 of 5
0.125       1 of 2
1.0         3 of 5

Now execute Coinmux in a CoinJoin between 2 participants for 0.5 BTC. You will be prompted to enter the private key of your input Bitcoin address.

java -jar coinmux-latest.jar --participants 2 --amount 0.5 --output-address my-output-address --change-address my-change-address

Coinmux will wait for more participants to arrive until there are the correct number you specified to begin the CoinJoin.

To join the CoinJoin with another of your input addresses, start a second process with a matching number of participants and Bitcoin amount, but using a different input private key, output address and change address. If you run this on the same computer, you will also need to tell Coinmux to use a different port for connecting to the P2P network.

java -jar coinmux-latest.jar --participants 2 --amount 0.5 --output-address my-output-address-2 --change-address my-change-address-2 --data-store p2p?port=14142

If you are the only two partipants in the CoinJoin, you will see output like this for the first participant:

[Participant]: Finding coin join message
[Participant]: No available coin join
   [Director]: Inserting coin join message
   [Director]: Inserting status message
   [Director]: Waiting for inputs
[Participant]: Finding coin join message
[Participant]: Inserting input
[Participant]: Waiting for other inputs
   [Director]: Inserting message verification message
   [Director]: Waiting for outputs
[Participant]: Inserting output
[Participant]: Waiting for other outputs
   [Director]: Inserting transaction message
   [Director]: Waiting for signatures
[Participant]: Inserting transaction signatures
[Participant]: Waiting for completed
   [Director]: Publishing transaction
   [Director]: Completed
[Participant]: Completed - Transaction ID: 3b1d7dc373ecf5abc8e2a18d61839a7d7d06a99f3c94fec5cbff17330596c8a6
CoinJoin successfully created!

And like this for the second:

[Participant]: Finding coin join message
[Participant]: Inserting input
[Participant]: Waiting for other inputs
[Participant]: Inserting output
[Participant]: Waiting for other outputs
[Participant]: Inserting transaction signatures
[Participant]: Waiting for completed
[Participant]: Completed - Transaction ID: 3b1d7dc373ecf5abc8e2a18d61839a7d7d06a99f3c94fec5cbff17330596c8a6
CoinJoin successfully created!

Usage on a single computer over the filesystem

If you want to try Coinmux out on a single computer, use the filesystem data-store instead of p2p. When communicating via the filesystem, no external connections are made to find peers. This is useful for mixing your own wallet.

Using the filesystem looks like this:

java -jar coinmux-latest.jar --participants 2 --amount 0.5 --output-address my-output-address --change-address my-change-address --data-store filesystem

There may be some interesting things to try combining a filesystem CoinJoin with services like Dropbox or using FTP or SSHFS.

Graphical Interface

Since Coinmux is in early development, there may be bugs that can cause a loss of Bitcoin. There is a graphical interface in early development that can be used. It may be more prone to bugs than the command line interface. Like the command line interface, it defaults to the Testnet Bitcoin network. This can be changed in the settings, but this is not recommended. USE AT YOUR OWN RISK!

As the system shows its robustness, it will have a graphical interface and default to Bitcoin's Mainnet.

Tests

Run tests with the following command

bundle exec rake

Donation

If you find this software useful and want to contribute to the continued development of Coinmux to enhance Bitcoin privacy and fungibility, donations can be sent to:

16f6gUFDFafjLPkWB55nvDjE3YkA6uPvoG

Thanks

irritant on Bitcointalk for helping with testing and debugging some Windows issues.

License

Licenced with Apache v2.0.