Before You Begin: Critical Safety Rules
What to never do
- Never run two nodes with the same
priv_validator_key.jsonsimultaneously. This causes double-signing, 0% slash, but permanent tombstoning. The validator can never rejoin the active set. - Never use
unsafe-reset-allon a validator node unless you fully understand the consequences. It wipes consensus state and can produce conflicting votes that lead to tombstoning. - Never back up
priv_validator_state.jsonwhile the node is still running. The file changes continuously during consensus. Stop the node fully first, then copy it. - Never start a node after snapshot recovery without restoring your backed up
priv_validator_state.json. Snapshots do not include this file. Starting without it resets your signing state to height 0, which causes double-signing. - Never rollback an archival or large history node without testing first. Rollback on large databases can take hours or brick the node entirely, especially with PebbleDB.
- Always back up
priv_validator_state.jsonafter fully stopping the node and before any recovery operation (rollback, snapshot restore, binary upgrade). - Always restore
priv_validator_state.jsonto its original location after rollback or snapshot recovery, before starting the node. - Always verify
priv_validator_state.jsonis intact before starting the node. Check that the height, round, and step values are sensible. - Always set
--halt-heightfor coordinated upgrades. Nodes that skip the halt-height flag require a harder recovery path. - Always verify the binary version with
injectived versionbefore starting after an upgrade. - Always undo temporary consensus overrides (like
--unsafe-consensus-timeout-precommit-delta=1ms) once the chain stabilizes.
Need a snapshot to recover? See Snapshot Resources at the bottom of this page for pruned snapshots and community providers. For archival segment snapshots, see the Archival Setup page.
Common Problems and Solutions
Node stuck at upgrade height
Symptoms:- Node logs show the chain halted at the expected upgrade height
latest_block_heightdoes not advance past the halt height
- Stop the node
- Back up
~/.injectived/data/priv_validator_state.json - Install the new binary
- Verify:
injectived version - Start the node
Block header hash mismatch after upgrade
Symptoms:- Stop the node
- Back up
priv_validator_state.json - Rollback one block:
- Restore
priv_validator_state.json - Start the node with the new binary
Conflicting vote warnings
Symptoms:priv_validator_state.json was reset or corrupted, so it is resigning at rounds it already signed for, producing conflicting votes.
Common triggers:
- Ran
unsafe-reset-allon a validator - Restored an old or incorrect
priv_validator_state.json - Backed up
priv_validator_state.jsonwhile the node was still running (stale copy) - Rollback command reset the validator state
- If you have a correct backup of
priv_validator_state.json(taken after fully stopping the node): restore it and restart. - If you do not have a correct backup: stop the node immediately and wait for block production to resume before restarting. Starting with incorrect state risks double-signing.
- Check signing info:
Validator tombstoned (double-signed)
Symptoms:- Running two instances of the node with the same signing key
- Restoring an old
priv_validator_state.jsonthat caused re-signing at a previously signed height - Rollback resetting signing state, followed by the node signing a conflicting block
- A governance proposal or upgrade handler that explicitly un-tombstones affected validators
- Creating a new validator with a new operator key (loses existing delegations)
- Use TMKMS or Horcrux for hardware-enforced single-signer semantics
- Always back up
priv_validator_state.jsonafter stopping the node - Never run two nodes with the same signing key simultaneously
Recovering from a snapshot
When to use: When rollback fails, takes too long, or the node state is corrupted beyond repair (apphash mismatch). Procedure:- Stop the node completely
- Back up
~/.injectived/data/priv_validator_state.json - Back up
~/.injectived/config/priv_validator_key.jsonif not already backed up elsewhere - Download a snapshot from a trusted provider:
- Injective Team may also share emergency snapshots before or during security upgrades
- Polkachu Injective Snapshots (typically goleveldb)
- Community validators may share emergency snapshots during incidents
- Remove old data:
- Extract the snapshot into
~/.injectived/data/ - Restore your backed-up
priv_validator_state.jsoninto~/.injectived/data/ - Verify
priv_validator_state.jsonis present and correct - Start the node
Why you must keep your own priv_validator_state.json
Snapshots contain blockchain data (blocks, application state) but never include your validator’s signing state. The signing state tracks the last height, round, and step your validator signed at. If you lose it or replace it with a blank one, your node doesn’t know what it already signed and may sign a conflicting block — causing double-signing and permanent tombstoning.
Here’s a practical example showing why the signing state must always be ahead of (or equal to) the snapshot height.
Setup: A coordinated chain upgrade with halt-height at block 125.
priv_validator_state.json reads:
--halt-height flag prevents block 126 from being committed (finalized), but the CometBFT consensus engine still enters height 126 and begins its rounds — proposing, prevoting, and precommitting — before the application layer refuses to process the block and the node shuts down. The high round number (42) reflects the network churning through rounds as validators gradually stop and consensus can’t be reached. This is normal behavior: your validator cast real votes at height 126 even though that block was never finalized.
This means your validator has already cast votes at height 126, round 42. The available snapshot is from height 115.
What happens if you restore the snapshot WITHOUT your signing state:
The snapshot comes with either no priv_validator_state.json or a blank one (height 0). If you start the node this way:
- Your node loads blockchain data from height 115
- It catches up to height 126 by replaying blocks 116-125
- At height 126, it enters consensus and starts signing from round 0
- But the network already has your votes from round 42 at this height
- Your node signs a different block proposal at height 126 (because it replayed with the new binary and may produce a different result)
- The network detects two conflicting signatures from your validator key
- Your validator is double-signed and tombstoned. Permanently.
- Stop the node
- Back up your
priv_validator_state.json(it says height 126, round 42) - Delete your data directory
- Extract the snapshot (blockchain data from height 115)
- Copy your backed-up
priv_validator_state.jsonback into the data directory - Start the node
- It loads blockchain data from height 115
- It catches up to height 126 by replaying blocks 116-125
- At height 126, it reads the signing state: “I already signed up to round 42”
- It skips rounds 0-42 and waits for round 43 before signing anything new
- No conflicting votes. Your validator is safe.
Database backend compatibility: Snapshots are backend specific. A goleveldb snapshot will not work on a node configured for pebbledb, and vice versa. Check your configuration:
Rollback hangs or fails
Symptoms:injectived rollback runs but never completes, or produces errors.
Causes:
- PebbleDB backend: Rollback with pebble has known issues and may hang indefinitely
- Very large database: Rollback time scales with database size
- Corrupted WAL (Write-Ahead Log)
- For PebbleDB nodes: recover from a snapshot instead
- For large nodes: if rollback hasn’t completed in 30+ minutes, abort and use a snapshot
- Consider switching to goleveldb. PebbleDB is more space efficient but less tested for rollback
Round regression errors during catchup
Symptoms:AppHash mismatch
Symptoms:- Try rollback:
injectived rollback - If rollback fails or the error persists: recover from a snapshot
- Always restore
priv_validator_state.jsonafter recovery
Sentry nodes stuck after upgrade
Symptoms: The validator node is upgraded and signing, but sentry nodes remain stuck at the old block height. Cause: Sentry nodes also need the new binary to process blocks past the upgrade height. Solution: Upgrade sentry nodes to the same binary version as the validator. Sentries do not havepriv_validator_state.json (they don’t sign), but they do require the correct binary.
Chain stalled after upgrade (insufficient voting power)
Symptoms:- The chain does not produce new blocks after the upgrade height
- Consensus round numbers climb continuously (round 50, 100, 200+)
- Nodes log prevotes and precommits but no block is committed
latest_block_heightremains stuck at the halt height
- The chain halts at the upgrade height (ex: block 125)
- Validators that have upgraded start participating in consensus at height 126
- Each round, the network attempts to finalize block 126 but fails because less than 2/3 of voting power is voting
- The round number increments and the cycle repeats, round 1, 2, 3, … 50, … 100+
- This continues until enough validators complete the upgrade and come online
- If you have already upgraded: No action needed. Your node is participating and will automatically finalize the next block once quorum is reached. You will see round regression errors in the logs as your node catches up through rounds. This is expected (see Round regression errors during catchup).
- If you have not yet upgraded: You are part of the missing voting power. Complete the upgrade as quickly as possible to help the chain resume.
- Monitor progress: Check how many validators are online and participating:
- Coordinate in validator channels: During major upgrades, validators typically coordinate in the verified validators channels to track upgrade progress and voting power percentage.
The longer this window lasts, the higher the round numbers climb. Validators that come online later will need to catch up through all those rounds, which is why the
--unsafe-consensus-timeout-precommit-delta=1ms flag exists but remember to remove it after the chain stabilizes.Jailed for downtime (not tombstoned)
Symptoms:- Validator shows as inactive or jailed
tombstoned: falsein signing info- Missed blocks counter is high
- Ensure the node is running and fully caught up to the latest block
- Unjail:
- Verify the validator is active again:
Coordinated Upgrade Checklist
Before the upgrade height
- Confirm the target halt-height from the governance proposal or chain team
- Download and verify the new binary (check sha256 checksums)
- Set
--halt-height=<target_height>in node config or CLI flags - If using Cosmovisor: place the new binary in the correct upgrade directory
- Back up
priv_validator_state.json - Identify snapshot providers in case rollback is needed
- Monitor chain progression toward the halt height
At the upgrade height
- Confirm the node has halted at the expected height
- Stop the node fully (verify the process is dead)
- Back up
priv_validator_state.json - Install the new binary
- Verify the version:
After the upgrade
- Start the node with the new binary
- Monitor logs for consensus participation
- Confirm prevotes are correct (not voting nil on every round)
- Monitor voting power on an explorer (Mintscan)
- If seeing
wrong Block.Header.LastResultsHash: stop, rollback 1 block, restorepriv_validator_state.json, restart - If using round-catchup overrides (
--unsafe-consensus-timeout-precommit-delta): remove them once stable - Verify the validator is signing:
Monitoring Reference
Consensus and sync status
Validator health
Node configuration
Pruned vs Archival Nodes
Additional Resources
- Run an Injective Node
- Cosmovisor Setup
- Upgrade a Node
- Cosmos Validators FAQ
- CometBFT Running in Production
Snapshot Resources
Injective Provided Snapshots
Injective maintains pruned mainnet snapshots in two regions. Check the status endpoint for the latest available height and download URL:
To download the latest snapshot, check the status endpoint for the current filename:
Community Snapshot Providers
- Polkachu Injective Snapshots (typically goleveldb, pruned)
- HighStakes Injective Snapshots
- Community validators may share emergency snapshots during incidents in the validator channels
