dcrstakepool is a deprecated project and support will soon be removed from wallets. All VSP operators should switch to vspd. Visit the Decred Blog to find out more about this change.
dcrstakepool is a web application which coordinates generating 1-of-2 multisig addresses on a pool of dcrwallet servers so users can purchase proof-of-stake tickets on the Decred network and have the pool of wallet servers vote on their behalf when the ticket is selected.
NB: In late 2018, a proposal was approved by stakeholders to rename "Stakepool" to "Voting Service Provider", a.k.a. "VSP". These names are used interchangably in this repository.
A test harness is provided in ./harness.sh
. The test harness uses tmux to start
a dcrd node, multiple dcrwallet and stakepoold instances, and finally a dcrstakepool
instance. It uses hard-coded wallet seeds and pubkeys, and as a result it is only
suitable for use on testnet. Further documentation can be found in ./harness.sh
.
Building or updating from source requires the following build dependencies:
Building or updating from source requires only an installation of Go
(instructions). It is recommended to add
$GOPATH/bin
to your PATH
at this point.
To build and install from a checked-out repo, run go install . ./backend/stakepoold
in the repo's root directory.
GO111MODULE=on
environment variable if building from within
GOPATH
.Please defer to the 1.5.0 release notes.
These instructions assume you are familiar with dcrd/dcrwallet.
Create basic dcrd/dcrwallet/dcrctl config files with usernames, passwords, rpclisten, and network set appropriately within them or run example commands with additional flags as necessary.
Build/install dcrd and dcrwallet from latest master.
Run dcrd instances and let them fully sync.
$ dcrwallet --create
$ dcrwallet
$ dcrctl --wallet createnewaccount stakepoolfees
$ dcrctl --wallet getmasterpubkey stakepoolfees
$ dcrctl --wallet accountsyncaddressindex stakepoolfees 0 10000
$ ssh walletserver1
$ dcrwallet --create
$ cp sample-dcrwallet.conf dcrwallet.conf
$ vim dcrwallet.conf
$ scp dcrwallet.conf walletserver1:~/.dcrwallet/
$ ssh walletserver1
$ dcrwallet
$ ssh walletserver1
$ dcrctl --wallet getmasterpubkey default
$ ssh frontendserver
$ mysql -uroot -p
MySQL> CREATE USER 'stakepool'@'localhost' IDENTIFIED BY 'password';
MySQL> GRANT ALL PRIVILEGES ON *.* TO 'stakepool'@'localhost' WITH GRANT OPTION;
MySQL> FLUSH PRIVILEGES;
MySQL> CREATE DATABASE stakepool;
$ mkdir .stakepoold
$ cp sample-stakepoold.conf .stakepoold/stakepoold.conf
$ vim .stakepoold/stakepoold.conf
$ scp -r .stakepoold walletserver1:~/
$ scp -r .stakepoold walletserver2:~/
$ cd backend/stakepoold/
$ go build
$ scp stakepoold walletserver1:~/
$ scp stakepoold walletserver2:~/
$ ssh frontendserver
$ mkdir ~/.dcrstakepool
$ cd ~/.dcrstakepool
$ scp walletserver1:~/.dcrwallet/rpc.cert wallet1.cert
$ scp walletserver2:~/.dcrwallet/rpc.cert wallet2.cert
$ scp walletserver1:~/.stakepoold/rpc.cert stakepoold1.cert
$ scp walletserver2:~/.stakepoold/rpc.cert stakepoold2.cert
$ cp sample-dcrstakepool.conf dcrstakepool.conf
$ vim dcrstakepool.conf
$ scp dcrstakepool.conf frontendserver:~/.dcrstakepool/
$ go build
$ scp -r ../dcrstakepool frontendserver:~/
Log into all servers and run stakepoold one at a time.
$ ssh walletserver1
$ ./stakepoold
Log into your frontend and run dcrstakepool
$ ssh frontendserver
$ cd dcrstakepool
$ ./dcrstakepool
To run dcrstakepool
from another folder, such as /opt/dcrstakepool
, it is
necessary to copy (1) the dcrstakepool
executable generated by go build
, (2)
the public
folder, and (3) the views
folder into the other folder.
By default, dcrstakepool
looks for the public
and views
folders in the
same parent directory as the dcrstakepool
executable. If you wish to run
dcrstakepool from a different directory you will need to change publicpath
and templatepath from their relative paths to an absolute path.
If you are modifying templates, sending the USR1 signal to the dcrstakepool process will trigger a template reload.
The RPC interface between dcrstakepool and stakepoold is defined in
./backend/stakepoold/rpc/api.proto
.
If modifications are made to this file, api.pb.go
needs to be regenerated
using the script ./backend/stakepoold/rpc/regen.sh
.
The following tools are required to run the script:
dcrstakepool will connect to the database or error out if it cannot do so.
dcrstakepool will create the stakepool.Users table automatically if it doesn't exist.
dcrstakepool attempts to connect to all of the stakepoold servers on startup or error out if it cannot do so.
dcrstakepool takes a user's pubkey, validates it, calls getnewaddress on all the wallet servers, then createmultisig, and finally importscript. If any of these RPCs fail or returns inconsistent results, the RPC client built-in to dcrstakepool will shut down and will not operate until it has been restarted. Wallets should be verified to be in sync before restarting.
User API Tokens have an issuer field set to baseURL from the configuration file. Changing the baseURL requires all API Tokens to be re-generated.
If a user pays an incorrect fee, login as an account that meets the adminUserIps and adminUserIds restrictions and click the 'Add Low Fee Tickets' link in the menu. You will be presented with a list of tickets that are suitable for adding. Check the appropriate one(s) and click the submit button. Upon success, you should see the stakepoold logs reflect that the new tickets were processed.
If a user pays an incorrect fee you may add their tickets like so (requires dcrd
running with txindex=1
):
dcrctl --wallet stakepooluserinfo "MultiSigAddress" | grep -Pzo '(?<="invalid": \[)[^\]]*' | tr -d , | xargs -Itickethash dcrctl --wallet getrawtransaction tickethash | xargs -Itickethex dcrctl --wallet addticket "tickethex"
MySQL should be backed up often and regularly (probably at least hourly). Backups should be transferred off-site. If using binary backups, do a test restore. For .sql files, verify visually.
A monitoring system with alerting should be pointed at dcrstakepool and tested/verified to be operating properly. There is a hidden /status page which throws 500 if the RPC client is shutdown. If your monitoring system supports it, add additional points of verification such as: checking that the /stats page loads and has expected information in it, create a test account and setup automated login testing, etc.
Wallets should never be used for anything else (they should always have a balance of 0).
Always keep at least one wallet voting while performing maintenance / restoration!
To get help with dcrstakepool
please create a
GitHub issue
or the join the Decred community
using your preferred chat platform.
dcrstakepool is licensed under the copyfree MIT/X11 and ISC Licenses.