*In a nutshell, you basically need to back up your pre-genesis folder, validator account seed phrase and priv_validator_key.json file, which is like your validator soul, and priv_validator_state.json file (you'll be at risk of double-sign if you don't back up and restore afterwards this one - at Cosmos based chains there's risk of tombstone when this happens, resulting in your validator not being able to join the active set anymore).

On Namada there's no tombstone, but there's cubic slashing, which could lead in a slashing rate up to 1, i.e. 100% of your staked amount, in case same behaviour is detected massively within a specific window (e.g.: -1 epoch / epoch in which the double-sign is detected / +1 epoch).

Once you set up a node in the new machine, make sure that old node is stopped and then proceed to restore those files that you previously backed up into the new one with the node stopped, and restart it after making sure you have been done restoring process correctly (don't forget also to switch from Full to Validator in the config.toml).*

*@danielmandragora.*

#1. OLD MACHINE: BACKUP NECESSARY FILES

# 1. initialize variables. for example: BASE_DIR="/root/namada_dryrun"
export BASE_DIR=$(namadac utils default-base-dir)

# 2. create the 'namada-backup' directory
mkdir -p /root/namada-backup

# 3. backup the 'pre-genesis' folder
cp -r ${BASE_DIR}/pre-genesis /root/namada-backup/pre-genesis

#2. NEW MACHINE: SYNC A NEW NODE

# 4. install namada
VERSION="v201.0.7"
cd $HOME && \\
rm -Rvf ~/namada && \\
git clone <https://github.com/anoma/namada.git>; \\
cd ~/namada && \\
git pull && \\
git checkout ${VERSION} && \\
make install

# 5. export necessary variables
export VALIDATOR_ALIAS="0Y"
export NAMADA_NETWORK_CONFIGS_SERVER="<https://github.com/anoma/namada-mainnet-genesis/releases/download/mainnet-genesis>"
export CHAIN_ID="namada.5f5de2dd1b88cba30586420"
export BASE_DIR=$(namadac utils default-base-dir)
export SERVICE="namadad"

# 6. create the base directory
mkdir -p ${BASE_DIR}

# 7. upload your 'namada-backup/pre-genesis' to '<base_dir>'
# 8. join the network
namadac utils join-network \\
--chain-id ${CHAIN_ID} \\
--genesis-validator ${VALIDATOR_ALIAS} \\
--pre-genesis-path ${BASE_DIR}/pre-genesis/${VALIDATOR_ALIAS}/ \\
--base-dir ${BASE_DIR}

# ensure old wallets are successfully recovered
namadaw list

# 9. modify ports if necessary
nano ${BASE_DIR}/${CHAIN_ID}/config.toml

[ledger.cometbft]
proxy_app = "tcp://127.0.0.1:46658"

[ledger.cometbft.rpc]
laddr = "tcp://127.0.0.1:46657"

[ledger.cometbft.p2p]
laddr = "tcp://0.0.0.0:46656"
external_address = "tcp://78.144.78.1:46656"

[ledger.cometbft.instrumentation]
prometheus_listen_addr = ":46660"

# 10. update 'persistent_peers'
PEERS="tcp://5c2fffc93c7e626ed794e0fab7e2fe5ea182f0a5@namada-mainnet-peer.itrocket.net:14656,tcp://[email protected]:31656,tcp://[email protected]:26656,tcp://[email protected]:26656,tcp://[email protected]:26656,tcp://[email protected]:26656,tcp://[email protected]:26656,tcp://[email protected]:26656,tcp://[email protected]:26656,tcp://[email protected]:26656,tcp://[email protected]:26656"
sed -i 's#persistent_peers = ".*"#persistent_peers = "'${PEERS}'"#' ${BASE_DIR}/${CHAIN_ID}/config.toml

# 11. download addrbook (thanks to 'itrocket.net')
wget -O ${BASE_DIR}/${CHAIN_ID}/cometbft/config/addrbook.json <https://server-5.itrocket.net/mainnet/namada/addrbook.json>

# 12. create and start a new namada service
sudo tee /etc/systemd/system/${SERVICE}.service > /dev/null <<EOF
[Unit]
Description=Namada Node
After=network-online.target
[Service]
User=root
ExecStart=$(which namada) node ledger run
Environment="NAMADA_LOG=info"
Environment="CMT_LOG_LEVEL=p2p:none,pex:error"
Environment="NAMADA_CMT_STDOUT=true"
Environment="NAMADA_BROADCASTER_TIMEOUT_SECS=600"
Restart=always
RestartSec=10
LimitNOFILE=65535
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload && \\
sudo systemctl enable ${SERVICE} && \\
sudo systemctl restart ${SERVICE} && \\
sudo journalctl -fu ${SERVICE} -o cat

# 13. sync the new node with a snapshot (thanks to 'itrocket.net')
tmux new -s namada-snapshot; tmux attach -t namada-snapshot

export VALIDATOR_ALIAS="0Y"
export NAMADA_NETWORK_CONFIGS_SERVER="<https://github.com/anoma/namada-mainnet-genesis/releases/download/mainnet-genesis>"
export CHAIN_ID="namada.5f5de2dd1b88cba30586420"
export BASE_DIR=$(namadac utils default-base-dir)
export SERVICE="namadad"
export SNAP_NAME=$(curl -s <https://server-5.itrocket.net/mainnet/namada/.current_state.json>  | jq -r '.snapshot_name')

sudo systemctl stop ${SERVICE} && \\
cp ${BASE_DIR}/${CHAIN_ID}/cometbft/data/priv_validator_state.json ${BASE_DIR}/${CHAIN_ID}/cometbft/priv_validator_state.json.backup; \\
rm -rf ${BASE_DIR}/${CHAIN_ID}/cometbft/data ${BASE_DIR}/${CHAIN_ID}/{db,wasm} && \\
curl "<https://server-5.itrocket.net/mainnet/namada/${SNAP_NAME}>" -o snapshot.tar.lz4 && \\
lz4 -dc snapshot.tar.lz4 | tar -xvf - -C ${BASE_DIR}/${CHAIN_ID} && \\
mv ${BASE_DIR}/${CHAIN_ID}/cometbft/priv_validator_state.json.backup ${BASE_DIR}/${CHAIN_ID}/cometbft/data/priv_validator_state.json; \\
sudo systemctl restart ${SERVICE} && \\
sudo journalctl -u ${SERVICE} -f

rm -Rvf snapshot.tar.lz4

# 14. create 'check_sync_status' function
check_sync_status() {
  local config_file="${BASE_DIR}/${CHAIN_ID}/config.toml"
  local port=$(grep -oP 'laddr = "tcp://(?:127\\.0\\.0\\.1|0\\.0\\.0\\.0):\\K\\d+' "$config_file" | head -n 1)
  local ideal_block=$(curl -s "<https://namada-mainnet-rpc.itrocket.net:443/status>" | jq ".result.sync_info.latest_block_height" | bc)
  local local_block=$(curl -s "<http://localhost>:${port}/status" | jq ".result.sync_info.latest_block_height" | bc)
  local difference=$((ideal_block - local_block))

	clear
  if (( difference > 0 )); then
    echo "ideal_block: ${ideal_block}, actual_block: ${local_block} | to_sync: ${difference}"
  else
    echo "ideal_block: ${ideal_block}, actual_block: ${local_block} | node is fully synchronized."
  fi
}

# call the function
check_sync_status

#3. OLD MACHINE: STOP THE OLD NODE

# 15. stop and disable the old service
SERVICE="namadad"
sudo systemctl stop ${SERVICE} && \\
sudo systemctl disable ${SERVICE} && \\
sudo systemctl daemon-reload && \\
sudo journalctl -fu ${SERVICE} -o cat

# 16. backup 'priv_validator_state.json'
export CHAIN_ID="namada.5f5de2dd1b88cba30586420"
export BASE_DIR=$(namadac utils default-base-dir)
cp ${BASE_DIR}/${CHAIN_ID}/cometbft/data/priv_validator_state.json /root/namada-backup/

# 17. backup 'priv_validator_key.json'
cp ${BASE_DIR}/${CHAIN_ID}/cometbft/config/priv_validator_key.json /root/namada-backup/

#4. NEW MACHINE: RESTART THE NEW NODE

# 17. place the 'priv_validator_state.json' file into '<base_dir>/<chain_id>/cometbft/data'
# 18. place the 'priv_validator_key.json' file into '<base_dir>/<chain_id>/cometbft/config'

# 19. restart the new namada service

sudo systemctl daemon-reload && \\
sudo systemctl enable ${SERVICE} && \\
sudo systemctl restart ${SERVICE} && \\
sudo journalctl -fu ${SERVICE} -o cat

#5. OLD MACHINE: CLEAR OLD SERVER

# now, you should clean up the namada directories on the old server.

# 20. initialize 'BASE_DIR' variable. for example: BASE_DIR="/root/namada_dryrun"
export BASE_DIR=$(namadac utils default-base-dir)

rm -Rvf namada/ ${BASE_DIR} namada-backup