---
node_type: validator
chain_id: roguelayer-1
binary: rogued
denom: urogue
audience: machine
last_verified: 2026-05-12T00:00:00.000Z
canonical_url: 'https://roguelayer.one/run-a-node/validator/agent'
---

# Validator node — agent instructions

## CONSTANTS

```
CHAIN_ID=roguelayer-1
BINARY=rogued
DENOM=urogue
GENESIS_URL=TBD
SEED_PEERS=TBD
P2P_PORT=26656
RPC_PORT=26657
GO_VERSION_MIN=1.22
MIN_DISK_GB=200
MIN_RAM_GB=8
```

## PREFLIGHT

Run these checks. Abort if any fails.

- `go version` → version >= 1.22
- `df -BG ${HOME} | awk 'NR==2 {print $4}' | tr -d G` → >= 200
- `awk '/MemTotal/ {print int($2/1024/1024)}' /proc/meminfo` → >= 8
- `command -v jq curl git make` → all four exist
- port 26656 reachable from public internet (firewall + NAT)

## STEPS

### STEP 1 — install_binary

COMMAND:
```
git clone https://github.com/stepheniervella/RL1.git ~/rogue && cd ~/rogue && make install
```
EXPECT_EXIT: 0
VERIFY: `rogued version` prints a semver string on stdout.
ON_FAILURE: if "rogued: command not found", ensure `$(go env GOPATH)/bin` is on PATH.

### STEP 2 — init_node

COMMAND:
```
MONIKER="${MONIKER:-agent-validator}"; rogued init "$MONIKER" --chain-id roguelayer-1
```
EXPECT_EXIT: 0
VERIFY: `[ -f ~/.rogued/config/genesis.json ]` is true.
ON_FAILURE: if "already initialized" and re-init intended, remove `~/.rogued/` and retry.

### STEP 3 — fetch_genesis

COMMAND:
```
curl -fsSL "$GENESIS_URL" -o ~/.rogued/config/genesis.json
```
EXPECT_EXIT: 0
VERIFY: `[ -s ~/.rogued/config/genesis.json ]` AND `sha256sum ~/.rogued/config/genesis.json` matches the operator-supplied hash.
ON_FAILURE: hash mismatch → STOP, do not proceed. Genesis URL or fetched file is wrong.

### STEP 4 — configure_peers

COMMAND:
```
sed -i 's|^seeds = ".*"|seeds = "'"$SEED_PEERS"'"|' ~/.rogued/config/config.toml
```
EXPECT_EXIT: 0
VERIFY: `grep -E '^seeds = ' ~/.rogued/config/config.toml` shows the configured seeds.
ON_FAILURE: edit config.toml manually; the `seeds = ""` line must exist for `sed` to match.

### STEP 5 — install_systemd_unit

COMMAND:
```
sudo tee /etc/systemd/system/rogued.service > /dev/null <<EOF
[Unit]
Description=RogueLayer node
After=network-online.target

[Service]
User=$USER
ExecStart=$(go env GOPATH)/bin/rogued start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now rogued
```
EXPECT_EXIT: 0
VERIFY: `systemctl is-active rogued` prints `active`.
ON_FAILURE: `journalctl -u rogued -n 100` for context. Common causes: wrong ExecStart path, port permissions.

### STEP 6 — wait_for_sync

COMMAND:
```
until rogued status 2>&1 | jq -e '.sync_info.catching_up == false' >/dev/null; do sleep 10; done
```
EXPECT_EXIT: 0
VERIFY: `rogued status | jq -r .sync_info.catching_up` returns `false`.
ON_FAILURE: if peer count is 0 (`curl -s localhost:26657/net_info | jq '.result.n_peers'`), SEED_PEERS unreachable or port 26656 blocked.

### STEP 7 — create_operator_key

COMMAND:
```
rogued keys add validator
```
EXPECT_EXIT: 0
VERIFY: `rogued keys show validator -a` prints a bech32 address.
ON_FAILURE: if key exists, reuse it or `rogued keys delete validator`.

### STEP 8 — fund_operator_address

(Out-of-band.) Fund the address from STEP 7 with at least `min_self_delegation + gas` urogue.
VERIFY: `rogued query bank balances $(rogued keys show validator -a)` shows non-zero urogue balance.
ON_FAILURE: STOP. Cannot proceed without funded address.

### STEP 9 — create_validator

COMMAND:
```
rogued tx staking create-validator \
  --amount=1000000urogue \
  --pubkey="$(rogued tendermint show-validator)" \
  --moniker="$MONIKER" \
  --chain-id=roguelayer-1 \
  --commission-rate=0.10 \
  --commission-max-rate=0.20 \
  --commission-max-change-rate=0.01 \
  --min-self-delegation=1 \
  --from=validator \
  --gas=auto --gas-adjustment=1.3 -y
```
EXPECT_EXIT: 0
VERIFY: tx hash appears in output; `rogued query tx <hash>` shows code 0.
ON_FAILURE: code 5 = insufficient funds; code 11 = out of gas (retry with higher `--gas-adjustment`).

## VERIFY_FINAL

- `rogued query staking validator $(rogued keys show validator --bech val -a)` → returns validator details with non-zero tokens.
- `rogued query slashing signing-info $(rogued tendermint show-address)` → `missed_blocks_counter` stays low over time.

## FAILURE_MODES

- catching_up never becomes false → check peer count and SEED_PEERS reachability via port 26656.
- create-validator fails with code 5 (insufficient funds) → fund operator address.
- Node halts at a specific height → planned upgrade. Rebuild `rogued` from the upgrade tag and restart.
- `missed_blocks_counter` climbs → node is unhealthy. Investigate disk I/O, peer count, system load before being slashed for downtime.

## SAFETY

- NEVER run two `rogued` processes with the same `priv_validator_key.json`. Doing so causes double-signing and immediate slashing with no recovery.
- Back up `~/.rogued/config/priv_validator_key.json` to a separate device before STEP 9.
