If you want to get up and running as an active signer as quickly as possible. Here is a list of the commands you need to run and actions to take.
If you are not familiar with how signing works yet, be sure to check out the Stackers and Signing concept guide.
If you would like a more detailed walkthrough of all of these steps, take a look at the Running a Signer guide.
Step 1 - Prerequisites
# Create the required directoriesmkdir-p~/stacks-signer/datamkdir-p~/stacks-node/data# Install needed packagessudoaptinstall-ynpmwgetunzipjqtar# Install Stacks CLI globallynpminstall--global@stacks/cli# Generate a new account and store details in a filestxmake_keychain|jq>~/stacks-signer/keychain.json
# Create the required directoriesmkdir-p~/stacks-signer/datamkdir-p~/stacks-node/data# Install needed packagessudoaptinstall-ynpmwgetunzipjqtar# Install Stacks CLI globallynpminstall--global@stacks/cli# Generate a new account and store details in a file# '-t' option makes this a testnet accountstxmake_keychain-t|jq>~/stacks-signer/keychain.json
The account file previously created looks like this:
Official binaries are available from the Stacks Core releases page on Github. Each release includes pre-built binaries. Download the latest signer release ZIP file for your server’s architecture and decompress it. Inside of that folder is a stacks-signer binary.
Assuming a Linux x64 glibc machine, the commands to download and uncompress the signer binary look like this:
# Enter the signer directorycd~/stacks-signer# Download the signer binary zipwgethttps://github.com/stacks-network/stacks-core/releases/download/signer-3.1.0.0.0.0/linux-glibc-x64.zip# Unzip the signer binary archiveunziplinux-glibc-x64.zip
Create the configuration file
Create the configuration file required to start the signer (be sure to replace <your_token> and <your_private_key> with your auth token and private key values):
# Set environment variablesAUTH_TOKEN=<your_token># Used for signer-node authenticationPRIVATE_KEY=<your_private_key># privateKey from Step 1, this is the signer's private key# Create the signer's configuration filecat<<EOF>~/stacks-signer/signer-config.tomlnode_host = "127.0.0.1:20443"endpoint = "127.0.0.1:30000"network = "mainnet"db_path = "$HOME/stacks-signer/data/signer.sqlite"auth_password = "$AUTH_TOKEN"stacks_private_key = "$PRIVATE_KEY"metrics_endpoint = "127.0.0.1:9154"block_proposal_timeout_ms = 180000EOF
# Set environment variablesAUTH_TOKEN=<your_token># Used for signer-node authenticationPRIVATE_KEY=<your_private_key># privateKey from Step 1, this is the signer's private key# Create the signer's configuration filecat<<EOF>~/stacks-signer/signer-config.tomlnode_host = "127.0.0.1:20443"endpoint = "127.0.0.1:30000"network = "testnet"db_path = "$HOME/stacks-signer/data/signer.sqlite"auth_password = "$AUTH_TOKEN"stacks_private_key = "$PRIVATE_KEY"metrics_endpoint = "127.0.0.1:9154"block_proposal_timeout_ms = 180000EOF
Verify the setup
To ensure the signer has been set up correctly, you can run the following commands:
# Verify the signer's version~/stacks-signer/stacks-signer --version# Output:stacks-signerstacks-signer3.1.0.0.0.0 (release/3.1.0.0.0.0:dd1ebe6, releasebuild,linux [x86_64])# Verify the config file~/stacks-signer/stacks-signer check-config -c ~/stacks-signer/signer-config.toml # Output:Config:Stacksnodehost:127.0.0.1:20443Signerendpoint:127.0.0.1:30000Stacksaddress:SP1G...# address from keychain filePublickey:03a3...# publicKey from keychain fileNetwork:mainnet# or testnetChainID:0x1# or 0x80000000 for testnetDatabasepath:/home/admin/stacks-signer/data/signer.sqliteMetricsendpoint:127.0.0.1:9154
Start the signer
If the outputs of the previous commands are correct, you can proceed and start the signer:
~/stacks-signer/stacks-signer run -c ~/stacks-signer/signer-config.toml
Step 3a - Set up a Bitcoin node (Optional but strongly recommended)
In order to optimize signer health and performance, we highly recommend setting up your own Bitcoin node rather than relying on a third-party node.
Official binaries are available from the Stacks Core releases page on Github. Each release includes pre-built binaries. Download the latest node release ZIP file for your server’s architecture and decompress it. Inside of that folder is a stacks-node binary.
Assuming a Linux x64 glibc machine, the commands to download and uncompress the node binary look like this:
# Enter the node directorycd~/stacks-node# Download the node binary zipwgethttps://github.com/stacks-network/stacks-core/releases/download/3.1.0.0.0/linux-glibc-x64.zip# Unzip the node binary archiveunziplinux-glibc-x64.zip
Create the configuration file
Create the configuration file required to start the node (be sure to replace <your_token> with your auth token value):
For mainnet, we strongly recommended that you run your own bitcoin node (you can follow this guide) in order to ensure you have no connection issues when downloading bitcoin blocks. A hosted bitcoin node may cause your stacks node to fall behind tip and remain unsynced.
If you run your own bitcoin node, you'll have to update peer_host and optionally add rpc_port, peer_port, username and password fields under the [burnchain] section of the node's configuration file.
# Set environment variablesAUTH_TOKEN=<your_token># Used for signer-node authentication, same token as the one set up in the signer configuration# Create the node's configuration filecat<<EOF>~/stacks-node/node-config.toml[node]working_dir = "$HOME/stacks-node/data"rpc_bind = "127.0.0.1:20443"p2p_bind = "0.0.0.0:20444"prometheus_bind = "127.0.0.1:9153" bootstrap_node = "02196f005965cebe6ddc3901b7b1cc1aa7a88f305bb8c5893456b8f9a605923893@seed.mainnet.hiro.so:20444,02539449ad94e6e6392d8c1deb2b4e61f80ae2a18964349bc14336d8b903c46a8c@cet.stacksnodes.org:20444,02ececc8ce79b8adf813f13a0255f8ae58d4357309ba0cedd523d9f1a306fcfb79@sgt.stacksnodes.org:20444,0303144ba518fe7a0fb56a8a7d488f950307a4330f146e1e1458fc63fb33defe96@est.stacksnodes.org:20444"stacker = true[burnchain]chain = "bitcoin"mode = "mainnet"peer_host = "bitcoin.mainnet.stacks.org"[connection_options]auth_token = "$AUTH_TOKEN"[[events_observer]]endpoint = "127.0.0.1:30000"events_keys = ["stackerdb", "block_proposal", "burn_blocks"]EOF
# Set environment variablesAUTH_TOKEN=<your_token># Used for signer-node authentication, same token as the one set up in the signer configuration# Create the node's configuration filecat<<EOF>~/stacks-node/node-config.toml[node]working_dir = "$HOME/stacks-node/data"rpc_bind = "127.0.0.1:20443"p2p_bind = "0.0.0.0:20444"bootstrap_node = "029266faff4c8e0ca4f934f34996a96af481df94a89b0c9bd515f3536a95682ddc@seed.testnet.hiro.so:30444"prometheus_bind = "127.0.0.1:9153" stacker = truepox_sync_sample_secs = 30always_use_affirmation_maps = truerequire_affirmed_anchor_blocks = true[burnchain]mode = "krypton"peer_host = "bitcoin.regtest.hiro.so"peer_port = 18444pox_prepare_length = 100pox_reward_length = 900[connection_options]auth_token = "$AUTH_TOKEN"private_neighbors = false[[events_observer]]endpoint = "127.0.0.1:30000"events_keys = ["stackerdb", "block_proposal", "burn_blocks"][[ustx_balance]]address = "ST2QKZ4FKHAH1NQKYKYAYZPY440FEPK7GZ1R5HBP2"amount = 10000000000000000[[ustx_balance]]address = "ST319CF5WV77KYR1H3GT0GZ7B8Q4AQPY42ETP1VPF"amount = 10000000000000000[[ustx_balance]]address = "ST221Z6TDTC5E0BYR2V624Q2ST6R0Q71T78WTAX6H"amount = 10000000000000000[[ustx_balance]]address = "ST2TFVBMRPS5SSNP98DQKQ5JNB2B6NZM91C4K3P7B"amount = 10000000000000000[[burnchain.epochs]]epoch_name = “1.0”start_height = 0[[burnchain.epochs]]epoch_name = "2.0"start_height = 0[[burnchain.epochs]]epoch_name = "2.05"start_height = 1[[burnchain.epochs]]epoch_name = "2.1"start_height = 2[[burnchain.epochs]]epoch_name = "2.2"start_height = 3[[burnchain.epochs]]epoch_name = "2.3"start_height = 4[[burnchain.epochs]]epoch_name = "2.4"start_height = 5[[burnchain.epochs]]epoch_name = "2.5"start_height = 6[[burnchain.epochs]]epoch_name = "3.0"start_height = 56_457epoch_name = “3.1”start_height = 77_770EOF
Optional: Start the node with a data archive
You can download a chainstate archive in order to quickly sync your node, otherwise it will take a long time to get up-to-date with the other nodes.
# Enter the node's datadircd~/stacks-node/data# Download the archivewgethttps://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz# Decompress the archivetar-xvfmainnet-stacks-blockchain-latest.tar.gz# Remove the archivermmainnet-stacks-blockchain-latest.tar.gz
# Enter the node's datadircd~/stacks-node/data# Download the archivewgethttps://archive.hiro.so/testnet/stacks-blockchain/testnet-stacks-blockchain-latest.tar.gz# Decompress the archivetar-xvftestnet-stacks-blockchain-latest.tar.gz# Remove the archivermtestnet-stacks-blockchain-latest.tar.gz
Verify the setup
To ensure the node has been set up correctly, you can run the following commands: