Common error codes
These are the most frequent errors and their solutions:Consensus errors
If you get a consensus error, act quickly and appropriately:Network errors
Network errors can prevent your node from participating in consensus:Database errors
Database corruption can require immediate attention:Diagnostic commands
These commands help you investigate problems and monitor your node:AppHash mismatch errors
If you get an AppHash mismatch, capture the state to compare it with a known-good version:As with FlatKV, the memIAVL store has two possible locations. Nodes created before the layout change keep the legacy
$HOME/.sei/data/committer.db path shown above (it takes precedence when present). New nodes use $HOME/.sei/data/state_commit/memiavl. Point -d at whichever path exists on your node.dump-flatkv command to iterate and dump the physical (key, value) pairs into per-bucket files. The files match the dump-iavl format, so the same diff tooling works on both:
Nodes created before the storage layout change keep the FlatKV store at the legacy path
$HOME/.sei/data/flatkv instead of $HOME/.sei/data/state_commit/flatkv. Pass whichever directory exists on your node to --db-dir.dump-flatkv command accepts these flags:
--db-dir(-d): The FlatKV database directory.--output-dir(-o): The output directory, with one file for each bucket. Required unless--lthash-onlyis set.--height: The FlatKV target version. The default,0, selects the latest available version.--bucket(-b): Restrict the dump to a single bucket (account,code,storage, orlegacy). The default is all buckets. This only filters which files are written; the full keyspace is always scanned, and the LtHash always covers all four buckets.--lthash: Also compute the per-bucket and total LtHash (lattice hash) over the scanned state, and verify the total against the committed root recorded in snapshot metadata. The default istrue. A mismatch exits non-zero.--lthash-only: Compute and verify the LtHash without writing any bucket dump files. Requires--lthash=true, and does not require--output-dir. The default isfalse.--read-limit-mb: Throttle the scan to at most this many MiB/s of (key+value) bytes read, so a dump against a running node does not starve the chain of disk bandwidth. The default is64. Set0for unlimited. Keep it at the default or lower on a shared/live node; raise it only for offline runs on idle disks.
dump-flatkv opens an independent read-only clone of the store (the snapshot is hard-linked and the changelog WAL is replayed into a temp directory), it is safe to run against a live, block-producing node, and the --read-limit-mb throttle prevents it from starving the node of disk bandwidth.
For example, to dump only the storage bucket at a specific version:
--lthash, the output prints a per-bucket count and checksum plus a TOTAL LtHash, followed by a LtHash verification vs snapshot metadata PASS/FAIL line. Verification is skipped (rather than failing) when the selected snapshot predates LtHash metadata, since the committed hash then covers only replayed WAL deltas rather than full state.
Comparing EVM state between memIAVL and FlatKV
When you debug an AppHash mismatch that involves EVM state, a byte-for-byte physical dump can diverge between backends, even when the underlying state is identical. This happens because every FlatKV value embeds a per-key block-height stamp (the height at which the key was last written or migrated). On a freshly migrated node, this stamp differs from the memIAVL leaf versions. Theevm-logical-digest command works around this with a backend-independent digest of the EVM logical state. On both sides, it strips the serialization-version and block-height header. Then it digests only the logical payload: account balance, nonce, and code hash, plus bytecode and storage words. With this digest, you can compare a memIAVL node and a FlatKV node at the same chain height:
--backend flag accepts flatkv, memiavl, and composite.
For memIAVL, --memiavl-open-mode controls how leaves are read:
snapshot(the default) sequentially scans the completed snapshotkvsfile atsnapshot-<height>/evm. This is the fast path and requires an on-disk snapshot at that exact height (or--height 0for the current symlink). Prefer it whenever your target height matches an existing snapshot boundary.replayopens a read-only DB, replays the changelog up to--height, then walks the in-memory/mmap tree. It is roughly an order of magnitude slower thansnapshot, so use it only when no snapshot exists at the target height (for example, when a node’s snapshot rewrite lags the tip):
--backend composite to digest the union of both, so a migrating node can be compared against a memIAVL-only node at the same height. In composite mode, --db-dir is not required; instead provide the two backend directories with --flatkv-dir and --memiavl-dir. Because a live migrating node usually keeps memIAVL snapshots at heights outside FlatKV’s retained window, pass --memiavl-open-mode replay:
bucket_digest values and a single FINAL_DIGEST line that covers the account, code, storage, and legacy buckets. Compare the FINAL_DIGEST lines from both backends at the same height. They should match. FlatKV can contain FlatKV-only migration marker rows that a memIAVL-only node never owns: the migration-version marker (present once a migration completes) and the migration-boundary cursor (present only while a migration is in flight). The command automatically omits both rows from the final result, so memIAVL, mid-migration, and completed nodes all produce comparable digests.
For targeted debugging, the command can also inspect a single normalized bucket instead of printing the global digest. The seidb tooling section of the technical reference has the full flag reference, including inspect mode, sharding, and --find-hash. These examples list the first 50 account rows with version metadata, and shard the storage bucket under a key prefix by the next 2 bytes:
Identifying AppHash errors
In logs, AppHash errors usually look like this:- Using an incorrect node version during sync (make sure that you run the latest version)
- Corrupted or incorrectly applied snapshots
- Database inconsistencies from improper shutdowns
- Syncing with outdated or incompatible peers
- Stop the node immediately.
- Try a node rollback first. See Node rollback.
-
If the rollback fails, restore from a fresh snapshot:
- Download a recent snapshot from trusted providers (Polkachu, PublicNode)
- Make sure that you use the correct node version
- Verify that peer configurations are up to date
- Restart the node and monitor the logs for continued errors.
Peer connection issues as AppHash red herrings
Important: Peer connection failures are often symptoms of underlying AppHash errors, not the root cause. If you see many peer connection errors like these:- Scan your logs carefully for AppHash errors that may appear intermittently
- Look for the actual error pattern:
- Check whether your node is stuck at a specific height despite peer connection attempts
- AppHash mismatches prevent proper block validation
- The node cannot advance to new blocks because of a state inconsistency
- Peers may reject connections from nodes with corrupted state
- The network appears to be the problem, but the cause is a local state issue
- First, check for AppHash errors in your logs (search for “wrong Block.Header.AppHash”)
- If you find AppHash errors, treat them as the primary issue
- Focus on peer connection fixes only if no AppHash errors exist
Peer connection and handshake issues
Identifying peer issues: Look for these error patterns in your logs:- Outdated peer configurations with mismatched node IDs
- Network infrastructure changes on the peer side
- A firewall that blocks connections on port 26656
- DNS resolution issues
- Update peer configurations with current node IDs:
-
Verify network connectivity:
-
Check the current peer status:
Sync performance issues
Identifying sync problems: Monitor these indicators:-
Increase the packet payload size for large block processing:
-
Optimize the mempool settings in
config.toml: -
If the node gets stuck at a specific height:
- Try restarting the node
- If that does not help, perform a rollback
- Consider taking a fresh snapshot
- The current height does not increase over time
- Increasing lag between the current height and the max peer height
- Repeated timeout errors in the logs
- Mempool size that consistently reaches its limits
Crash and panic debugging
For crashes, panics, or nil pointer exceptions:- Capture at least 1,000 lines of logs before the crash or 15 minutes of log data, whichever gives more context
- Include the full stack trace, if it is available
Logging configuration
Proper logging configuration is essential for debugging and monitoring:Other common issues and fixes
-
Sync problems
- Check available disk space (
df -h) - Make sure that peer connections work (
curl http://localhost:26657/net_info) - Check that the firewall allows port 26656
- Check available disk space (
-
Performance issues
- Monitor system resources (
htoporiotop) - Check disk I/O performance (
iostat) - Analyze network traffic (
iftop)
- Monitor system resources (
-
Database issues
-
Run database integrity checks:
If you find errors, consider restoring from a recent backup.
-
To keep less historical data, lower
ss-keep-recentinapp.toml. -
To rebuild the node with a smaller database, reset it. Then resync from a
snapshot or with state sync. The
reset deletes all chain data, so it is not a pruning tool. Before you
reset, back up
priv_validator_key.jsonandpriv_validator_state.json, as described in Clean up:Alternatively, remove old state snapshots manually to free disk space:
-
Run database integrity checks:
Node rollback
To roll back a node from an AppHash mismatch, first stop the node in your preferred way. Next, roll back the node:seid process directly. If this does not help, restart your machine.
Then try the rollback steps again.
HashVault app-hash equivocation panic
Autobahn validators and fullnodes run an app-hash equivocation guard called HashVault, enabled by default. It stores the app hashes the node has committed in a durable database under<PersistentStateDir>/hashvault. If the node is ever about to commit a different app hash for a height it has already finalized, HashVault halts the node to prevent it from “changing its mind” about a finalized block.
When the guard trips, you will see a panic in the logs similar to:
Recovery (only if you are certain there is no real equivocation)
If, and only if, you are certain the stored hashes are wrong and there is no real equivocation, you can bypass the guard:- Stop the node.
- Delete the HashVault data directory shown as
hashVaultDirin the panic message (by default<PersistentStateDir>/hashvault). - Restart the node. It starts with an empty equivocation history and re-commits hashes as it re-executes blocks.
Last-resort: disabling HashVault
If you repeatedly hit the same panic on new blocks and are very sure the stored hashes are totally wrong, you can run the node with the guard disabled by setting the top-levelhash-vault-disabled-unsafe field in config.toml:
false, and you should re-enable the guard (set it back to false or remove the line) as soon as the underlying issue is resolved.