Skip to main content

Documentation Index

Fetch the complete documentation index at: https://seilabs.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

This guide covers the detailed operational aspects of running a Sei node, including configuration management, maintenance procedures, and best practices for stable and performant operations.

Configuration Management

Directory Structure

The Sei node configuration is stored in $HOME/.sei/config/:
$HOME/.sei/config/
├── app.toml          # Application configuration (gas fees, API settings, pruning, etc.)
├── config.toml       # Core Tendermint settings (network, consensus, and RPC)
├── client.toml       # CLI and client-related settings
├── genesis.json      # Chain genesis file, defines initial state
├── node_key.json     # Unique node identity key for peer-to-peer (P2P) networking
└── priv_validator_key.json  # Validator private signing key (if running as a validator)
The snippets below are opinionated tuning recommendations layered on top of the defaults. For the full unmodified app.toml, config.toml, and client.toml shipped by the latest tagged seid release, jump to Default Configurations at the bottom of this section.

Essential Configuration Parameters

Network Settings (config.toml)

[p2p]
# Public address other nodes use to dial in (host:port)
external-address = "your-public-ip:26656"
# Local address to listen for incoming P2P connections
laddr = "tcp://0.0.0.0:26656"
# Combined inbound + outbound peer limit. Default is 100; raise it for
# well-connected RPC nodes. (`max-num-inbound-peers` / `max-num-outbound-peers`
# from older Tendermint configs no longer apply.)
max-connections = 200
# Per-connection bandwidth caps in bytes/sec. Defaults are 20 MiB/s; raise
# only if your link can sustain it.
send-rate = 20971520
recv-rate = 20971520

[rpc]
# RPC listen address
laddr = "tcp://0.0.0.0:26657"
# Maximum number of simultaneous connections (HTTP + WS)
max-open-connections = 900
# Transaction confirmation timeout for /broadcast_tx_commit
timeout-broadcast-tx-commit = "10s"

Application Settings (app.toml)

# Minimum gas prices to prevent spam transactions
minimum-gas-prices = "0.01usei"

# Block retention for /block, /block_results, etc., and the floor used by
# the receipt store's pruner. 0 disables block pruning.
min-retain-blocks = 100000

# Concurrent transaction execution workers. The default is set dynamically
# (2× CPU cores, capped at 128, minimum 10).
concurrency-workers = 10

# Optimistic Concurrency Control for parallel tx execution
occ-enabled = true

[api]
# Enable the REST/Cosmos API server (port 1317)
enable = true
max-open-connections = 1000

[state-commit]
# SeiDB state-commit (memiavl + FlatKV). Recommended on every node.
sc-enable = true

[state-store]
# Historical SS layer for queries. Required for any node serving RPC.
ss-enable = true
# 0 = keep everything; 100,000 is roughly 28 hours of pacific-1 history.
ss-keep-recent = 100000

[receipt-store]
# Storage backend for EVM transaction receipts (pebbledb or parquet).
rs-backend = "pebbledb"

Default Configurations

The full unmodified app.toml, config.toml, and client.toml produced by seid init against the latest tagged seid release. Use these as the canonical reference for every available knob and its default value.
Application-layer configuration: gas, API, gRPC, pruning, SeiDB, EVM, etc.
# This is a TOML config file.
# For more information, see https://github.com/toml-lang/toml

###############################################################################
###                           Base Configuration                            ###
###############################################################################

# The minimum gas prices a validator is willing to accept for processing a
# transaction. A transaction's fees must meet the minimum of any denomination
# specified in this config (e.g. 0.25token1;0.0001token2).
minimum-gas-prices = "0.01usei"

# MinRetainBlocks defines the minimum block height offset from the current block
# for pruning Tendermint blocks. Set to 0 to disable pruning. This only affects
# Tendermint block pruning, not application state (see "pruning-*" configs).
min-retain-blocks = 100000

# ConcurrencyWorkers defines how many workers to run for concurrent transaction execution.
# Default is dynamically set to 2x CPU cores, capped at 128, with a minimum of 10.
concurrency-workers = 10

# occ-enabled defines whether OCC is enabled or not for transaction execution
occ-enabled = true

# HaltHeight contains a non-zero block height at which a node will gracefully
# halt and shutdown that can be used to assist upgrades and testing.
#
# Note: Commitment of state will be attempted on the corresponding block.
halt-height = 0

# HaltTime contains a non-zero minimum block time (in Unix seconds) at which
# a node will gracefully halt and shutdown that can be used to assist upgrades
# and testing.
#
# Note: Commitment of state will be attempted on the corresponding block.
halt-time = 0

# InterBlockCache enables inter-block caching.
inter-block-cache = true

# IndexEvents defines the set of events in the form {eventType}.{attributeKey},
# which informs Tendermint what to index. If empty, all events will be indexed.
#
# Example:
# ["message.sender", "message.recipient"]
index-events = []

# IAVLDisableFastNode enables or disables the fast node feature of IAVL.
# Default is true.
iavl-disable-fastnode = true

# CompactionInterval sets (in seconds) the interval between forced levelDB
# compaction. A value of 0 means no forced levelDB.
# Default is 0.
compaction-interval = 0

# deprecated
no-versioning = false

# Whether to store orphan data (to-be-deleted data pointers) outside the main
# application LevelDB
separate-orphan-storage = false

# if separate-orphan-storage is true, how many versions of orphan data to keep
separate-orphan-versions-to-keep = 0

# if separate-orphan-storage is true, how many orphans to store in each file
num-orphan-per-file = 0

# if separate-orphan-storage is true, where to store orphan data
orphan-dir = ""

###############################################################################
###                        State Sync Configuration                         ###
###############################################################################

# State sync snapshots allow other nodes to rapidly join the network without replaying historical
# blocks, instead downloading and applying a snapshot of the application state at a given height.
[state-sync]

# snapshot-interval specifies the block interval at which local state sync snapshots are
# taken (0 to disable). Must be a multiple of pruning-keep-every.
snapshot-interval = 0

# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all).
snapshot-keep-recent = 2

# snapshot-directory sets the directory for where state sync snapshots are persisted.
# default is empty which will then store under the app home directory same as before.
snapshot-directory = ""

###############################################################################
###                       State Commit Configuration                        ###
###############################################################################

[state-commit]
# Enable defines if the SeiDB should be enabled to override existing IAVL db backend.
sc-enable = true

# Defines the SC store directory, if not explicitly set, default to application home directory
sc-directory = ""

# WriteMode defines how EVM data writes are routed between backends.
# Valid values: cosmos_only, dual_write, split_write, evm_only
# defaults to cosmos_only
sc-write-mode = "cosmos_only"

# ReadMode defines how EVM data reads are routed between backends.
# Valid values: cosmos_only, evm_first, split_read
# defaults to cosmos_only
sc-read-mode = "cosmos_only"

# EnableLatticeHash controls whether the FlatKV lattice hash participates
# in the final app hash. Default: false.
sc-enable-lattice-hash = false

# Max concurrent historical proof queries (RPC /store path)
sc-historical-proof-max-inflight = 1

# Historical proof query rate limit in req/sec (<=0 disables rate limiting)
sc-historical-proof-rate-limit = 1

# Historical proof query burst size
sc-historical-proof-burst = 1

# AsyncCommitBuffer defines the size of asynchronous commit queue, this greatly improve block catching-up
# performance, setting to 0 means synchronous commit.
sc-async-commit-buffer = 100

# KeepRecent defines how many state-commit snapshots (besides the latest one) to keep
# defaults to 0 to only keep one current snapshot
sc-keep-recent = 0

# SnapshotInterval defines the block interval the snapshot is taken, default to 10000 blocks.
sc-snapshot-interval = 10000

# SnapshotMinTimeInterval defines the minimum time interval (in seconds) between snapshots.
# This prevents excessive snapshot creation during catch-up and ensures snapshots don't overlap
# (current snapshot creation takes 3+ hours). Default to 3600 seconds (1 hour).
# Note: If you set a small sc-snapshot-interval (e.g., < 5000), you may want to reduce this value
# to allow more frequent snapshots during normal operation.
sc-snapshot-min-time-interval = 3600

# SnapshotPrefetchThreshold defines the page cache residency threshold (0.0-1.0) to trigger snapshot prefetch.
# Prefetch sequentially reads nodes/leaves files into page cache for faster cold-start replay.
# Only active trees (evm/bank/acc/wasm) are prefetched, skipping sparse kv files to save memory.
# Skips prefetch if more than threshold of pages already resident (e.g., 0.8 = 80%).
# Defaults to 0.8
sc-snapshot-prefetch-threshold = 0.8

# Maximum snapshot write rate in MB/s (global across all trees). 0 = unlimited. Default 100.
sc-snapshot-write-rate-mbps = 100

###############################################################################
###                        FlatKV (EVM) Configuration                       ###
###############################################################################

[state-commit.flatkv]
# Fsync controls whether PebbleDB writes (data DBs + metadataDB) use fsync.
# WAL always uses NoSync (matching memiavl); crash recovery relies on
# WAL catchup, which is idempotent. Default: false.
fsync = false

# AsyncWriteBuffer defines the size of the async write buffer for data DBs.
# Set <= 0 for synchronous writes.
async-write-buffer = 0

# SnapshotInterval defines how often (in blocks) a PebbleDB checkpoint is taken.
# 0 disables auto-snapshots. Default: 10000.
snapshot-interval = 10000

# SnapshotKeepRecent defines how many old snapshots to keep besides the latest one.
# 0 = keep only the current snapshot. Default: 2.
snapshot-keep-recent = 2

###############################################################################
###                         State Store Configuration                       ###
###############################################################################

[state-store]
# Enable defines whether the state-store should be enabled for storing historical data.
# Supporting historical queries or exporting state snapshot requires setting this to true
# This config only take effect when SeiDB is enabled (sc-enable = true)
ss-enable = true

# Defines the directory to store the state store db files
# If not explicitly set, default to application home directory
ss-db-directory = ""

# DBBackend defines the backend database used for state-store.
# Supported backends: pebbledb, rocksdb
# defaults to pebbledb (recommended)
ss-backend = "pebbledb"

# AsyncWriteBuffer defines the async queue length for commits to be applied to State Store
# Set <= 0 for synchronous writes, which means commits also need to wait for data to be persisted in State Store.
# defaults to 100 for asynchronous writes
ss-async-write-buffer = 100

# KeepRecent defines the number of versions to keep in state store
# Setting it to 0 means keep everything
# Default to keep the last 100,000 blocks
ss-keep-recent = 100000

# PruneInterval defines the minimum interval in seconds + some random delay to trigger SS pruning.
# It is recommended to trigger pruning less frequently with a large interval.
# default to 600 seconds
ss-prune-interval = 600

# ImportNumWorkers defines the concurrency for state sync import
# defaults to 1
ss-import-num-workers = 1

# EVMDBDirectory defines the directory for the optional EVM state-store DB(s).
# If unset, defaults to <home>/data/evm_ss when EVM SS is enabled.
evm-ss-db-directory = ""

# WriteMode controls how EVM data writes are routed.
# Supported values: "cosmos_only", "dual_write", "split_write"
evm-ss-write-mode = "cosmos_only"

# ReadMode controls how EVM data reads are routed.
# Supported values: "cosmos_only", "evm_first", "split_read"
evm-ss-read-mode = "cosmos_only"

# SeparateEVMSubDBs controls whether EVM data is split across per-type DBs.
# When false, all EVM data stays in one DB using the current unified layout.
# When true, data is routed to separate DBs while preserving the same evm key prefix format.
evm-ss-separate-dbs = false

###############################################################################
###                        Receipt Store Configuration                      ###
###############################################################################

[receipt-store]
# Backend defines the receipt store backend.
# Supported backends: pebble (aka pebbledb), parquet
# defaults to pebbledb
rs-backend = "pebbledb"

# Defines the receipt store directory. If unset, defaults to <home>/data/receipt.db
db-directory = ""

# AsyncWriteBuffer defines the async queue length for commits to be applied to receipt store.
# Applies only when rs-backend = "pebbledb"; parquet ignores this setting.
# Set <= 0 for synchronous writes.
# defaults to 100
async-write-buffer = 100

# PruneIntervalSeconds defines the interval in seconds to trigger pruning.
# Receipt retention is controlled by the global min-retain-blocks flag.
# defaults to 600 seconds
prune-interval-seconds = 600

###############################################################################
###                            EVM Configuration                            ###
###############################################################################

[evm]
# controls whether an HTTP EVM server is enabled
http_enabled = true
http_port = 8545

# controls whether a websocket server is enabled
ws_enabled = true
ws_port = 8546

# ReadTimeout is the maximum duration for reading the entire
# request, including the body.
# Because ReadTimeout does not let Handlers make per-request
# decisions on each request body's acceptable deadline or
# upload rate, most users will prefer to use
# ReadHeaderTimeout. It is valid to use them both.
read_timeout = "30s"

# ReadHeaderTimeout is the amount of time allowed to read
# request headers. The connection's read deadline is reset
# after reading the headers and the Handler can decide what
# is considered too slow for the body. If ReadHeaderTimeout
# is zero, the value of ReadTimeout is used. If both are
# zero, there is no timeout.
read_header_timeout = "30s"

# WriteTimeout is the maximum duration before timing out
# writes of the response. It is reset whenever a new
# request's header is read. Like ReadTimeout, it does not
# let Handlers make decisions on a per-request basis.
write_timeout = "30s"

# IdleTimeout is the maximum amount of time to wait for the
# next request when keep-alives are enabled. If IdleTimeout
# is zero, the value of ReadTimeout is used. If both are
# zero, ReadHeaderTimeout is used.
idle_timeout = "2m0s"

# Maximum gas limit for simulation
simulation_gas_limit = 10000000

# Timeout for EVM call in simulation
simulation_evm_timeout = "1m0s"

# list of CORS allowed origins, separated by comma
cors_origins = "*"

# list of WS origins, separated by comma
ws_origins = "*"

# timeout for filters
filter_timeout = "2m0s"

# checkTx timeout for sig verify
checktx_timeout = "5s"

# controls whether to have txns go through one by one
slow = false

# Deny list defines list of methods that EVM RPC should fail fast, e.g ["debug_traceBlockByNumber"]
deny_list = []

# Legacy sei_* / sei2_* JSON-RPC (EVM HTTP only - not Cosmos REST on 1317).
#
# DEPRECATION: The sei_* and sei2_* JSON-RPC surfaces are deprecated and scheduled for removal. Do not
# build new integrations on them; use eth_* / debug_* and documented replacements. HTTP 200;
# gate errors use standard JSON-RPC error encoding (see evmrpc/AGENTS.md). Successful allowlisted
# responses are unchanged; nodes may set HTTP header Sei-Legacy-RPC-Deprecation (see AGENTS.md).
#
# Only methods listed in enabled_legacy_sei_apis are allowed. Init defaults enable the three
# address/Cosmos helpers; uncomment optional lines below to enable more legacy methods (include
# sei2_* block methods at the end of the list if you need them).
enabled_legacy_sei_apis = [
  "sei_getSeiAddress",
  "sei_getEVMAddress",
  "sei_getCosmosTx",

  # Optional legacy methods - uncomment to enable (same deprecation applies):
  # "sei_associate",
  # "sei_getBlockByHash",
  # "sei_getBlockByHashExcludeTraceFail",
  # "sei_getBlockByNumber",
  # "sei_getBlockByNumberExcludeTraceFail",
  # "sei_getBlockReceipts",
  # "sei_getBlockTransactionCountByHash",
  # "sei_getBlockTransactionCountByNumber",
  # "sei_getEvmTx",
  # "sei_getFilterChanges",
  # "sei_getFilterLogs",
  # "sei_getLogs",
  # "sei_getTransactionByBlockHashAndIndex",
  # "sei_getTransactionByBlockNumberAndIndex",
  # "sei_getTransactionByHash",
  # "sei_getTransactionCount",
  # "sei_getTransactionErrorByHash",
  # "sei_getTransactionReceipt",
  # "sei_getTransactionReceiptExcludeTraceFail",
  # "sei_getVMError",
  # "sei_newBlockFilter",
  # "sei_newFilter",
  # "sei_sign",
  # "sei_traceBlockByHashExcludeTraceFail",
  # "sei_traceBlockByNumberExcludeTraceFail",
  # "sei_uninstallFilter",
  #
  # Optional sei2_* block namespace (bank transfers in blocks; HTTP only):
  # "sei2_getBlockByHash",
  # "sei2_getBlockByHashExcludeTraceFail",
  # "sei2_getBlockByNumber",
  # "sei2_getBlockByNumberExcludeTraceFail",
  # "sei2_getBlockReceipts",
  # "sei2_getBlockTransactionCountByHash",
  # "sei2_getBlockTransactionCountByNumber",
]

# max number of logs returned if block range is open-ended
max_log_no_block = 10000

# max number of blocks to query logs for
max_blocks_for_log = 2000

# max number of concurrent NewHead subscriptions
max_subscriptions_new_head = 10000

# MaxConcurrentTraceCalls defines the maximum number of concurrent debug_trace calls.
# Set to 0 for unlimited.
max_concurrent_trace_calls = 10

# Max number of blocks allowed to look back for tracing
# Set to -1 for unlimited lookback, which is useful for archive nodes.
max_trace_lookback_blocks = 10000

# Timeout for each trace call
trace_timeout = "30s"

# Enable the parallelized default debug_traceBlock* path.
enable_parallelized_block_trace = false

# WorkerPoolSize defines the number of workers in the worker pool.
# Default: min(64, CPU cores × 2). Capped at 64 to prevent excessive goroutines on high-core machines.
# Set to 0 to use the default.
worker_pool_size = 8

# WorkerQueueSize defines the size of the task queue in the worker pool.
# Default: 1000 tasks. Set to 0 to use the default.
worker_queue_size = 1000

###############################################################################
###                       Giga Executor Configuration                       ###
###############################################################################

[giga_executor]
# enabled controls whether to use the Giga executor (evmone-based) instead of geth's interpreter.
# This is an experimental feature for improved EVM throughput.
# Default: false
enabled = false

# occ_enabled controls whether to use OCC (Optimistic Concurrency Control) with the Giga executor.
# When true, transactions are executed in parallel with conflict detection and retry.
# Default: false
occ_enabled = false

###############################################################################
###                       Admin Configuration (Auto-managed)                ###
###############################################################################
 
[admin_server]
 
# Enable the admin gRPC server for runtime log level control.
admin_enabled = false
 
# Listen address for the admin gRPC server. Must be a loopback address.
admin_address = "127.0.0.1:9095"

###############################################################################
###                   Telemetry Configuration (Auto-managed)                ###
###############################################################################

[telemetry]

# Prefixed with keys to separate services.
service-name = ""

# Enabled enables the application telemetry functionality. When enabled,
# an in-memory sink is also enabled by default. Operators may also enabled
# other sinks such as Prometheus.
enabled = true

# Enable prefixing gauge values with hostname.
enable-hostname = false

# Enable adding hostname to labels.
enable-hostname-label = false

# Enable adding service to labels.
enable-service-label = false

# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink.
prometheus-retention-time = 7200

# When both 'api.enable' and 'telemetry.enabled' are true, this node will expose
# application metrics (custom Cosmos SDK metrics) on the API server endpoint along with the
# Tendermint metrics (port 26660) which are always enabled.

# GlobalLabels defines a global set of name/value label tuples applied to all
# metrics emitted using the wrapper functions defined in telemetry package.
#
# Example:
# [["chain_id", "cosmoshub-1"]]
global-labels = []

###############################################################################
###                       API Configuration (Auto-managed)                  ###
###############################################################################

[api]

# Enable defines if the API server should be enabled.
enable = true

# Swagger defines if swagger documentation should automatically be registered.
swagger = true

# Address defines the API server to listen on.
address = "tcp://0.0.0.0:1317"

# MaxOpenConnections defines the number of maximum open connections.
max-open-connections = 1000

# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds).
rpc-read-timeout = 10

# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds).
rpc-write-timeout = 0

# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes).
rpc-max-body-bytes = 1000000

# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enabled-unsafe-cors = false

###############################################################################
###                     Rosetta Configuration (Auto-managed)                ###
###############################################################################

[rosetta]

# Enable defines if the Rosetta API server should be enabled.
enable = false

# Address defines the Rosetta API server to listen on.
address = ":8080"

# Network defines the name of the blockchain that will be returned by Rosetta.
blockchain = "app"

# Network defines the name of the network that will be returned by Rosetta.
network = "network"

# Retries defines the number of retries when connecting to the node before failing.
retries = 3

# Offline defines if Rosetta server should run in offline mode.
offline = false

###############################################################################
###                       gRPC Configuration (Auto-managed)                 ###
###############################################################################

[grpc]

# Enable defines if the gRPC server should be enabled.
enable = true

# Address defines the gRPC server address to bind to.
address = "0.0.0.0:9090"

###############################################################################
###                        gRPC Web Configuration (Auto-managed)            ###
###############################################################################

[grpc-web]

# GRPCWebEnable defines if the gRPC-web should be enabled.
# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op.
enable = true

# Address defines the gRPC-web server address to bind to.
address = "0.0.0.0:9091"

# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enable-unsafe-cors = false

###############################################################################
###                         Genesis Configuration (Auto-managed)            ###
###############################################################################

# Genesis config allows configuring whether to stream from an genesis json file in streamed form
[genesis]

# stream-import specifies whether to the stream the import from the genesis json file. The genesis
# file must be in stream form and exported in a streaming fashion.
stream-import = false

# genesis-stream-file specifies the path of the genesis json file to stream from.
genesis-stream-file = ""

###############################################################################
###                    Legacy IAVL Settings (Auto-managed)                  ###
###############################################################################

[iavl]
# Pruning Strategies:
# - default: Keep the recent 362880 blocks and prune is triggered every 10 blocks
# - nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node)
# - everything: all saved states will be deleted, storing only the recent 2 blocks; pruning at every block
# - custom: allow pruning options to be manually specified through 'pruning-keep-recent' and 'pruning-interval'
# Pruning strategy is completely ignored when seidb is enabled
pruning = "nothing"

# These are applied if and only if the pruning strategy is custom, and seidb is not enabled
pruning-keep-recent = "0"
pruning-keep-every = "0"
pruning-interval = "0"

###############################################################################
###                        WASM Configuration (Auto-managed)                ###
###############################################################################

[wasm]
# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries
query_gas_limit = 300000
# This is the number of wasm vm instances we keep cached in memory for speed-up
# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally
lru_size = 0

###############################################################################
###                     ETH Replay Configuration (Auto-managed)             ###
###############################################################################

[eth_replay]
eth_replay_enabled = false
eth_rpc = "http://44.234.105.54:18545"
eth_data_dir = "/root/.ethereum/chaindata"
eth_replay_contract_state_checks = false

###############################################################################
###                   ETH Block Test Configuration (Auto-managed)           ###
###############################################################################

[eth_blocktest]
eth_blocktest_enabled = false
eth_blocktest_test_data_path = "~/testdata/"

###############################################################################
###                    EVM Query Configuration (Auto-managed)               ###
###############################################################################

[evm_query]
evm_query_gas_limit = 300000

###############################################################################
###                 Light Invariance Configuration (Auto-managed)           ###
###############################################################################

[light_invariance]
supply_enabled = true

Database Management

Architecture

Sei stores chain data through SeiDB, a two-layer design that replaces the legacy single-database IAVL store with separate hot- and historical-data tiers:
  1. State Commit (SC) — the active chain state used for transaction execution and to compute the per-block app hash. Cosmos modules sit on a memory-mapped Merkle tree (memiavl) ported from Cronos. EVM state can additionally be routed through FlatKV, an EVM-tuned PebbleDB store with per-type sub-databases (account, code, storage, legacy, metadata). Routing is controlled by sc-write-mode / sc-read-mode and defaults to memiavl-only — FlatKV is only opened when one of those modes is set to a non-default value.
  2. State Store (SS) — versioned raw key/value pairs used for historical queries. Required for any node that serves RPC. The default backend is PebbleDB; RocksDB is available for iteration-heavy workloads such as archive nodes or RPC nodes that run a lot of debug_trace* (see the RocksDB Backend Guide for build instructions).
The legacy IAVL backend is still selectable via sc-enable = false but is deprecated and slated for removal — new deployments and existing nodes should run on SeiDB.

SeiDB Configuration

The full set of knobs is in the auto-generated Default Configurations above. The block below covers the values most node operators tune in practice.
[state-commit]
# Enable SeiDB. Disable to fall back to legacy IAVL.
sc-enable = true

# Async commit queue. Larger values improve catch-up; 0 = synchronous.
sc-async-commit-buffer = 100

# How many memiavl snapshots to keep besides the latest one.
# 0 = current snapshot only. Set to 1 if you serve IBC light-client queries
# so relayers can verify against an older snapshot height.
sc-keep-recent = 1

# Take a state-commit snapshot every N blocks.
sc-snapshot-interval = 10000

# Minimum wall-clock interval (seconds) between snapshots; prevents overlap
# during catch-up. Lower this if you set sc-snapshot-interval below ~5000.
sc-snapshot-min-time-interval = 3600

# Cap on snapshot write throughput across all trees (MB/s). 0 = unlimited.
sc-snapshot-write-rate-mbps = 100

# EVM data routing between the Cosmos memiavl tree and FlatKV.
# Default: cosmos_only / cosmos_only — all EVM state lives in memiavl. See
# the Giga Storage section below for the dual_write + split_read setup.
sc-write-mode = "cosmos_only"
sc-read-mode = "cosmos_only"
sc-enable-lattice-hash = false

[state-commit.flatkv]
# FlatKV is the EVM-optimized commit store (PebbleDB). It is only opened
# when sc-write-mode is dual_write or split_write — otherwise these
# settings have no effect. WAL crash recovery is idempotent, so fsync
# stays off by default.
fsync = false
async-write-buffer = 0
snapshot-interval = 10000
snapshot-keep-recent = 2

[state-store]
# Historical SS layer. Validators can disable this to save disk; any node
# serving RPC must keep it on.
ss-enable = true

# pebbledb (default) or rocksdb (faster iteration, archive-friendly).
ss-backend = "pebbledb"

ss-async-write-buffer = 100
# Versions to retain. 0 = keep everything (archive-style). 100,000 ≈ 28h.
ss-keep-recent = 100000
# Pruning interval, plus a small random jitter, to avoid colliding with
# snapshot creation.
ss-prune-interval = 600

# Optional EVM SS routing — same semantics as the SC modes above. Leave on
# cosmos_only unless you have completed the Giga SS Store migration.
evm-ss-write-mode = "cosmos_only"
evm-ss-read-mode = "cosmos_only"
evm-ss-separate-dbs = false

[receipt-store]
# pebbledb (default) or parquet. Receipts are pruned together with blocks
# according to min-retain-blocks above.
rs-backend = "pebbledb"
async-write-buffer = 100
prune-interval-seconds = 600
Setting very small (more frequent) pruning intervals may collide with snapshot creation. Too-large (less frequent) intervals mean pruning takes longer overall, which can cause missed blocks and excessive resync time.

Giga Storage and Giga Executor

These are two separate opt-in features that ship in newer seid releases. Both default to off; only enable them deliberately and after following the relevant migration guide. Giga Storage repartitions SeiDB so EVM state lives in its own databases at both the SC and SS layers, freeing non-EVM modules from EVM write amplification.
For step-by-step instructions — including the full state-sync flow, startup verification, safety checks, and rollback — see the Giga SS Store Migration Guide. The snippet below is just the resulting app.toml shape.
[state-commit]
sc-write-mode = "dual_write"   # write EVM data to memiavl AND FlatKV
sc-read-mode = "split_read"    # read EVM data from FlatKV
sc-enable-lattice-hash = true  # required for split-mode app-hash equality

[state-store]
evm-ss-write-mode = "split_write"
evm-ss-read-mode = "split_read"
Enabling Giga Storage requires a fresh state sync — flipping the EVM SS modes on a node with existing data fails the startup safety checks because the new EVM SS DB starts empty while Cosmos SS already has history. The full procedure is in the Giga SS Store Migration Guide and is currently supported on RPC nodes only; validators and archive nodes are not yet covered. Giga Executor is independent of Giga Storage. It swaps the EVM interpreter from go-ethereum’s geth to an evmone-based executor for higher throughput, with optional OCC parallelism on top:
[giga_executor]
# Use the evmone-based executor instead of geth's interpreter. Experimental.
enabled = false
# Run Giga-executed txs in parallel with Optimistic Concurrency Control.
occ_enabled = false

Database Maintenance

The database is typically stable and can be left alone, although some attention may be required:
# Check database size
du -sh $HOME/.sei/data/

# Confirm correct file paths as per your own setup before proceeding
# Before performing a database wipe, ensure you back up essential files:
# - `node_key.json`: Preserves node identity to maintain peer connections.
# - `priv_validator_key.json`: Critical for validators; losing this key results in double signing risks.
# - `config.toml` & `app.toml`: Retains node-specific configuration.
# - `genesis.json`: Required for correct chain initialization.

# Compact database to optimize storage (only if needed)
find $HOME/.sei/data/ -mindepth 1 ! -name 'priv_validator_state.json' -delete && rm -rf $HOME/.sei/wasm


# Backup database
cp -r $HOME/.sei/data/ $HOME/sei-backup-$(date +%Y%m%d)/

Service Management

Systemd Commands

# Check service status
systemctl status seid

# Start service
systemctl start seid

# Stop service
systemctl stop seid

# Restart service
systemctl restart seid

# View logs in real time
journalctl -fu seid -o cat

Log Management

Prevent logs from consuming excessive disk space by enabling rotation:
sudo tee /etc/logrotate.d/sei > /dev/null << EOF
/var/log/sei/*.log {
    daily
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 sei sei
    sharedscripts
    postrotate
        systemctl reload seid
    endscript
}
EOF

Update Procedures

Minor Updates

For minor updates that are non-consensus-breaking:
# Stop node
sudo systemctl stop seid

# Update binary
cd sei-chain
git fetch --all
git checkout [new-version]
make install

# Restart node
sudo systemctl restart seid

Major Updates

For major upgrades that introduce state-breaking changes:
  1. Wait for the designated upgrade block height [this can be seen in the upgrade proposal under ‘plan’]
  2. The node will halt automatically.
  3. Update/replace the binary
  4. Restart the node.
# After node halts
cd sei-chain
git pull
git checkout [new-version]
make install
sudo systemctl restart seid
Build the upgrade before the halt-height so you can quickly replace it with minimal downtime.

Performance Optimization

Performance optimizations can yield different results depending on your system’s hardware, workload, and network conditions. Before implementing any changes, research and test them in a controlled environment to ensure they align with your specific configuration and requirements. Always back up important data before making modifications.

Memory Management (sysctl tuning)

Optimizing memory management settings can help improve performance and stability, particularly for high-load nodes. These settings control swap usage and the handling of dirty (unwritten) pages in RAM.
vm.swappiness = 1  # Reduce swapping to disk, ensuring RAM is used efficiently before relying on slower swap space
vm.dirty_background_ratio = 3  # The percentage of system memory that can be filled with "dirty" pages before background writing begins
vm.dirty_ratio = 10  # The maximum percentage of system memory that can be filled with "dirty" pages before a full flush is triggered
vm.dirty_expire_centisecs = 300  # Time (in hundredths of a second) before dirty data is written to disk
vm.dirty_writeback_centisecs = 100  # Frequency (in hundredths of a second) at which the system writes "dirty" pages to disk

Network Stack Optimization

Tuning the network stack can enhance packet processing efficiency and throughput, particularly for nodes handling a large number of peers and high transaction volume.
net.core.somaxconn = 32768  # max connections in queued
net.core.netdev_max_backlog = 32768  # packets allowed in queue before dropping incoming packets
net.ipv4.tcp_max_syn_backlog = 16384  # outstanding SYN requests (half-open connections) allowed before dropping new connections
net.core.rmem_max = 16777216  # receive buffer size for network sockets
net.core.wmem_max = 16777216  # send buffer size for network sockets

Storage Optimization

Optimizing storage settings can significantly reduce write latency and improve database performance, especially for nodes using NVMe SSDs.
echo "none" > /sys/block/nvme0n1/queue/scheduler  # disable I/O scheduler to reduce latency
blockdev --setra 4096 /dev/nvme0n1  # readahead value to optimize sequential reads

Backup and Recovery

Regular Backups

Automate backups to avoid data loss:
#!/bin/bash
BACKUP_DIR="/backup/sei"
DATE=$(date +%Y%m%d)

# Stop service
systemctl stop seid

# Create backup
tar czf $BACKUP_DIR/sei-backup-$DATE.tar.gz $HOME/.sei/

# Restart service
systemctl start seid

Recovery Procedure

Restoring from backup in case of corruption or accidental deletion:
# Stop node
systemctl stop seid

# Remove corrupted data
rm -rf $HOME/.sei/data/

# Restore from backup
tar xzf sei-backup-[date].tar.gz -C /

# Restart node
systemctl start seid

Security Considerations

  • Use firewalls and rate-limiting to prevent attacks
  • Keep your system and node software updated
  • Secure SSH access with key-based authentication
  • Protect validator keys with offline storage or hardware security modules (HSMs)
For more in-depth system and configuration guidelines, refer to the Advanced Configuration and Monitoring Guide.