For the complete documentation index, see llms.txt. This page is also available as Markdown.

Mine Mainnet Stacks Tokens

Introduction

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!).

Running a Bitcoin Mainnet Full Node

To participate as a miner on mainnet, you must have access to a mainnet 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 (there may be some extra requirements to building, defined here). Use Bitcoin Core 25.0 or newer - the wallet commands below are tested against every major version from 25 through 31.

If you want to learn more about the technical details of mining, please review the mining guide:

Tip: It is recommended to use a persistent location for the chainstate, in the steps below we're using /bitcoin.

Update the Bitcoin Configuration File

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 allow 127.0.0.1, or the stacks miner IPv4.

  • Modify the rpcuser and rpcpassword values from the defaults below.

  • Store the following configuration somewhere on your filesystem (ex: $HOME/bitcoin.conf).

Start Bitcoin

Finally, start bitcoind as follows (adjust the conf path to where it was created in the previous step, i.e. $HOME/bitcoin.conf):

Note: It will take a few hours for the node to synchronize with Bitcoin Mainnet.

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/debug.log):

Running a Stacks Blockchain miner

First, download the stacks-core 4.0.1 binary, or build from source (there may be some extra requirements to building, defined here).

Tip: It is recommended to use a persistent location for the chainstate, in the steps below we're using /stacks-blockchain.

Generate a keychain

First, a keychain needs to be generated. With this keychain, we'll purchase some BTC from a cryptocurrency exchange, 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.

After this runs, you should see some JSON printed to the screen that looks like this:

The above wif (rohCie2ein2chaed9kaiyoo6zo1aeQu1yae4phooShov2oosh4ox) will then need to be imported into the bitcoin mainnet network.

Next, a bitcoin wallet is created:

The wallet only needs to watch the miner's addresses: the stacks node signs its bitcoin transactions itself, so no private key is ever stored in bitcoind (disable_private_keys=true above). Your wif (bitcoin private key) is used once, in the getdescriptorinfo call below, to derive the watch-only descriptor.

Note: Be sure to replace <wif from JSON above> with the wif value in the Generate a keychain step.

First, convert the wif into its public descriptor:

Then import the descriptor value returned above into the miner wallet - paste it verbatim, it already ends with its #checksum. A combo(...) descriptor covers both the legacy and the segwit address of the key, so the same wallet works whether or not the miner runs with segwit = true:

The expected output is [{"success": true}] - importdescriptors reports failures inside this JSON rather than with a non-zero exit code.

Note: timestamp: "now" skips the rescan, which is what you want for a freshly generated keychain. If the key has already received coins, use "timestamp": 0 instead to rescan the chain for its history - this may take a while.

Note: to instead let bitcoind hold the private key - e.g. to manage the mined funds with bitcoin-cli - create the wallet without disable_private_keys=true and import combo(<wif from JSON above>)#<checksum>, using the top-level checksum field returned by getdescriptorinfo (not the checksum embedded in its descriptor field).

After the import has completed successfully, you can check that the address is imported with getaddressinfo - ismine should be true.

Once imported, we need to get some BTC to that address. You should be able to transfer BTC to this address using a cryptocurrency exchange such as Coinbase, Binance, or Kraken.

Update the Stacks Blockchain Configuration File

Now, we need to configure our node to use this Bitcoin keychain. Copy the sample mainnet miner config to your local machine in a memorable location like $HOME/mainnet-miner-conf.toml.

Next, update the stacks 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 the seed and mining_key values with privatekey

  • Required: set wallet_name to the bitcoin wallet you created above (miner)

  • Store the following configuration somewhere on your filesystem (ex: $HOME/mainnet-miner-conf.toml)

Start the Stacks Blockchain

To run your miner, run this in the command line:

Your node should start. It will take some time to sync, and then your miner will be running.

Enable Debug Logging

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:

Optional: Running a Stacks Blockchain miner with Docker

Alternatively, you can run a Stacks mainnet miner with Docker.

Generate a Keychain and Get Some Tokens

Generate a keychain:

We need to get some BTC to that address. You should be able to transfer BTC to this address using a cryptocurrency exchange such as Coinbase, Binance, or Kraken.

Update Stacks Blockchain Docker Configuration File

Use the steps outlined above to create the configuration file.

Start the Stacks Blockchain miner with Docker

Info: The ENV VARS RUST_BACKTRACE and STACKS_LOG_DEBUG are optional. If removed, debug logs will be disabled.

You can review the node logs with this command:

Optional: Running in Kubernetes with Helm

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:

  • Docker

  • minikube (Only needed if standing up a local Kubernetes cluster)

  • kubectl

  • helm

Generate keychain and get some tokens

Use the steps outlined above

Install the chart and run the miner

To install the chart with the release name my-release and run the node as a miner:

The miner wallet must already exist on the bitcoind instance the chart points at (config.burnchain.peer_host and its RPC credentials).

You can review the node logs with this command:

For more information on the Helm chart and configuration options, please refer to the chart's homepage.

Last updated

Was this helpful?