Command line interface reference
Theseid binary has extensive functionality to manage your Sei node.
Understanding these commands is essential for effective node operation and
troubleshooting.
Node management commands
These commands help you control and monitor your node:If you see an error such as
panic: recovered: runtime error: integer divide by zero, it means that you cannot start nodes directly from the genesis file. Instead, sync to the block tip with state sync or a snapshot.Experimental config manager (SEI_CONFIG_MANAGER)
The experimental SEI_CONFIG_MANAGER environment variable selects how seid loads its configuration. The value must match exactly.
- Unset or
legacy: the default config loader. v2: boots the node the same way aslegacy, from the sameconfig.tomlandapp.toml, and also logs config validation warnings. It never changes your files, and the node always starts.v2does not validate a new node on its first start, because its config files do not exist yet.- Any other value:
seidrefuses to start with aninvalid SEI_CONFIG_MANAGERerror.
Freeze mode (--freeze-height)
As of v6.6.3, you can put a full node into read-only freeze mode at a specified block height. Use the --freeze-height start flag or the corresponding freeze-height field in app.toml. Freeze mode exists for historical RPC nodes. A node frozen at an upgrade height keeps running the pre-upgrade binary and keeps serving the state that binary produced. It does not shut down at the boundary or execute the upgrade block with code that no longer matches that state.
Query RPC remains available, so the node can continue to serve reads, but write and network paths are disabled from startup:
- Transaction and evidence submission is rejected. The
BroadcastTx,BroadcastTxAsync,BroadcastTxSync,BroadcastTxCommit, andBroadcastEvidenceRPC calls all returnErrReadOnly(RPC writes are disabled in freeze mode). The EVM endpoint submits transactions through the same path, soeth_sendRawTransactionfails with the same error. - Mempool gossip is disabled. The mempool reactor does not start, and the node does not advertise the mempool p2p channel to peers.
- State sync is disabled. If it is enabled in
config.toml, the node logs a notice and falls back to block sync.
freeze-height, startup fails with <source> height <n> has already reached freeze height <h>. To build a frozen node, start from a data directory that is below the freeze height. This can be a fresh sync from genesis or a snapshot taken below that height. Then let block sync stop at the boundary.
freeze-height field. Its value is the first block height that a full node must not execute. A value of 0 disables freeze mode. The key is a top-level entry in app.toml, in the base configuration next to halt-height, not under any [section] header. The generated default app.toml shows the field in context.
Frozen RPC router
Thefrozen-rpc-router binary, available as of v6.6.3, is a companion to freeze mode. It exposes a single HTTP EVM JSON-RPC endpoint that transparently proxies requests to a live node and one or more freeze-height-frozen nodes. It routes each request to the correct backend based on the block height that the request references. With the router, a set of archival nodes can collectively serve historical state through one endpoint. Each node is frozen at a different upgrade height and runs the binary that was live for its interval.
Because a freeze height is an exclusive boundary, a node started with --freeze-height 100 serves blocks through height 99. The router therefore sends height 99 to that node. It sends height 100 to the next configured interval, or to the live node when no frozen interval covers it.
The router is a standalone binary in the sei-chain repository. It is not part of seid, and make install does not install it. Build it from a source checkout with the build-frozen-rpc-router target, which writes the binary to ./build/frozen-rpc-router:
--listen-address: The address on which the router listens (default127.0.0.1:8545).--live-node: The HTTP RPC address of the live node (required).--frozen-node: Afreeze-height=ip:portpair. Repeat it once for each frozen node. The router accepts barehost:portaddresses andhttp://orhttps://URLs. You may list frozen nodes in any order, but each freeze height must be positive and unique.--max-request-body-bytes: The maximum JSON-RPC request body size in bytes (default5242880, which is 5 MiB). It must be positive. The router rejects larger requests with HTTP413.--max-block-reference-depth: The maximum nested block reference depth (default16). It limits how deeply nestedblockNumberobject references are parsed when the router resolves a request’s block parameter. It must be positive.--batch-request-limit: The maximum number of calls in a JSON-RPC batch (default1000). It must be positive. The router rejects a batch over this limit with JSON-RPC error-32600(batch too large).--write-timeout: The maximum duration to write an HTTP response (default30s). It must be positive.--shutdown-timeout: The graceful shutdown timeout (default10s). It must be positive.
Routing rules
The router inspects and routes only JSON-RPCPOST requests. It passes every other request, including WebSocket upgrade requests, straight through to the --live-node address without inspection. That address is the live node’s HTTP RPC endpoint, which does not accept WebSocket upgrades. Clients that need subscriptions should therefore connect directly to the live node’s WebSocket port (8546 by default), not through the router.
eth_*anddebug_*methods that take an explicit block number or theearliesttag are routed to the interval that contains that height. Examples includeeth_getBlockByNumber,eth_getBalance,eth_call,eth_getStorageAt, anddebug_traceBlockByNumber.earliestresolves to height 0.eth_getLogsandeth_feeHistoryare routed only when their entire block range falls within a single interval. The range is explicit foreth_getLogs. Foreth_feeHistory, the router derives it fromblockCountandnewestBlock(newestBlock - blockCount + 1throughnewestBlock, clamped at0). The router rejects a range that crosses an interval boundary with JSON-RPC error-32000(block ranges spanning multiple frozen-node intervals are not supported).- An
eth_getLogsfilter that setsfromBlockbut omitstoBlockis treated as ending atlatest. As a result, the router rejects it with the same-32000error wheneverfromBlockis inside a frozen interval. To stay within one interval, settoBlockexplicitly. The reverse works: a filter that sets onlytoBlockis routed to the interval that containstoBlock. - Requests with latest-style block tags (
latest,pending,safe,finalized) are forwarded to the live node. So are requests that reference a block by hash, methods without a block parameter, and stateful filter methods. - Batch requests are split so that each call reaches its correct backend, then reassembled into a single response.
- Calls whose backend cannot be reached return JSON-RPC error
-32001(upstream request failed).
Route header
Responses proxied to a single backend carry aSei-RPC-Route header. The header identifies which backend served the response: frozen:<height> for the frozen node at that freeze height, or live for the live node. A batch split across multiple backends returns mixed. Router-generated errors (oversized or malformed requests, batches over the limit, block ranges that span intervals, and unreachable backends) do not carry the header. Neither does non-POST traffic that passes through to the live node.
seidb tooling commands
Theseidb binary has low-level tools to inspect and maintain a node’s on-disk state.
Reporting FlatKV EVM migration status
Themigrate-evm-status subcommand reads the on-disk FlatKV EVM migration state from a FlatKV data directory and prints a JSON summary. It is intended mainly for integration and operator tooling that polls each validator to check whether the FlatKV EVM migration has completed. The tooling then needs no custom RPC handler and does not have to grep through node logs.
version_at: The FlatKV version that was read.migration_version: The on-disk migration version (0means that the FlatKV EVM migration has not completed yet).migrate_evm_complete:trueafter the migration version reaches the FlatKV EVM (v1) target.boundary_present:truewhile the migration is in flight (the in-progress resume cursor is still present).boundary_hex: The hex-encoded migration boundary cursor. It appears only when a boundary is present.version_raw_hex: The hex-encoded raw migration-version bytes. It appears only when a migration version is present.
Comparing EVM state across backends
Theevm-logical-digest subcommand computes a backend-independent digest of the EVM logical state (the account, code, and storage buckets). With this digest, you can compare a memIAVL node and a FlatKV node at the same chain height.
A freshly migrated FlatKV node stamps a per-key blockHeight into each value, and this stamp differs from the memIAVL leaf versions. As a result, a raw byte-for-byte digest would diverge even when the underlying EVM state is identical. This command strips the serialization-version and blockHeight header on both sides. It then digests only the height-independent logical payload (storage word, bytecode, or balance+nonce+codehash) and produces a comparable FINAL_DIGEST for each backend.
FINAL_DIGEST equals the memIAVL FINAL_DIGEST. FlatKV can also hold two internal rows that a memiavl-only node never has: the migration-version marker and, during a migration, the migration boundary cursor. The command omits both rows from the final comparison.
The command accepts these flags:
--backend: The backend to read:flatkv,memiavl, orcomposite. Usecompositeon a node in the middle of the migration. It digests the union of the FlatKV and memIAVL rows, so you can compare the node with a memiavl-only node at the same height.--db-dir(-d): For FlatKV, the FlatKV data directory. For memIAVL, the memIAVL root directory that containscurrent/andsnapshot-*. Required unless you usecomposite.--flatkv-dirand--memiavl-dir: The two data directories for--backend composite. You must set both in that mode.--height: The target version. FlatKV WAL-replays to it, and memIAVL resolvessnapshot-<height>/evm(0selects thecurrentsymlink).--memiavl-open-mode: How the command reads memIAVL.snapshot(the default) scans the snapshot file at--height. It is the fastest mode, but it needs a snapshot at that height, or--height 0.changelogreads the nearest snapshot at or below--heightand adds the changelog’s EVM writes up to--height.replayopens the database, replays the changelog to--height, and walks the tree. It is about 10 times slower thansnapshot.changelogandreplayreturn the same rows. Use one of them when no snapshot exists at--height.--memiavl-normalization: The memIAVL normalization mode. Usesemanticorindependentfor the raw EVM key-value decoder, ortranslatorfor the current migration mapping. The default issemantic.--json: Print the digest or inspect report as one JSON object on stdout, and the progress messages on stderr.--inspect-bucket: Inspect one normalized bucket (account,code,storage, ormisc), not the global digest. Inspect mode with--memiavl-normalization translator, or with--detailson thestoragebucket, requires--memiavl-open-mode snapshot.--inspect-plan(inspect mode): A JSON file that lists several inspect reports to produce from one scan. It replaces the single-report inspect flags.--key-offset(inspect mode): The byte offset into the physical key, applied before--key-prefixor sharding.--key-prefix(inspect mode): A hex prefix, relative to--key-offset, that filters physical keys.--shard-next-bytes(inspect mode): Group matching keys by this many bytes after--key-prefix.--list(inspect mode): List pairs of matching keys and logical values instead of shardbucket_digestvalues.--list-limit(inspect mode): The maximum number of pairs to print with--list(default1000). A value<= 0means unlimited.--details(inspect list mode): Include backend-specific version metadata.--find-hash: An optional 32-byte hex per-entry hash to search for. When twobucket_digestvalues differ by exactly one entry, their XOR is the hash of that entry. This flag prints every matching entry, so you can locate a single diverging row.
Dumping FlatKV state and verifying its lattice hash
dump-flatkv writes every physical key-value pair of a FlatKV store to one file per bucket. The format matches dump-iavl, so the same diff tools work on both. The command can also compute the lattice hash (LtHash) of each bucket and of the whole store. Then it compares the total with the committed value in the snapshot metadata.
The command reads from a temporary read-only copy of the store, so you can run it against a live node. --read-limit-mb limits its disk reads, so it does not slow the node down.
--db-dir(-d): The FlatKV data directory, which containscurrent/,snapshot-*, andchangelog/. Required.--output-dir(-o): The directory for the dump files, one file per bucket. Required unless you set--lthash-only.--height: The target version. The default,0, selects the latest version.--bucket(-b): Write only one bucket:account,code,storage, ormisc. The command still scans every bucket, so the LtHash total stays valid.--lthash: Compute the LtHash and check it against the snapshot metadata. The default istrue.--lthash-only: Check the LtHash, but do not write dump files. It requires--lthash=true. Do not use it with--bucket.--read-limit-mb: The maximum read speed in MiB/s. The default is64, and0turns the limit off. Raise it only for offline runs.
--lthash, the output lists the count and checksum of each bucket, the TOTAL, and a PASS or FAIL line. On a mismatch, the command prints TOTAL FAIL and stops with an error. The command skips the check when the snapshot has no committed LtHash to compare with.
Inspecting hash log archives
Theseidb hashlog commands read the archives that the per-block hash logger writes. They do not change the archives.
get-block prints every hash recorded for one block. If the node executed the block more than once, for example after a rollback, the command prints each execution separately. A hash type that was not recorded for the block prints as <none>, or as null in JSON.
compare lists the blocks whose hashes differ between two archives, which shows where two nodes diverged. If the archives match over the compared range, the command reports that.
--lowand--high: Compare only this block range (inclusive). Set both or neither.--max-diffs: The maximum number of blocks with differences to report. The default,-1, reports all of them. If the output stops at the limit, the command warns that more blocks can have differences.--full: Show every column for each block with differences. By default, the command shows only the columns that differ. Use--fullwhen the archives hold a different number of records for a block.--json: Print JSON instead of text.
Autobahn (GigaRouter) config generation
When you use the Autobahn (GigaRouter) networking layer, you can generate the Autobahn JSON config from a set of node directories. Each directory must containvalidator_pubkey.txt, node_pubkey.txt, autobahn_address.txt, and evmrpc_url.txt. Unlike the key files, evmrpc_url.txt is not written automatically, so you must create it by hand with the node’s EVM RPC URL. If the file is missing, the command fails with an error. The mempool_size field is no longer part of autobahn.json. Remove it from existing config files.
--persistent-state-dir flag controls where Autobahn persists its consensus state and BlockDB across restarts. The default is data/autobahn, so persistence is on by default. The node resolves a relative path against its --home directory. An empty value (--persistent-state-dir=) turns persistence off, and Autobahn keeps everything in memory. If you set the flag, it fills the PersistentStateDir field in the generated config.
Autobahn stores blocks and commit quorum certificates in a LittDB-based BlockDB under <persistent_state_dir>/blockdb. Since v6.7.0, it no longer reads the old globalblocks/ and fullcommitqcs/ write-ahead log directories.
Two more flags tune the BlockDB. The command writes their values to the block_db section of autobahn.json:
--blockdb-retention: The minimum age before the BlockDB can delete pruned records. The default is30s, because this command targets local and Docker clusters. Pass an empty value (--blockdb-retention=) to omit the field and use the BlockDB default of 1 hour.--blockdb-gc-period: How often the BlockDB runs garbage collection, for example10s. If you omit it, the BlockDB default applies.
block_db when persistence is off.
The command reads these files from each node directory:
validator_pubkey.txt: The validator public key invalidator:<pubkey>format.node_pubkey.txt: The p2p node public key innode:ed25519:public:<hex>format.autobahn_address.txt: The network address (host:port) that the node advertises to peers.evmrpc_url.txt: The node’s EVM RPC URL. It is written into the validator’sevmrpcfield for cross-shard transaction proxying.
validator_pubkey.txt and node_pubkey.txt files are written automatically next to priv_validator_key.json and node_key.json whenever those keys are saved. They are therefore usually already present in each node’s config directory.
The generated autobahn.json file describes the validator set, transaction limits, block interval, view timeout, and dial interval. Gas limits are not part of this file and come from the genesis block parameters instead. To make a node use the file, reference it from config.toml with the autobahn-config-file key.
Giga mode behavior and per-block limits
A node starts in Giga mode whenautobahn-config-file is set in config.toml. In Giga mode, the block production and networking behavior differs significantly from standard Tendermint consensus:
- The CometBFT
TxMempoolis not used. Under Giga, the standard mempool and its gossip reactor are disabled entirely. Transactions route through the Autobahn producer-backed mempool instead. - Consensus reactor, state sync, and block sync are disabled. In Giga mode, the node skips the consensus and state-sync reactors entirely. The block-sync reactor still runs without a syncer. State sync and block sync are both forced off, regardless of other configuration.
- Transactions are admitted through the producer mempool. The RPC broadcast endpoints call the producer’s
InsertTxorTryInsertTx, not the CometBFT mempool’sCheckTx.BroadcastTxusesInsertTx, which blocks while the mempool is full. The async path callsTryInsertTxin the background and returns immediately. As a result, when the mempool is full, the transaction is silently dropped. Themempool is fullerror fromTryInsertTxnever reaches async callers. - Sequential EVM nonce ordering is enforced. For EVM transactions, the producer mempool admits transactions strictly in nonce order per sender. A transaction whose nonce does not match the next expected nonce is rejected with a
bad nonceerror. Because admission is sequential, the mempool can track pending nonces (EvmNextPendingNonce) as callers submit them.
- Maximum transactions per block: The lower of the configured
max_txs_per_blockand the built-in maximum of 2,000 (see the transaction payload caps below). - Maximum total transaction bytes per block: A fixed per-block byte cap. A single transaction larger than this cap is rejected with a
transaction too largeerror. - Wanted gas per block (
MaxGasWantedPerBlock): Derived from the genesisMaxGasWantedblock param. A transaction whoseGasWantedexceeds this per-block limit is rejected as too large. - Estimated gas per block (
MaxGasEstimatedPerBlock): Derived from the genesisMaxGasblock param. A transaction whose (normalized) estimated gas exceeds this per-block limit is rejected as too large.
Autobahn committee and network message limits
Beyond the per-block payload limits, Giga mode enforces structural limits on the validator committee and on incoming consensus network messages:- Maximum validators per committee: The Autobahn committee has a hard limit of 100 validators (
MaxValidators). Committee creation rejects any validator set over this limit with atoo many validatorserror. It does not silently truncate the set. - Bounded consensus network messages. Autobahn consensus protobuf messages carry declared size and count constraints. These constraints are checked against the raw wire bytes before the message is decoded. Payloads that violate them are rejected during decoding, before any allocation. This protects nodes from oversized or malformed inputs that could otherwise decode into much larger in-memory structures.
- Per-field maximum sizes on fixed-width fields such as hashes, signatures, and public keys.
- Maximum repeated-field counts on validator-related lists. Signature and quorum-certificate lists are capped at 100 entries, which matches the 100-validator committee cap.
- Transaction payload caps: A block payload may carry at most 2,000 transactions. The combined transaction byte budget is exactly 2,048,000 bytes (2,000 × 1,024), and it may be split arbitrarily across the transactions in the payload. These are the built-in maxima that the per-block limits above refer to.
Giga replaces the CometBFT mempool, so Giga does not support the
unsafe_flush_mempool RPC endpoint. The endpoint returns unsafe_flush_mempool is not supported with autobahn mempool.HashVault app-hash equivocation guard
Under Autobahn, validators and fullnodes run HashVault by default. HashVault records the app hash of each finalized height before the node commits the state. If the node later tries to commit a different app hash for the same height, HashVault halts the node. Without HashVault, a validator can commit two different app hashes for one height. This can cause slashing. HashVault stores the hashes in a Pebble database at<PersistentStateDir>/hashvault. When Autobahn runs in memory only, HashVault gives no protection and logs an error at startup.
If HashVault halts a node, follow HashVault app-hash equivocation panic before you restart it. As a last resort, the top-level hash-vault-disabled-unsafe key in config.toml turns HashVault off. Keep the default, false.
Key management
Proper key management is critical for security. Use these commands to manage your keys:Transaction commands
These commands let you interact with Sei:Configuration parameters
Understanding configuration parameters is essential to optimize your node’s performance and security.App.toml parameters
Theapp.toml file controls application-specific settings:
Complete app.toml configuration
Complete app.toml configuration
If an older
app.toml does not have these [grpc] keys, the node uses the defaults shown above, not unlimited values. A negative keepalive or connection-age duration falls back to its default.Config.toml parameters
Theconfig.toml file controls the core consensus engine and networking:
Complete config.toml configuration
Complete config.toml configuration
The
[consensus] section may still parse a stateless-leader-election field, but the field is deprecated and ignored. Stateless (seed-based) leader election is always enabled, regardless of the value, so the field has no effect. It remains only for config-parsing compatibility, and you can safely omit it.Network parameters
Understanding network parameters helps you operate your node effectively.Chain parameters
These parameters define the network’s behavior:These values reflect the current on-chain parameters. For the source of truth, query them directly with
seid query staking params and seid query slashing params. Per-validator settings (for example, commission rate and commission max change rate) are configured per validator and are not chain-level parameters.Build tags
Thehistorical_replay build tag makes a seid binary to replay old blocks. This binary accepts transaction bodies with non-canonical encoding. Normal binaries reject these bodies. The replay binary can therefore execute blocks from before that check existed.
File locations
Understanding the purpose and location of important files helps with maintenance and troubleshooting:New nodes place the Tendermint consensus databases (blockstore, state, tx_index, evidence, peerstore, and cs.wal) under
data/tendermint/. Existing nodes with the legacy flat layout keep these databases directly under data/ (for example, data/blockstore.db and data/cs.wal/). These nodes continue to use the legacy paths automatically. The legacy location takes precedence when it is present, so no migration is required.