TAC currently has two active testnet environments:

NetworkChain IDStatusVersionNotes
Saint Petersburg Testnettacchain_2391-1Activev0.0.8Newer testnet with 2s block time
Turin Testnettacchain_2390-1Activev0.0.7-testnetOriginal testnet with 3s block time

In this guide, we’ll walk you through the process of joining either network as a node operator.

TAC Turin is going to be deprecated soon. Please use Saint Petersburg Testnet for your nodes.

Saint Petersburg Testnet (tacchain_2391-1)

Network Details

Hardware Requirements

  • CPU: 8 cores
  • RAM: 16GB (for RPC nodes) / 32GB (for validator nodes)
  • Storage: 500GB NVMe SSD

Prerequisites

  • Go >= 1.23.6
  • jq
  • curl

Installation Steps

1

Install tacchaind v0.0.8

git clone https://github.com/TacBuild/tacchain.git
cd tacchain
git checkout v0.0.8
make install
2

Initialize network folder

tacchaind init <YOUR_NODE_NAME> --chain-id tacchain_2391-1 --home .testnet
3

Modify your config.toml

..
timeout_commit = "2s"
..
persistent_peers = "9c32b3b959a2427bd2aa064f8c9a8efebdad4c23@206.217.210.164:45130,04a2152eed9f73dc44779387a870ea6480c41fe7@206.217.210.164:45140,5aaaf8140262d7416ac53abe4e0bd13b0f582168@23.92.177.41:45110,ddb3e8b8f4d051e914686302dafc2a73adf9b0d2@23.92.177.41:45120"
..
4

Fetch genesis

curl https://raw.githubusercontent.com/TacBuild/tacchain/refs/heads/main/networks/tacchain_2391-1/genesis.json > .testnet/config/genesis.json
5

Start node

tacchaind start --chain-id tacchain_2391-1 --home .testnet

Using Docker

1

Setup environment and build Docker image

export TAC_HOME="~/.tacchain"
export VERSION="v0.0.8"

git clone https://github.com/TacBuild/tacchain.git && cd tacchain
git checkout ${VERSION}
docker build -t tacchain:${VERSION} .
mkdir -p $TAC_HOME
cp networks/tacchain_2391-1/{docker-compose.yaml,.env.spb} $TAC_HOME/
2

Fetch snapshot (when available)

cd $TAC_HOME
wget TBD
lz4 -dc < tac-spb-full-latest.tar.lz4 | tar -xvf -
3

Start with Docker Compose

docker compose --env-file=.env.spb up -d
4

Test the node

curl -L localhost:45138 -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","method": "eth_blockNumber","params": [],"id": 1}'

Turin Testnet (tacchain_2390-1)

Network Details

Hardware Requirements

Same as Saint Petersburg Testnet

Prerequisites

  • Go >= 1.21 (or 1.23.6 for newer installations)
  • jq
  • curl
  • tar
  • lz4
  • wget
1

Install tacchaind v0.0.7-testnet

git clone https://github.com/TacBuild/tacchain.git
cd tacchain
git checkout v0.0.7-testnet
make install
2

Initialize network folder

tacchaind init <YOUR_NODE_NAME> --chain-id tacchain_2390-1 --home .testnet
3

Modify your config.toml

..
timeout_commit = "3s"
..
persistent_peers = "f8124878e3526a9814c0a5f865820c5ea7eb26f8@72.251.230.233:45130,4a03d6622a2ad923d79e81951fe651a17faf0be8@107.6.94.246:45130,ea5719fe6587b18ed0fee81f960e23c65c0e0ccc@206.217.210.164:45130"
..
4

Fetch genesis

curl https://raw.githubusercontent.com/TacBuild/tacchain/refs/heads/main/networks/tacchain_2390-1/genesis.json > .testnet/config/genesis.json
5

Fetch snapshot

cd .testnet
rm -rf data
wget http://snapshot.tac-turin.ankr.com/tac-turin-full-latest.tar.lz4
lz4 -dc < tac-turin-full-latest.tar.lz4 | tar -xvf -
6

Start node

tacchaind start --chain-id tacchain_2390-1 --home .testnet

Using Docker

1

Setup environment and build Docker image

export TAC_HOME="~/.tacchain"
export VERSION="v0.0.7-testnet"

git clone https://github.com/TacBuild/tacchain.git && cd tacchain
git checkout ${VERSION}
docker build -t tacchain:${VERSION} .
mkdir -p $TAC_HOME
cp networks/tacchain_2390-1/{docker-compose.yaml,.env.turin} $TAC_HOME/
2

Fetch snapshot

cd $TAC_HOME
wget http://snapshot.tac-turin.ankr.com/tac-turin-full-latest.tar.lz4
lz4 -dc < tac-turin-full-latest.tar.lz4 | tar -xvf -
3

Start with Docker Compose

docker compose --env-file=.env.turin up -d
4

Test the node

curl -L localhost:45138 -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","method": "eth_blockNumber","params": [],"id": 1}'

Manual Installation (Turin Testnet Only)

For developers who need to understand the chain upgrade history, you can follow this manual process that steps through each version:

1

Install tacchaind v0.0.1

git clone https://github.com/TacBuild/tacchain.git
cd tacchain
git checkout v0.0.1
make install
2

Initialize network folder

tacchaind init <YOUR_NODE_NAME> --chain-id tacchain_2390-1 --home .testnet
3

Modify your config.toml

..
timeout_commit = "3s"
..
persistent_peers = "f8124878e3526a9814c0a5f865820c5ea7eb26f8@72.251.230.233:45130,4a03d6622a2ad923d79e81951fe651a17faf0be8@107.6.94.246:45130,ea5719fe6587b18ed0fee81f960e23c65c0e0ccc@206.217.210.164:45130"
..
4

Fetch genesis

curl https://raw.githubusercontent.com/TacBuild/tacchain/refs/heads/main/networks/tacchain_2390-1/genesis.json > .testnet/config/genesis.json
5

Start node with --halt-height flag (v0.0.1)

tacchaind start --chain-id tacchain_2390-1 --home .testnet --halt-height 1727178

This flag will automatically stop your node at block height 1727178, then we need to update our binary before proceeding.

6

Update binary to v0.0.2 (EIP712 support)

git checkout v0.0.2
make install
7

Start node with --halt-height flag (v0.0.2)

tacchaind start --chain-id tacchain_2390-1 --home .testnet --halt-height 2259069
8

Update binary to v0.0.4 (mcopy support)

git checkout v0.0.4
make install
9

Start node with --halt-height flag (v0.0.4)

tacchaind start --chain-id tacchain_2390-1 --home .testnet --halt-height 3192449
10

Update binary to v0.0.5 (DefaultPowerReduction changes)

git checkout v0.0.5
make install
11

Start node without --halt-height flag (v0.0.5)

tacchaind start --chain-id tacchain_2390-1 --home .testnet

Wait for your node to hit height 3408172, at which point you’ll see a consensus error indicating you need to upgrade.

12

Update binary to v0.0.6-testnet

git checkout v0.0.6-testnet
make install
13

Start node with final version

tacchaind start --chain-id tacchain_2390-1 --home .testnet

Becoming a Validator

Once your node is fully synced, you can register as a validator:

1

Fund your account

Use the respective testnet faucet:

2

Import your private key

tacchaind --home .testnet keys unsafe-import-eth-key validator <PRIVATE_KEY> --keyring-backend test
3

Create validator transaction

For Saint Petersburg Testnet:

echo "{\"pubkey\":$(tacchaind --home .testnet tendermint show-validator),\"amount\":\"1000000000000000000utac\",\"moniker\":\"<YOUR_NODE_NAME>\",\"identity\":null,\"website\":null,\"security\":null,\"details\":null,\"commission-rate\":\"0.1\",\"commission-max-rate\":\"0.2\",\"commission-max-change-rate\":\"0.01\",\"min-self-delegation\":\"1\"}" > validatortx.json

tacchaind --home .testnet tx staking create-validator validatortx.json --from validator --keyring-backend test -y

For Turin Testnet (note the different amount):

echo "{\"pubkey\":$(tacchaind --home .testnet tendermint show-validator),\"amount\":\"1000000000utac\",\"moniker\":\"<YOUR_NODE_NAME>\",\"identity\":null,\"website\":null,\"security\":null,\"details\":null,\"commission-rate\":\"0.1\",\"commission-max-rate\":\"0.2\",\"commission-max-change-rate\":\"0.01\",\"min-self-delegation\":\"1\"}" > validatortx.json

tacchaind --home .testnet tx staking create-validator validatortx.json --from validator --keyring-backend test -y
4

Delegate more tokens (optional)

tacchaind --home .testnet tx staking delegate $(tacchaind --home .testnet q staking validators --output json | jq -r '.validators[] | select(.description.moniker == "<YOUR_NODE_NAME>") | .operator_address') 1000000000000000000utac --keyring-backend test --from validator -y
5

Participating in governance (optional)

# list all proposals on chain
tacchaind q gov proposals

# once you have identified the proposal (need `proposal_id`) you can place your vote
# In the following example we vote with 'yes', alternatively you can vote with 'no'
tacchaind tx gov vote <PROPOSAL_ID> yes --from validator

Sentry Node Architecture

For improved security, validators should implement a sentry node architecture:

Saint Petersburg Testnet Setup

1

Initialize a new config folder for the sentry node

tacchaind init <sentry_node_moniker> --chain-id tacchaind_2391-1 --default-denom utac

This will initialize config folder in $HOME/.tacchaind

Make sure you have replaced your genesis file with the one for Tac Saint Petersburg Testnet:

curl https://raw.githubusercontent.com/TacBuild/tacchain/refs/heads/main/networks/tacchain_2391-1/genesis.json > .testnet/config/genesis.json
2

Update config.toml for sentry node

..
timeout_commit = "2s"
..
persistent_peers = "9c32b3b959a2427bd2aa064f8c9a8efebdad4c23@206.217.210.164:45130,04a2152eed9f73dc44779387a870ea6480c41fe7@206.217.210.164:45140,5aaaf8140262d7416ac53abe4e0bd13b0f582168@23.92.177.41:45110,ddb3e8b8f4d051e914686302dafc2a73adf9b0d2@23.92.177.41:45120"
..
private_peer_ids = "<VALIDATOR_PEER_ID>@<VALIDATOR_IP:PORT>"
..

The private_peer_ids field is used to specify peers that will not be gossiped to the outside world, in our case the validator node we want it to represent.

3

Update config.toml for validator node

..
persistent_peers = "<SENTRY_NODE_ID>@<SENTRY_NODE_IP:PORT>"
..
pex = false
..

Using the sentry node setup, your validator node will be represented by your sentry node, therefore it no longer has to be connected with other peers. Replace persistent_peers so it points to your sentry node, this way it can no longer be accessed by the outer world. Also disable the pex field.

4

Restart nodes

Restart your validator node and start the sentry node.

Turin Testnet Setup

1

Initialize a new config folder for the sentry node

tacchaind init <sentry_node_moniker> --chain-id tacchaind_2390-1 --default-denom utac

This will initialize config folder in $HOME/.tacchaind

Make sure you have replaced your genesis file with the one for Tac Turin Testnet:

curl https://raw.githubusercontent.com/TacBuild/tacchain/refs/heads/main/networks/tacchain_2390-1/genesis.json > .testnet/config/genesis.json
2

Update config.toml for sentry node

..
timeout_commit = "3s"
..
persistent_peers = "f8124878e3526a9814c0a5f865820c5ea7eb26f8@72.251.230.233:45130,4a03d6622a2ad923d79e81951fe651a17faf0be8@107.6.94.246:45130,ea5719fe6587b18ed0fee81f960e23c65c0e0ccc@206.217.210.164:45130"
..
private_peer_ids = "<VALIDATOR_PEER_ID>@<VALIDATOR_IP:PORT>"
..
3

Update config.toml for validator node

..
persistent_peers = "<SENTRY_NODE_ID>@<SENTRY_NODE_IP:PORT>"
..
pex = false
..
4

Restart nodes

Restart your validator node and start the sentry node.

Need Help?

If you need testnet tokens, use the appropriate faucet:

If your validator isn’t in the active set, you need:

  • At least 1 voting power
  • More delegation than the current lowest validator (if the max validator limit is reached)

For any other questions, please reach out to the TAC team through our community channels.

Frequently Asked Questions

1. I need some funds on the testnet, how can I get them?

You can request testnet tokens from the faucet available at:

Please note that the Turin faucet currently dispenses up to 10 TAC per day per address.

2. I have completed the guide to join as a validator, but my node is not in the active validator set?

In order to be included in the active validator set, your validator must have at least 1 voting power, or if the maximum validators limit has been reached your validator must have a greater amount of TAC delegated to them than the validator with the lowest amount delegated.

Read more: https://forum.cosmos.network/t/why-is-my-newly-created-validator-unbonded/1841/2