Push Chain Donut
Manual node installation
Official operator documentationProject websiteSource repositoryExplorer
BonyNode setup profile
No seed phrases or private keysConfigure once โ generate every command
These values update the Push Chain Donut installation, wallet, validator, sync and firewall commands below.
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
The guide was reviewed against current project metadata and official operator documentation. Hosted BonyNode infrastructure is not implied; confirm the selected release and network parameters before using a production host.
Push Chain Donut is a live public testnet, not mainnet. This reviewed installation path is for a fresh node and deliberately refuses to overwrite an existing $HOME/.pchain directory. Back up an existing validator and use the official upgrade workflow instead of reinstalling.
Node sync checker
Compare the selected local RPC height with the chain-verified BonyNode reference. Stop with Ctrl+C.
#!/usr/bin/env bash
set -euo pipefail
CHAIN_ID="push_42101-1"
LOCAL_RPC="http://127.0.0.1:30657"
REFERENCE_RPC="https://donut.rpc.push.org"
read_height() {
local endpoint="$1"
curl --fail --silent --show-error --max-time 10 "$endpoint/status" | jq -er --arg chain "$CHAIN_ID" '
select(.result.node_info.network == $chain)
| .result.sync_info.latest_block_height
| select(test("^[0-9]+$"))
'
}
while true; do
if LOCAL_HEIGHT=$(read_height "$LOCAL_RPC") && NETWORK_HEIGHT=$(read_height "$REFERENCE_RPC"); then
BLOCKS_LEFT=$((NETWORK_HEIGHT - LOCAL_HEIGHT))
[ "$BLOCKS_LEFT" -ge 0 ] || BLOCKS_LEFT=0
printf 'Local: %s | Network: %s | Blocks left: %s\n' "$LOCAL_HEIGHT" "$NETWORK_HEIGHT" "$BLOCKS_LEFT"
else
printf 'Unable to validate one of the chain-ID checked RPC heights; retrying...\n' >&2
fi
sleep 5
doneReviewed 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-12. 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" doctor3. 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-validatorCreate 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
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"
"$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 "$("$BIN" tendermint show-validator)" --moniker "$MONIKER" --identity "$IDENTITY" --website "$WEBSITE" --details "$DETAILS" --chain-id "$CHAIN_ID" --gas auto --gas-adjustment 1.5 --gas-prices 1000000000upc -yBasic 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.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."