You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
AdamISZ 90607ed961
Merge #262: Allow more specific --python targets for install.sh
7 years ago
docs release notes and docs for 0.5.0 7 years ago
jmbase release notes and docs for 0.5.0 7 years ago
jmbitcoin remove unused bci.py module 7 years ago
jmclient Merge #249: Write pid to wallet lockfile, display it when lock already in place 7 years ago
jmdaemon release notes and docs for 0.5.0 7 years ago
pubkeys add undeath's pgp key 7 years ago
scripts Don't show password when loading wallet in JoinmarketQt 7 years ago
test adapt install.sh to Qt with python3 7 years ago
.coveragerc remove slowaes 7 years ago
.gitignore Convert jmclient to py3 style 7 years ago
.travis.yml adapt install.sh to Qt with python3 7 years ago
LICENSE Initial commit 9 years ago
README.md adapt install.sh to Qt with python3 7 years ago
conftest.py Revert "Revert "Python 3 style conversion"" 7 years ago
install.sh Allow more specific --python targets for install.sh 7 years ago
requirements-dev.txt add flake8 config and enable in travis 7 years ago
setup.cfg remove slowaes 7 years ago
setupall.py add setupall.py --all mode 7 years ago

README.md

joinmarket-clientserver

Joinmarket refactored to separate client and backend operations

Joinmarket is coinjoin software, and includes a wallet, which requires Bitcoin Core as backend (version 0.16.3, 0.17.0 or later).

Wallet features

  • Segwit addresses in the backward compatible form (start with 3)
  • Multiple "mixdepths" or pockets (by default 5) for better coin isolation
  • Ability to spend directly, or with coinjoin; export private keys; BIP49 compatible seed (Trezor, Samourai etc.) and mnemonic extension option
  • Fine-grained control over bitcoin transaction fees
  • Can run sequence of coinjoins in automated form, either auto-generated (see tumbler.py) or self-generated sequence.
  • Can specify exact amount of coinjoin (figures from 0.01 to 30.0 btc and higher are practical), can choose time and number of counterparties
  • Can run passively to receive small payouts for taking part in coinjoins (see "Maker" and "yield-generator" in docs)
  • GUI to support Taker role, including tumbler/automated coinjoin sequence.

Quickstart

Once you've downloaded this repo, either as a zip file, and extracted it, or via git clone:

./install.sh -p python3
(follow instructions on screen; provide sudo password when prompted)
source jmvenv/bin/activate
cd scripts

(You can omit -p python3 if you want to use Python2. You can also add --develop as an extra flag to install.sh to make the Joinmarket code editable in-place.)

For the Qt GUI, pass the --with-qt flag to install.sh as well :

./install.sh -p python3 --with-qt

Do note, Python 2 is incompatible with the Qt GUI.

You should now be able to run the scripts like python wallet-tool.py etc., just as you did in the previous Joinmarket version.

Alternative to this "quickstart" (including for MacOS): follow the install guide.

Usage

If you are new, follow and read the links in the usage guide.

If you are running Joinmarket-Qt, you can instead use the walkthrough to start.

If you used the old version of Joinmarket, the notes in the scripts readme help to understand what has and hasn't changed about the scripts.

Joinmarket-Qt

Provides single join and multi-join/tumbler functionality (i.e. "Taker") only, in a GUI. NOTE: This is currently only available for Python3, not Python2 (due to bugs in the PySide2 Python2 implementation). It's possible but unlikely that the Python2 version will be fixed, but in any case Python2 will be deprecated at some point.

If binaries are built, they will be gpg signed and announced on the Releases page.

If you haven't used the --with-qt flag during installation with install.sh, then to run the script joinmarket-qt.py from the command line you will need to install two more packages. Use these 2 commands while the jmvenv virtual environment is activated:

pip install PySide2
pip install https://github.com/sunu/qt5reactor/archive/58410aaead2185e9917ae9cac9c50fe7b70e4a60.zip

After this, the command python joinmarket-qt.py from within the scripts subdirectory should work. There is a walkthrough for what to do next.

Notes on architectural changes (can be ignored)

Motivation: By separating the code which manages conversation with other Joinmarket participants from the code which manages this participant's Bitcoin wallet actions, we get a considerable gain at a minor cost of an additional layer: code dependencies for each part are much reduced, security requirements of the server/daemon layer are massively reduced (which can have several advantages such as it being more acceptable to distribute this layer as a binary), and client code can be written, implementing application-level logic (do join with coins X under condition X) using other Bitcoin libraries, or wallets, without knowing anything about Joinmarket's inter-participant protocol. An example is my work on the Joinmarket electrum plugin.

It also means that updates to the Bitcoin element of Joinmarket, such as P2SH and segwit, should have extremely minimal to no impact on the backend code, since the latter just implements communication of a set of formatted messages, and allows the client to decide on their validity beyond simply syntax.

Joinmarket's own messaging protocol is thus enforced only in the server/daemon.

The client and server currently communicate using twisted.protocol.amp, see AMP, and the specification of the communication between the client and server is isolated to this module. Currently the messaging layer of Joinmarket is IRC-only (but easily extensible, see here. The IRC layer is also implemented here using Twisted, reducing the complexity required with threading.

The "server" is just a daemon service that can be run as a separate process (see scripts/joinmarketd.py), or for convenience in the same process (the default for command line scripts).

TESTING

Instructions for developers for testing here. If you want to help improve the project, please have a read of this todo list.