Ghost Eye Wallet Bonding

Hi All.

I am working in Ghost Eye and have run into an issue. I am able to bond in a wallet, but when I go to the validator tab it is showing no bonding. Any help would be appreciated.

1 Like

The screenshot provided is super small I cant read it. Once the bonding transaction amount finalizes after (entering validator tab ny pressing enter then shift+B, enter amount, return) the amount you bonded should increase the current bonded amount by the additional bond, or show up as the initial bond amount. I am guessing but I do not think you have selected a nominator commission which maybe root cause.

I have been doing some troubleshooting. My node is up and connected, but the keys seem to be the current issue. The info I got was that my keys have not been added to the chain and are local. Not sure if this is true and I will report back.

back in the early days, a new validator needed to submit the 4 keys git hub, I don’t think that is the case any more. perhaps someone will try to help. I apologize for the frustrations


Thanks for the help on Monday. Unfortunately, I am in the same spot. Any ideas? Do I need to rebuild from scratch? Something else?

Becoming a validator requires:

  1. Bond
  2. Key generation

I noticed that sometimes changing the order of these 2 steps could help.

Maybe after the Key Generation add a little more to the bond, like 0.001 $CSPR and then wait for 2 eras.

Also, please make sure that the versions match:

Command:

ghost --version

Output:

ghost 0.8.5-4c4374c8125

Command:

ghost-eye --version

Output:

ghost-eye 0.3.92-v0.2.6-120-g47450a5 (2026-05-12)

Rebuilt node and rotated keys. See you in 48 hours!

Also, just realized something. You have 7.9 $CSPR staked. If you go to the wallet tab of GHOST Eye and press Shift + N, there will be a list of the current validators. If you look at their minimum stake you’ll see that the lowest stake is at 13 $CSPR. This means that while the protocol requires 6.9 $CSPR to start validating, the competition between nodes increased the minimum to 13 $CSPR.

Now, you can still be chosen to validate but with 7.9 $CSPR your chances are much lower than for the validators with 40 $CSPR.

In order to gurantee your validator status for each era you must stake more $CSPR than the current validator with the LEAST stake.

Let me know if this helps!

I will try that next. Here is where I am at:
GHOST Validator Rebuild Guide: Clean Rebuild from Scratch to Active Validator (TN6 / CASPER)

Posted by: Community Validator
Network: CASPER Staging Testnet (TN6)
Node version: ghost 0.8.5-4c4374c8125
OS: Ubuntu 22.04.5 LTS
Date: May 2026


Overview

This post documents a complete validator rebuild from scratch — wiped node, fresh clone, fresh compile, session key rotation, commission set, and validate transaction. It took several sessions to get fully right. Sharing the full process and lessons learned so the community doesn’t have to go through the same trial and error.


System Requirements

  • Ubuntu 22.04.5 LTS

  • Rust 1.95.0 stable + nightly (via rustup)

  • Build dependencies: git, curl, build-essential, pkg-config, libssl-dev, clang, llvm, libudev-dev, protobuf-compiler

  • wasm targets: wasm32-unknown-unknown for both stable and nightly toolchains

  • At least 8 CSPR bonded

  • ~40GB free disk space for chain data

Note: The official hardware spec calls for higher disk throughput than typical consumer SSDs. The node will still run but you will see a non-critical warning:

⚠️ The hardware does not meet the minimal requirements
Failed checks: Copy, Seq Write, Rnd Write for role 'Authority'

This does not prevent the node from operating as a validator.


Step 1: Install Dependencies

sudo apt update && sudo apt install -y git curl build-essential pkg-config libssl-dev clang llvm libudev-dev protobuf-compiler

Verify Rust is installed:

rustc --version && cargo --version

If not installed, install via rustup:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Update Rust and add wasm targets:

rustup update && rustup update nightly
rustup target add wasm32-unknown-unknown --toolchain nightly
rustup target add wasm32-unknown-unknown --toolchain stable-x86_64-unknown-linux-gnu


Step 2: Clone and Build

git clone https://git.ghostchain.io/ghostchain/ghost-node ~/ghost-node
cd ~/ghost-node
./scripts/starter.sh --release

When prompted: 'cargo build --release' is what you want? [y/N] — type y.

Build time: approximately 35-40 minutes on typical hardware. The script will:

  • Clean cargo cache

  • Apply patches (patch-1 through patch-3)

  • Fetch all dependencies (~963 crates)

  • Compile the full release binary

Verify the binary:

ghost --version
# Expected: ghost 0.8.5-4c4374c8125


Step 3: Verify Chain Spec

Your casper.json should already be at /etc/ghost/casper.json. Verify its checksum:

sha256sum /etc/ghost/casper.json
# Expected: 09a5b8de87e2ace61dc521c778b64dff59548ed2b191476218bc379e98978e1f

If you need a fresh copy, download from the official source.


Step 4: Generate Node Key

~/ghost-node/target/release/ghost key generate-node-key --bin --file=/etc/ghost/node-key

This outputs your new Peer ID — save it. You’ll need it for the bootnode and telemetry.


Step 5: Set Up Systemd Service

Run the setup script:

cd ~/ghost-node && ./scripts/starter.sh --unit-file --set-arguments

When prompted:

  • p2p port: 30333 (default)

  • RPC port: 9945 (default)

  • Chain spec: /etc/ghost/casper.json (default)

  • Node key: /etc/ghost/node-key (default)

  • Node name: your choice

  • Disable validator mode: N

  • Enable prometheus: Y ← important, don’t miss this

  • Bootnode: /dns/bootnode69.chain.ghostchain.io/tcp/30334/p2p/12D3KooWF9SWxz9dmy6vfndQhoxqCa7PESaoFWEiF8Jkqh4xKDRf

Known issue: If you accidentally select --no-prometheus, fix it manually:

sudo nano /etc/default/ghost

Replace --no-prometheus with --prometheus-port=9615 --prometheus-external.

Start and enable the service:

sudo systemctl start ghost-node
sudo systemctl enable ghost-node
sudo systemctl status ghost-node


Step 6: Verify Sync

Wait for the node to sync. Check sync state:

curl -s -H "Content-Type: application/json" \
  -d '{"id":1,"jsonrpc":"2.0","method":"system_syncState","params":[]}' \
  http://localhost:9945 | python3 -m json.tool

You are ready to proceed when currentBlock equals highestBlock.


Step 7: Session Keys — The Tricky Part

This is where most rebuilds go wrong. Read carefully.

Option A: Fresh validator (no previous keys)

Use GHOST Eye (Shift+R on Validator tab) to rotate keys. This generates new keys, writes them to the keystore, and submits them on-chain in one step.

Option B: Existing validator rebuilding (keep original keys)

Do NOT use author_rotateKeys or GHOST Eye’s Shift+R if you want to restore your original keys. rotateKeys always generates new keys regardless of what is in the keystore.

To restore original keys, use author_insertKey for each key type:

curl -s -H "Content-Type: application/json" -d '{
  "id":1,
  "jsonrpc":"2.0",
  "method":"author_insertKey",
  "params":["gran","YOUR_SECRET_SEED","YOUR_GRAN_PUBLIC_KEY_HEX"]
}' http://localhost:9945

# Repeat for: babe, audi, slow

Expected response for each: {"jsonrpc":"2.0","result":null,"id":1}

Important: If you accumulated extra keys from previous rotations, clean the keystore before inserting:

sudo systemctl stop ghost-node
sudo bash -c 'rm /var/lib/ghost/chains/casper_staging_testnet/keystore/*'
sudo systemctl start ghost-node
# Then re-insert all 4 keys via author_insertKey

Keystore location

/var/lib/ghost/chains/casper_staging_testnet/keystore/

Note: the chain directory is casper_staging_testnet, not casper.

After inserting keys, verify BABE authorship started:

journalctl -u ghost-node --since "1 minute ago" | grep -i "role\|babe\|authority"

Expected:

👤 Role: AUTHORITY
👶 Starting BABE Authorship worker


Step 8: Submit Session Keys On-Chain

You need free CSPR in your stash account to pay the transaction fee. If your stash has 0 free balance (all bonded), send a small amount (0.1-0.3 CSPR) from another wallet first.

In GHOST Eye, navigate to the Validator tab and use Shift+R to submit the session keys on-chain. Wait for the Action Logs to confirm finalization:

set keys transaction 0x... sent
transaction 0x... has been finalized in block header 0x...


Step 9: Set Commission

This step is required for validator activation. Without it, your validator will stay in Rotating status indefinitely.

In GHOST Eye on the Validator tab, press Shift+V to open the Commission input. Enter a value (e.g. 5 for 5%). Confirm and wait for the validate transaction to finalize in Action Logs.


Step 10: Restart Node in Validator Mode

cd ~/ghost-node && ./scripts/starter.sh --validate

When prompted, confirm y for validator mode and y to restart the service.

Or manually:

sudo systemctl restart ghost-node


Step 11: Wait for Era Transitions

Allow up to 48 hours for full validator activation:

  • Era 1 (~24 hours): Network accepts new session keys

  • Era 2 (~48 hours): Validator becomes active, rewards start

Signs of success in GHOST Eye Validator tab:

  • Own stake shows your bonded CSPR amount

  • Staking status changes from Rotating

  • Validator APY shows a percentage

  • Next reward shows a non-zero value


Common Issues and Fixes

Issue: set keys transaction fails with ServerError(1010) Invalid Transaction

Cause: Stash account has 0 free balance (all funds bonded).
Fix: Send 0.1-0.3 CSPR to the stash address from another wallet.

Issue: Keys on right side of --> in GHOST Eye are blank

Cause: On-chain keys don’t match keystore keys, OR the next-session keys haven’t been picked up yet.
Fix: Ensure keystore has exactly the 4 keys that match on-chain. Clean keystore and re-insert if needed.

Issue: GHOST Eye Shift+R shows all zeros in the popup

Cause: GHOST Eye is calling author_rotateKeys which generates new keys. This is by design.
Fix: Use author_insertKey via RPC to restore specific keys, then use Shift+R only when you want to generate and submit new keys together.

Issue: Validator stuck in Rotating indefinitely

Cause: Commission not set / validate transaction not submitted.
Fix: Use Shift+V in GHOST Eye to set commission and submit the validate extrinsic.

Issue: Telemetry 403 error in logs

❌ Error while dialing /dns/telemetry.ghostchain.io/tcp/443/...status code = 403

Cause: Telemetry server intermittently rejects connections.
Fix: Non-critical. Node operates normally. Check telemetry visibility periodically.

Issue: author_rotateKeys always generates new keys

Cause: This is expected behavior — rotateKeys generates fresh keys every call.
Fix: For existing validators, use author_insertKey instead to restore known keys.


Key File Locations Reference

File Path Description
Chain spec /etc/ghost/casper.json CASPER TN6 genesis
Node key /etc/ghost/node-key P2P identity key
Session key /etc/ghost/session-key Last submitted session key
Stash key /etc/ghost/stash-key Stash account private key
Service config /etc/default/ghost CLI arguments
Keystore /var/lib/ghost/chains/casper_staging_testnet/keystore/ Validator signing keys
Chain data /var/lib/ghost/chains/casper_staging_testnet/ Blockchain data
Binary /usr/bin/ghost Node binary

Useful Commands Reference

# Check node health
curl -s -H "Content-Type: application/json" \
  -d '{"id":1,"jsonrpc":"2.0","method":"system_health","params":[]}' \
  http://localhost:9945 | python3 -m json.tool

# Check sync state
curl -s -H "Content-Type: application/json" \
  -d '{"id":1,"jsonrpc":"2.0","method":"system_syncState","params":[]}' \
  http://localhost:9945 | python3 -m json.tool

# Check current block number
curl -s -H "Content-Type: application/json" \
  -d '{"id":1,"jsonrpc":"2.0","method":"chain_getHeader","params":[]}' \
  http://localhost:9945 | python3 -c "import sys,json; d=json.load(sys.stdin); print(int(d['result']['number'],16))"

# View live logs
journalctl -f -u ghost-node --no-pager

# Check keystore contents
sudo ls /var/lib/ghost/chains/casper_staging_testnet/keystore/

# Rotate session keys (generates new keys)
curl -s -H "Content-Type: application/json" \
  -d '{"id":1,"jsonrpc":"2.0","method":"author_rotateKeys","params":[]}' \
  http://localhost:9945

# Insert specific key into keystore
curl -s -H "Content-Type: application/json" -d '{
  "id":1,
  "jsonrpc":"2.0",
  "method":"author_insertKey",
  "params":["KEY_TYPE","SECRET_SEED","PUBLIC_KEY_HEX"]
}' http://localhost:9945
# KEY_TYPE options: gran, babe, audi, slow


GHOST Eye Keyboard Reference (Validator Tab)

Key Action
Shift+R Rotate session keys (generates new + submits on-chain)
Shift+V Set commission + submit validate extrinsic
Shift+C Chill stash (stops validation — use with caution)
Shift+P RPC configuration

Notes for the Community

  • Back up your original session key seeds. If you ever need to rebuild, you’ll want them. author_rotateKeys cannot restore them — only author_insertKey can.

  • The validate transaction (Shift+V) is not optional. It is separate from the session key rotation and must be submitted for the validator to become active.

  • Free balance in stash is required for any on-chain transactions. Keep at least 0.1-0.5 CSPR free at all times.

  • The keystore accumulates old keys over multiple rotations. Clean it periodically to avoid confusion.

  • 19 active validators out of 43 as of TN6 — if your stake is near the minimum you may rotate in and out of the active set.


This guide is based on a real rebuild session. All steps were verified on a live TN6 node. If anything has changed since this was written, always defer to the official docs at docs.ghostchain.io and blog.ghostchain.io.

I tripled my bond amount. Let’s see if that helps.

1 Like

Success! TYSM! This worked.

1 Like

After thinking about the process, it came down to one of two things:

  1. While I was working on my setup, there were several issues that i ran into (ISP, local networking, OS) that caused multiple attempts at the configuration. Through the troubleshooting process, many sets of keys were generated and they were all stored in my wallet and config file. When I rotated keys, new keys were added on top of the existing keys. While troubleshooting, i cleaned out those extra keys and only have the required.
  2. I tripled my bond amount to ~30 cspr around the same time I cleaned out the keys.

One of these two things unblocked my node.

1 Like