Anonymous Bitcoin Transactions (by Pablo Martin and Amir Taaki)

Warning: prototype software! Don't gamble more than you can lose!

code fund: 1H1LP8UhGR5wK9WppBMwewCddwdebYqwwT

Video about this tool, also check out my video about Bitcoin

By default Bitcoin transactions are not fully anonymous but rather psuedonymous. A forum thread laid out a proposal with an attractive bounty.

This does not require any modification or extension to Bitcoin that other proposals like ZeroCoin do. It is plain standard Bitcoin technology.

We have implemented the proposal using sx and libbitcoin to support anonymising of Bitcoins.

Installing and running:

Source code (server and client)

Run the install instructions. To create a new coinjoin session or conversation, you must go to the URL: http://7vxb75tbnszhy2go.onion/g/RANDOMCHARS/N/A where RANDOMCHARS is your shared secret, and N is the number of participants, and A is the amount each participant will have to provide. This initializes the session ready for use.

For example: http://7vxb75tbnszhy2go.onion/g/blaablaa/3/0.1

Then load up the client, make the payment to the input address, enter the URL as: http://7vxb75tbnszhy2go.onion/g/RANDOMCHARS, and the destination address. Then all the participants click Anonymize and the magic happens.

$ torify python <amount> <privatekey filename>


$ torify python 0.1 private.key

First time use will create a new private key. To create a new one, just delete the old one. Note we indicate the amount the client will lock to. The client will only participate if you join a conversation for the indicate amount to avoid funny things.

Public Lobby:

If you create a conversation whose name starts with public it will appear in the public listing at http://7vxb75tbnszhy2go.onion so other people can join it if they're interested in anonymizing with the settings you chose.

Once group joins are past the output collection stage they don't appear any more.

As an example http://7vxb75tbnszhy2go.onion/g/public_myroom23 would be a public conversation.



Technical explanation

The goal of the participants is to get a list of N inputs and N outputs for a specific locked amount, so a transaction can be created by all participants to sign.

In this implementation participants use a pyqt client that connects to a custom simple server implementation that helps out in collecting all info needed for creating and signing the CoinJoin transaction without parties knowing input to output correlation. The client hold its own private key and never sends funds to the server, all signing is done on the client (so you open, load and anonymize).

This implementation enforces 0.01 inputs and outputs (plus fee) with focus on anonymizing, but can easily be adapted to lift the limits or for casual usage to minimize fees on normal transactions like described elsewhere.

For more info about architecture, weaknesses and possible developments check the README

For more information about the general idea of the CoinJoin concept check the FAQ section of the original coinjoin thread


Send funds to all the participants.

We begin our session:

Now the process begins. First we create the outputs, then the server sends us the template transaction, and we sign the inputs.

Anonymized and broadcasted.

Here's the server output (on the left) and the client (on the right). transaction.

Running the server.

You will need to setup an obelisk server. Start a load balancer using the command 'obbalancer', and then some workers (Bitcoin nodes) using 'obworker'.

You will need a libbitcoin blockchain. See libbitcoin website for more info.


Server needs gevent, python flask, werkzeug, ... keeps everything in memory.

$ python