X PrimeFlow

Push Chain Donut

Push Chain Donut
Chain ID: push_42101-1
Block Height:
Network Status: Connecting
Explorer
push_42101-1

Manual node installation

Push Chain Donut reviewed manual node installation and validator workflow.

BonyNode setup profile

Configure once โ€” generate every command

These values update the Push Chain Donut installation, wallet, validator, sync and firewall commands below.

No seed phrases or private keys
Advanced node settings

Optional pruning, indexer and validator defaults.

Recommended hardware: 4 Cores, 8GB RAM, 200GB of storage (NVME)Profile is valid โ€” commands are ready

Network: Testnet

Chain ID: push_42101-1

Guide review: 2026-07-27 ยท 4 source references

Recommended hardware: 4 Cores, 8GB RAM, 200GB of storage (NVME)

Go version: managed by the official Push validator installer

Binary: pchaind

Node home: ~/.pchain

Node sync checker

Compare the selected local RPC height with the chain-verified BonyNode reference. Stop with Ctrl+C.

#!/usr/bin/env bash

CHAIN_ID="push_42101-1"
CONFIG="$HOME/.pchain/config/config.toml"
RPC_PORT=$(grep -m 1 -oP '^laddr = "\K[^"]+' "$CONFIG" | cut -d ':' -f 3)
RPC_PORT="${RPC_PORT:-30657}"
NETWORK_RPC="https://donut.rpc.push.org"

while true; do
  LOCAL_STATUS=$(curl -fsS --max-time 10 "http://127.0.0.1:$RPC_PORT/status" 2>/dev/null || true)
  NETWORK_STATUS=$(curl -fsS --max-time 10 "$NETWORK_RPC/status" 2>/dev/null || true)
  LOCAL_CHAIN=$(jq -r '.result.node_info.network // empty' <<<"$LOCAL_STATUS" 2>/dev/null)
  NETWORK_CHAIN=$(jq -r '.result.node_info.network // empty' <<<"$NETWORK_STATUS" 2>/dev/null)
  LOCAL_HEIGHT=$(jq -r '.result.sync_info.latest_block_height // empty' <<<"$LOCAL_STATUS" 2>/dev/null)
  NETWORK_HEIGHT=$(jq -r '.result.sync_info.latest_block_height // empty' <<<"$NETWORK_STATUS" 2>/dev/null)

  if [[ "$LOCAL_CHAIN" != "$CHAIN_ID" || "$NETWORK_CHAIN" != "$CHAIN_ID" ||
        ! "$LOCAL_HEIGHT" =~ ^[0-9]+$ || ! "$NETWORK_HEIGHT" =~ ^[0-9]+$ ]]; then
    echo -e "\033[1;31mError: invalid RPC response. Retrying...\033[0m"
    sleep 5
    continue
  fi

  BLOCKS_LEFT=$((NETWORK_HEIGHT - LOCAL_HEIGHT))
  (( BLOCKS_LEFT < 0 )) && BLOCKS_LEFT=0
  echo -e "\033[1;33mNode Height:\033[1;34m $LOCAL_HEIGHT\033[0m \033[1;33m| Network Height:\033[1;36m $NETWORK_HEIGHT\033[0m \033[1;33m| Blocks Left:\033[1;31m $BLOCKS_LEFT\033[0m"
  sleep 5
done

Reviewed project installation steps

1. Review and run the checksum-pinned official Push validator installer

set -euo pipefail
sudo apt-get update
sudo apt-get install -y bash ca-certificates curl jq less

NODE_HOME="$HOME/.pchain"
MONIKER='YOUR_NODE_NAME'
test "$MONIKER" != 'YOUR_NODE_NAME'
test ! -e "$NODE_HOME" || { echo "Stop: $NODE_HOME already exists. Back it up and use the official upgrade workflow." >&2; exit 1; }

INSTALLER_FILE=$(mktemp)
trap 'unlink "$INSTALLER_FILE" 2>/dev/null || true' EXIT
curl --fail --show-error --location --proto "=https" \
  --output "$INSTALLER_FILE" \
  https://raw.githubusercontent.com/pushchain/push-validator-cli/d9c1578f8fc70f3b945d53fb30b5843611270e3f/install.sh
printf '%s  %s\n' 'da35c63f94279432443d360af1337e53ec2e7217a412e4da967eb5246afa9010' "$INSTALLER_FILE" | sha256sum --check -
less "$INSTALLER_FILE"
read -r -p 'Type RUN after reviewing the pinned installer: ' CONFIRM
test "$CONFIRM" = 'RUN'
PNM_REF=v0.2.26 PCHAIN_REF=v0.0.43 bash "$INSTALLER_FILE" \
  --moniker "$MONIKER" \
  --chain-id push_42101-1

2. Verify the local chain ID, completed sync and validator manager

set -euo pipefail
MANAGER="$HOME/.local/bin/push-validator"
test -x "$MANAGER"
"$MANAGER" status
STATUS=$(curl --fail --silent http://127.0.0.1:26657/status)
jq -e '.result.node_info.network == "push_42101-1" and .result.sync_info.catching_up == false' <<<"$STATUS"
"$MANAGER" doctor

3. Register the validator interactively after sync

set -euo pipefail
MANAGER="$HOME/.local/bin/push-validator"
test -x "$MANAGER"
printf '%s\n' 'This interactive command creates or imports a validator wallet. Never paste a mnemonic into a website, chat or support ticket.'
"$MANAGER" register-validator

Create or restore wallet

set -euo pipefail
BIN="pchaind"
WALLET='wallet'
[[ "$WALLET" =~ ^[a-zA-Z0-9_-]{1,64}$ ]] || { echo "Invalid wallet name" >&2; exit 1; }

# Create a new key. Store the mnemonic offline; it cannot be recovered by BonyNode.
"$BIN" keys add "$WALLET"

# To restore an existing key, run this separately:
# "$BIN" keys add "$WALLET" --recover

WALLET_ADDRESS=$("$BIN" keys show "$WALLET" -a)
"$BIN" query bank balances "$WALLET_ADDRESS"

Create validator

Legacy direct flags. A compatibility check stops before signing when the selected binary does not support this form.

#!/usr/bin/env bash
set -euo pipefail

BIN="pchaind"
CHAIN_ID="push_42101-1"
WALLET='wallet'
MONIKER='validator-name'
IDENTITY=''
WEBSITE=''
DETAILS='Independent validator'
AMOUNT="1000000upc"
MIN_SELF_DELEGATION="1"
COMMISSION_RATE="0.10"
COMMISSION_MAX_RATE="0.20"
COMMISSION_MAX_CHANGE="0.01"
if PUBKEY_JSON=$("$BIN" comet show-validator 2>/dev/null); then
  :
else
  PUBKEY_JSON=$("$BIN" tendermint show-validator)
fi
jq -e 'type == "object"' <<<"$PUBKEY_JSON" >/dev/null

"$BIN" tx staking create-validator \
  --amount "$AMOUNT" \
  --from "$WALLET" \
  --commission-rate "$COMMISSION_RATE" \
  --commission-max-rate "$COMMISSION_MAX_RATE" \
  --commission-max-change-rate "$COMMISSION_MAX_CHANGE" \
  --min-self-delegation "$MIN_SELF_DELEGATION" \
  --pubkey "$PUBKEY_JSON" \
  --moniker "$MONIKER" \
  --identity "$IDENTITY" \
  --website "$WEBSITE" \
  --details "$DETAILS" \
  --chain-id "$CHAIN_ID" \
  --gas auto --gas-adjustment 1.5 --gas-prices 1000000000upc \
  --yes

Basic host firewall

set -euo pipefail

P2P_PORT="30656"
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow OpenSSH
sudo ufw allow "$P2P_PORT/tcp"
sudo ufw enable
sudo ufw status verbose

# RPC/API/gRPC remain private unless you deliberately add authenticated
# reverse-proxy rules. Never expose validator signing services publicly.
Advanced and recovery operations

Reversible decommission

This procedure stops and disables the service but retains the node home, binary and service file. Verify the backup before any later deletion.

set -euo pipefail

SERVICE="pchaind"
NODE_HOME="$HOME/.pchain"
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
RETIRED_HOME="$NODE_HOME.retired.$STAMP"
KEY_BACKUP="$HOME/pchaind-validator-keys-$STAMP.tar.gz"
NODE_STOPPED=0

rollback() {
  trap - ERR INT TERM
  if [ "$NODE_STOPPED" -eq 1 ]; then sudo systemctl start "$SERVICE" || true; fi
  exit 1
}
trap rollback ERR INT TERM

test -d "$NODE_HOME"
test ! -e "$RETIRED_HOME"
test -s "$NODE_HOME/config/priv_validator_key.json"
test -s "$NODE_HOME/data/priv_validator_state.json"
sudo systemctl stop "$SERVICE"
NODE_STOPPED=1

# Back up validator identity/state before moving anything.
tar -czf "$KEY_BACKUP" -C "$NODE_HOME" \
  config/priv_validator_key.json config/node_key.json data/priv_validator_state.json
test -s "$KEY_BACKUP"
mv "$NODE_HOME" "$RETIRED_HOME"
sudo systemctl disable "$SERVICE"
NODE_STOPPED=0
trap - ERR INT TERM

echo "Node home was retained at: $RETIRED_HOME"
echo "Critical key backup: $KEY_BACKUP"
echo "No binary, service file or node data was deleted."