For more on the technical details of mining, please review the mining guide
The following is an abridged version of the walkthrough here, written for a Linux system. If you're on Windows or MacOS, there will be some slight modifications needed (PR's welcome!).
If you're interested in mining on the Stacks mainnet, you can find instructions on how to do that here:
To participate as a miner on testnet, you must have access to a testnet bitcoin node with a wallet (and the wallet's private key). One way to accomplish this is to run bitcoin locally.
First, download a bitcoin binary, or build from source
:::tip It is recommened to use a persistent location for the chainstate, in the steps below we're using /bitcoin
:::
Next, update the bitcoin configuration:
- optional but recommended: Use a persistent directory to store the Bitcoin chainstate, i.e.
datadir=/bitcoin
- optional but recommended: Update the
rpcallowip
value to only allow127.0.0.1
, or the stacks miner IPv4 - Modify the
rpcuser
andrpcpassword
values from the defaults below - Store the following configuration somewhere on your filesystem (ex:
$HOME/bitcoin.conf
)
server=1
testnet=1
disablewallet=0
datadir=/bitcoin
rpcuser=btcuser
rpcpassword=btcpass
rpcallowip=0.0.0.0/0
dbcache=512
banscore=1
rpcthreads=256
rpcworkqueue=256
rpctimeout=100
txindex=1
[test]
bind=0.0.0.0:18333
rpcbind=0.0.0.0:18332
rpcport=18332
Finally, start bitcoind as follows:
bitcoind -conf=$HOME/bitcoin.conf
:::note It will take a few hours for the node to synchronize with Bitcoin testnet. :::
While it's syncing, you can track the progress with bitcoin-cli
or the logfile (will be located where the chainstate is stored, i.e. /bitcoin/testnet3/debug.log
):
$ bitcoin-cli \
-rpcconnect=localhost \
-rpcport=18332 \
-rpcuser=btcuser \
-rpcpassword=btcpass \
getblockchaininfo | jq .blocks
2417570
First, download a stacks blockchain binary, or build from source
There may be some extra requirements to building, defined here
:::tip It is recommened to use a persistent location for the chainstate, in the steps below we're using /stacks-blockchain
:::
First, a keychain needs to be generated. With this keychain, we'll get some testnet BTC from a faucet, and then use that BTC to start mining.
To create a keychain, the simplest way is to use the stacks-cli with the make_keychain
command.
npx @stacks/cli make_keychain -t 2>/dev/null | jq -r
After this runs, you should see some JSON printed to the screen that looks like this:
{
"mnemonic": "exhaust spin topic distance hole december impulse gate century absent breeze ostrich armed clerk oak peace want scrap auction sniff cradle siren blur blur",
"keyInfo": {
"privateKey": "2033269b55026ff2eddaf06d2e56938f7fd8e9d697af8fe0f857bb5962894d5801",
"address": "STTX57EGWW058FZ6WG3WS2YRBQ8HDFGBKEFBNXTF",
"btcAddress": "mkRYR7KkPB1wjxNjVz3HByqAvVz8c4B6ND",
"index": 0
}
}
:::warning Do not lose this information - we'll need to use the privateKey
and btcAddress
fields in later steps. :::
The above btcAddress
(mkRYR7KkPB1wjxNjVz3HByqAvVz8c4B6ND) will then need to be imported into the bitcoin testnet network. :::note Be sure to replace <btcAddress from JSON above>
with the bitcoin address in the "Generate a keychain" step :::
bitcoin-cli \
-rpcport=18332 \
-rpcuser=btcuser \
-rpcpassword=btcpassword \
importaddress <btcAddress from JSON above>
Once imported, we need to get some testnet BTC to that address. Grab the btcAddress
field, and paste it into this Bitcoin testnet faucet. You'll be sent 0.01
testnet BTC to that address.
Now, we need to configure our node to use this Bitcoin keychain. Copy the sample testnet miner config to your local machine in a memorable location like $HOME/testnet-miner-conf.toml
.
Now, grab your privateKey
from earlier when you ran the make_keychain
command. Replace the seed
and local_peer_seed
field with your private key. Save and close this configuration file.
Next, update the bitcoin configuration:
- optional but recommended: Use a persistent directory to store the Stacks chainstate, i.e.
working_dir = "/stacks-blockchain"
- From the
make_keychain
step, modify theseed
andlocal_peer_seed
values withprivatekey
- Store the following configuration somewhere on your filesystem (ex:
$HOME/testnet-miner-conf.toml
)
[node]
working_dir = "/stacks-blockchain"
rpc_bind = "0.0.0.0:20443"
p2p_bind = "0.0.0.0:20444"
seed = "<keychain privateKey>"
local_peer_seed = "<keychain privateKey>"
miner = true
bootstrap_node = "047435c194e9b01b3d7f7a2802d6684a3af68d05bbf4ec8f17021980d777691f1d51651f7f1d566532c804da506c117bbf79ad62eea81213ba58f8808b4d9504ad@testnet.stacks.co:20444"
wait_time_for_microblocks = 10000
[burnchain]
chain = "bitcoin"
mode = "xenon"
peer_host = "127.0.0.1"
username = "<bitcoin config rpcuser>"
password = "<bitcoin config rpcpassword>"
rpc_port = 18332
peer_port = 18333
[[ustx_balance]]
address = "ST2QKZ4FKHAH1NQKYKYAYZPY440FEPK7GZ1R5HBP2"
amount = 10000000000000000
[[ustx_balance]]
address = "ST319CF5WV77KYR1H3GT0GZ7B8Q4AQPY42ETP1VPF"
amount = 10000000000000000
[[ustx_balance]]
address = "ST221Z6TDTC5E0BYR2V624Q2ST6R0Q71T78WTAX6H"
amount = 10000000000000000
[[ustx_balance]]
address = "ST2TFVBMRPS5SSNP98DQKQ5JNB2B6NZM91C4K3P7B"
amount = 10000000000000000
To run your miner, run this in the command line:
stacks-node start --config=$HOME/testnet-miner-conf.toml
Your node should start. It will take some time to sync, and then your miner will be running.
In case you are running into issues or would like to see verbose logging, you can run your node with debug logging enabled. In the command line, run:
STACKS_LOG_DEBUG=1 stacks-node start --config=$HOME/testnet-miner-conf.toml
Alternatively, you can run a Stacks testnet miner with Docker.
:::caution Ensure you have Docker installed :::
Generate a keychain:
docker run -i node:14-alpine npx @stacks/cli make_keychain 2>/dev/null | jq -r
Now, we need to get some tBTC. Grab the btcAddress
field, and paste it into this Bitcoin testnet faucet. You'll be sent 0.01
tBTC to that address.
Use the steps oulined above to create the configuration file
:::info The ENV VARS RUST_BACKTRACE
and STACKS_LOG_DEBUG
are optional. If removed, debug logs will be disabled :::
docker run -d \
--name stacks_miner \
--rm \
--network host \
-e RUST_BACKTRACE="full" \
-e STACKS_LOG_DEBUG="1" \
-v "$HOME/testnet-miner-conf.toml:/src/stacks-node/testnet-miner-conf.toml" \
-v "/stacks-blockchain:/stacks-blockchain" \
-p 20443:20443 \
-p 20444:20444 \
blockstack/stacks-blockchain:latest \
/bin/stacks-node start --config /src/stacks-node/testnet-miner-conf.toml
You can review the node logs with this command:
docker logs -f stacks_miner
In addition, you're also able to run a Stacks miner in a Kubernetes cluster using the stacks-blockchain Helm chart.
Ensure you have the following prerequisites installed:
Use the steps outlined above
To install the chart with the release name my-release
and run the node as a miner:
minikube start # Only run this if standing up a local Kubernetes cluster
helm repo add blockstack https://charts.blockstack.xyz
helm install my-release blockstack/stacks-blockchain \
--set config.node.miner=true \
--set config.node.seed="replace-with-your-privateKey-from-generate-keychain-step" \
You can review the node logs with this command:
kubectl logs -l app.kubernetes.io/name=stacks-blockchain
For more information on the Helm chart and configuration options, please refer to the chart's homepage.