/ ARTICLES

Monero Multisig Run-Through: Zero-to-MMS in an instant

Monero multi-signatures are daunting. To show how quickly one can actually get set, I extracted the gist from the corresponding user-guide and crafted what is likely the most concise Monero multisig-guide:

Install and configure PyBitmessage

Imagine the Bitmessage protocol as a common chat room where your Monero clients get together to communicate the required information for each step. We set it up as a daemon that monero-wallet-cli can use.

# Install required applications (example for Arch Linux)
sudo pacman -S python2 openssl git

# Download PyBitmessage
git clone https://github.com/Bitmessage/PyBitmessage.git
cd PyBitmessage

# Check if core dependencies are met.
# You may disregard any warnings about missing Qt.
python2 checkdeps.py

# Install PyBitmessage
python2 setup.py install --user

# Execute PyBitmessage once to generate config files
python2 ~/.local/bin/pybitmessage -h

# Enable daemon mode and disable Dandelion
[ -z $XDG_CONFIG_HOME ] && XDG_CONFIG_HOME="$HOME/.config"
echo 'daemon = true\n[network]\ndandelion = 0' >> ${XDG_CONFIG_HOME}/PyBitmessage/keys.dat

# Execute PyBitmessage
python2 ~/.local/bin/pybitmessage

# Generate your Bitmessage address
python_code='import xmlrpclib, json, time ;
api = xmlrpclib.ServerProxy("http://username:password@localhost:8442/") ;
print api.createRandomAddress("")'
transport_address=`echo ${python_code} | python2`
echo ${transport_address}

Maintaining the aforementioned chat-room analogy your transport address can be thought of your Bitmessage chat handle. In the next step we make the Monero client aware of this handle.

Set up a Multisig-Wallet (Alice’s Monero client)

The following commands have to be run in monero-wallet-cli.

Tell monero-wallet-cli to be less interactive

set ask-password 0
set inactivity-lock-timeout 0

Initialize Multisig

Declare your desired type of multisig and name the additional signers.

mms init 2/2 alice PUT_ALICES_TRANSPORT_ADDRESS_HERE
mms set auto-send 1
mms signer 2 bob
mms start_auto_config

With the last command you’ll be shown a token in the format mmsXXXXXXXX. Hand this token to Bob. He will need it in the following step.


Set up a Multisig-Wallet (Bob’s side)

Just like Alice, Bob needs to set up PyBitmessage (see above) and then generate his Bitmessage address like so:

python_code='import xmlrpclib, json, time ;
api = xmlrpclib.ServerProxy("http://username:password@localhost:8442/") ;
print api.createRandomAddress("")'
echo ${python_code} | python2

Tell Bob’s Monero client to be less interactive

set ask-password 0
set inactivity-lock-timeout 0

Initialize Multisig for Bob

Command the following, inserting the correct Bitmessage address and replacing mmsXXXXXXXX with the token received from Alice.

mms init 2/2 bob   PUT_BOBS_TRANSPORT_ADDRESS_HERE
mms set auto-send 1
mms auto_config mmsXXXXXXXX

Alice: Send necessary signer data to signers via Bitmessage

As soon as you see MMS received new message on Alice’s Monero client, command mms next there, twice:

mms next
mms next

Upon the first invocation the signer config will be sent. The second invocation sends the key set.

Bob: Send necessary data via Bitmessage

As soon as you see MMS received new message on Bob’s Monero client, command mms next there, three times:

mms next
mms next
mms next

The first invocation processes the signer config, the second sends the key set and the third completes the multisig address creation for Bob.

Alice: Send necessary signer data to signers via Bitmessage

Execute mms next once again:

mms next

This completes the multisig address creation for Alice.

Your first multisig transaction

By now the Monero address displayed should have changed to a new one that is the same on Bob’s and Alice’s client.

Once you fund that account by sending some XMR to it you can send money to others.

Use mms transfer RECIPIENT_ADDRESS AMOUNT to initiate the transfer. Then proceed by commanding mms next on either side until the command says that there’s nothing left to do.

Note that Bitmessage message delivery is typically delayed several minutes. When stuck, use mms list to see if a message for a step has yet to arrive.