A long standing coinjoin implementation with decentralised coordination and incentive structure.
Testing on a RPi4 4GB with RaspiBlitz v1.3
Check the current offers in the order book: https://joinmarket.me/ob/
Generated by this script when installed:
$ python ~/joinmarket-clientserver/scripts/obwatch/ob-watcher.py
One can coinjoin any amount within the offer limits by default with 5-7 random participants at a time. The taker fees are maximised, then the offers within the limits are randomly chosen to participate. Most parameters can be easily customized.
See this review thread about the GUI option: https://twitter.com/zndtoshi/status/1191799199119134720
-
Need to activate the wallet of bitcoind
$ sudo nano /mnt/hdd/bitcoin/bitcoin.conf
disablewallet=0
$ sudo systemctl restart bitcoind
-
Run in the RaspiBlitz terminal:
git clone https://github.com/JoinMarket-Org/joinmarket-clientserver.git cd joinmarket-clientserver # latest release: https://github.com/JoinMarket-Org/joinmarket-clientserver/releases git reset --hard v0.5.5 sudo apt install -y libltdl-dev libssl-dev # needed for Armbian ./install.sh # (follow instructions on screen; provide sudo password when prompted) # do not install QT-dependencies - running headless on the RPi
-
Activate the virtual environment to see the prompt:
(jmvenv) $
This needs to be done at every new login.$ cd joinmarket-clientserver $ source jmvenv/bin/activate $ cd scripts
Tips
: the commands can be run as one line if joined by&&
(meaning continue to run if successful):$ cd joinmarket-clientserver && source jmvenv/bin/activate && cd scripts
The previously run commands can be easly searched from the prompt by pressing
CTRL+R
thanks to the command line fuzzy finder
-
Using the JoinMarket wallet: https://github.com/JoinMarket-Org/joinmarket/wiki/Using-the-JoinMarket-internal-wallet
(jmvenv) $ python wallet-tool.py generate
Created a new `joinmarket.cfg`. Please review and adopt the settings and restart joinmarket.
- JoinMarket uses a hot wallet sitting on your Raspberry Pi. Keep it safe.
- Backup your seed and store safely. Best to not keep the seed and the passphrase together.
- The wallet encryption password will be needed every time when there is interaction with the wallet. Store it somewhere accessible, best if encrypted.
-
Fill in the PasswordB to the
joinmarket.cfg
(as in/mnt/hdd/bitcoin/bitcoin.conf
)$ nano joinmarket.cfg
[BLOCKCHAIN] rpc_user = raspibolt rpc_password = PasswordB-as-in-bitcoin.conf
Press
CTRL+O
andENTER
to save andCRTL+X
to exit. -
Display the addresses to fund (look in mixdepth 0):
(jmvenv) $ python wallet-tool.py wallet.jmdat
and run again after the first time
-
Described in: https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/USAGE.md#try-out-a-coinjoin-using-sendpaymentpy
-
See the walkthrough for the JoinMarket-Qt GUI to send payments with coinjoin or run multiple coinjoins (tumbler): https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/JOINMARKET-QT-GUIDE.md
-
Video demonstration of using the JoinMarket-Qt GUI: https://youtu.be/hwmvZVQ4C4M
-
Read the basics: https://github.com/JoinMarket-Org/joinmarket/wiki/Running-a-Yield-Generator
-
Edit the settings:
$ nano yield-generator-basic.py
"""THESE SETTINGS CAN SIMPLY BE EDITED BY HAND IN THIS FILE: """ txfee = 100 cjfee_a = 500 cjfee_r = '0.00002' ordertype = 'swreloffer' #'swreloffer' or 'swabsoffer' nickserv_password = '' max_minsize = 1000 gaplimit = 6
txfee
is the maker's contribution to the miner fees (still paid by the taker). To reduce the minimum offer amount forswreloffer
set it to 0.cjfee_a
is the fixed coinjoin fee to be earned when usingswabsoffer
cjfee_r
is the relative fee when usingswreloffer
. Specified as the fraction of the used amount.max_minsize
specifies the minimum offer size in satoshis (this is the minimum size the UTXO will end up to be after participating in coinjoin)ordertype
sets either a relative (swreloffer
) or an absolute (swabsoffer
) coinjoin fee model
-
Once set up run:
(jmvenv) $ python yield-generator-basic.py wallet.jmdat
-
use the wallet tool:
(jmvenv) $ python wallet-tool.py wallet.jmdat history
add
-v 4
to the end of the commadn for a more detailed list. -
View the log of the transactions of the Yield Generator:
$ cat ~/joinmarket-clientserver/scripts/logs/yigen-statement.csv
pressq
to exit -
Display as a table in the terminal:
$ column -s, -t < ~/joinmarket-clientserver/scripts/logs/yigen-statement.csv | less -#2 -N -S
-
Monitor continously with:
$ tail -f -n 100 ~/joinmarket-clientserver/scripts/logs/yigen-statement.csv
Keep the offers running in the background with Tmux
-
Install on the RaspiBlitz:
$ sudo apt install tmux
-
Start:
$ tmux
-
Work in the terminal as described above.
Find a basic introduction at https://www.ocf.berkeley.edu/~ckuehl/tmux/ -
If the terminal is disconnected the processes in tmux keep running (as it is running on the Blitz) and can be returned to
-
when logged in after a disconnection run:
$ tmux a
to pick up where left off
-
Activate Tor in the SERVICE menu of the RaspiBlitz if not running already
-
Edit the
joinmarket.cfg
$ nano joinmarket.cfg
-
Comment out the clearnet communication channels (place a
#
on the front of the line - means it wont be used by the script):[MESSAGING:server1] #host = irc.cyberguerrilla.org ... [MESSAGING:server2] #host = irc.darkscience.net
-
Uncomment (remove the
#
from front of) the entries related for Tor:#for tor host = epynixtbonxn4odv34z4eqnlamnpuwfz6uwmsamcqd62si7cbix5hqad.onion socks5 = true ... #for tor host = darksci3bfoka7tw.onion socks5 = true
-
Latest codebase:
https://github.com/JoinMarket-Org/joinmarket-clientserver -
Installation instructions:
https://github.com/JoinMarket-Org/joinmarket-clientserver#quickstart---recommended-installation-method-linux-only -
Tmux will be included in the next release of the RaspiBlitz:
raspiblitz/raspiblitz#793 -
Discuss JoinMarket usage on the RaspiBlitz in
raspiblitz/raspiblitz#842 -
More links and info in 6102bitcoin/CoinJoin-Research:
https://github.com/6102bitcoin/CoinJoin-Research/blob/master/CoinJoin_Implementations/11_JoinMarket-JoinMarket-Org/summary.md -
Check the guide for the RaspiBolt by @kristapsk:
https://github.com/kristapsk/raspibolt-extras/blob/master/joinmarket.md