Run a Testnet Node

Hardware Requirements

The minimum and recommended requirements to run a Testnet Persistence Node increase as it produces more blocks and more features are added. Thus, there are no exact hardware requirements that are permanently sufficient. A testnet node should always have redundant resources available.
  • Recommended:
    • 8 GB RAM
    • 100 GB SSD
    • 4 CPU
  • Operating System:
    • Recommended: Linux(x86_64)
    • Others: Windows/MacOS(x86)


To successfully run a Persistence Testnet Node, we need to install a few prerequirements. Because running the Persistence software depends on them, prerequirements are also known as dependencies.
We need to install and/or setup 5 dependencies - Go, jq, gcc, make, and git.

Install Go


  1. 1.
    Remove any previous installation:
    rm -rf /usr/local/go
  2. 2.
    Make sure you're installing the latest Go version by visiting this page
  3. 3.
    Download the latest version of Go (1.19.5 as of time of writing):
  4. 4.
    Extract the contents of the archive into /usr/local:
    tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
  5. 5.
    Set $GOPATH by copying & pasting the following commands in your terminal:
    echo "" >> ~/.profile
    echo "export GOPATH=$HOME/go" >> ~/.profile
    echo "export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin" >> ~/.profile
    source ~/.profile
    mkdir -p $GOPATH/bin
  6. 6.
    Check Go is installed correctly (sample output: go version go1.19.5 linux/amd64):
    go version


  1. 1.
    Dowload the latest version of Go for macOS:
  2. 2.
    Open the package file you downloaded and follow the prompts to install Go.
    The package installs the Go distribution to /usr/local/go. The package should put the /usr/local/go/bin directory in your PATH environment variable. You may need to restart any open Terminal sessions for the change to take effect.
  3. 3.
    Verify that you've installed Go by opening a command prompt and typing the following command (sample output: go version go1.19.5):
    go version

Install jq, git, gcc, and make

  1. 1.
    • Ubuntu: apt install jq git gcc make
    • macOS: brew install jq git gcc make
  2. 2.
    Verify Installations:
    • Verify jq: jq --version (sample output: jq-1.6)
    • Verify gcc : gcc --version (sample output: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0)
    • Verify make: make --version (sample output: GNU Make 4.2.1)
    • Verify git: git --version (sample output: git version 2.25.1)

Installation Steps

Install the persistenceCore Binary

Note The latest version available in the releases page might not be the one running on the test-core-1 chain. To ensure you're running the correct version, join the Discord Testnet Validator Announcements Channel.
  1. 1.
    Clone the persistenceCore repository:
    git clone $GOPATH/source/persistenceCore && cd $GOPATH/source/persistenceCore
  2. 2.
    Check what version is running on the test-core-1 chain by visiting the Discord Testnet Validators Announcements Channel.
  3. 3.
    Switch to the branch of the latest version (v6.0.0-rc5 as of time of writing):
    git checkout v6.0.0-rc5
  4. 4.
    Install the persistenceCore binary:
    make all
  5. 5.
    Verify installation (sample output: v6.0.0-rc5):
    persistenceCore version

Create or Import Key (XPRT Address)

  • Create key (ensure you safely store the mnemonic seed phrase):
    persistenceCore keys add <KEY_NAME>
  • Recover key (you'll be required to input your mnemonic seed phrase):
    persistenceCore keys add <KEY_NAME> --recover
  • Verify the key was created successfully:
    persistenceCore keys list

Create and Sync the Node

  1. 1.
    Initialize the node (moniker = node name):
    persistenceCore init <MONIKER> --chain-id="test-core-1" # e.g. persistenceCore init "Persistence Node" --chain-id="test-core-1"
  2. 2.
    Download the test-core-1 genesis file:
    cd ~/.persistenceCore/config && wget -O genesis.json
  3. 3.
    Use StateSync to sync with the rest of the nodes. Follow the step-by-step guide below:
    • Run the following command and copy the values of trust_height and trust_hash. They are required in the next steps.
      curl -s | jq '.result .sync_info | {trust_height: .latest_block_height, trust_hash: .latest_block_hash} | values'
    • Open config:
      nano ~/.persistenceCore/config/config.toml
    • Replace the existing settings in the opened file with the following:
      seeds = "[email protected]"
      persistent_peers = "[email protected]:26656"
      enable = true
      rpc_servers = ","
      trust_height = XXXXXXX # Replace with the value copied in the previous step
      trust_hash = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # Replace with the value copied in the previous step
      trust_period = "112h0m0s"
    • Make sure you replace trust_height and trust_hash values with the ones you've copied in the previous step.
  4. 4.
    Open the app.toml file (application-related configuration file):
    nano ~/.persistenceCore/config/app.toml
  5. 5.
    Change minimum-gas-prices to minimum-gas-prices = "0.005uxprt"
  6. 6.
    Start the node:
    persistenceCore start
  7. 7.
    Because we used StateSync to sync with the other nodes, it shouldn't take more than 10 minutes to complete. In the meantime, a lot of output messages will pop one after another.
  8. 8.
    When the node is completely synced, you should observe a similar output:
    11:28PM INF received complete proposal block hash=AE7196316065BC778E2BA5AFD1626C06CA2113B4F67DB2F4052B98700FD4B982 height=9305912 module=consensus
    11:28PM INF finalizing commit of block hash={} height=9305912 module=consensus num_txs=0 root=7B6B6A7C6D2CC68F266086794995E52F321B69FCA9530220093C47EC383278D0
    11:28PM INF minted coins from module account amount=8173386uxprt from=mint module=x/bank
    11:28PM INF executed block height=9305912 module=state num_invalid_txs=0 num_valid_txs=0
    11:28PM INF commit synced commit=436F6D6D697449447B5B3235312031313220323236203434203735203139322031362036312031373620373020323138203130332031383220313233203134302032332031353620313032203133392033342031393020323220343920313230203137322038203130372032313720313835203135322038332036345D3A3844464633387D
    11:28PM INF committed state app_hash=FB70E22C4BC0103DB046DA67B67B8C179C668B22BE163178AC086BD9B9985340 height=9305912 module=state num_txs=0
    11:28PM INF indexed block exents height=9305912 module=txindex
    Alternatively, you can use the following command (response must be false):
    curl http://localhost:26657/status | jq -r ".result.sync_info.catching_up"

Node operations

Upgrade the Node's Software