> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sei.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Sei Node Operations Guide

> Detailed guide for running and maintaining Sei nodes. Learn about configuration management, database maintenance, service management, and update procedures.

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/`:

```bash theme={"dark"}
$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](#default-configurations) at the bottom of this
section.

### Essential Configuration Parameters

#### Network Settings (config.toml)

```toml theme={"dark"}
[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)

```toml theme={"dark"}
# Minimum gas prices to prevent spam transactions
# (mainnet enforces a chain-wide minimum of 0.02usei)
minimum-gas-prices = "0.02usei"

# 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.

<Tabs>
  <Tab title="app.toml">
    Application-layer configuration: gas, API, gRPC, pruning, SeiDB, EVM, etc.

    ```toml theme={"dark"}
    # 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 = ""

    # EVMSplit controls whether EVM data is routed to a dedicated SS backend.
    # When false (default), EVM data lives in the Cosmos SS backend alongside
    # everything else. When true, EVM data is routed exclusively to the EVM SS
    # backend; non-EVM data stays in Cosmos SS. No fallback between backends.
    evm-ss-split = false

    # 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
    ```
  </Tab>

  <Tab title="config.toml">
    Tendermint / consensus-layer configuration: P2P, RPC, mempool, consensus,
    state-sync, etc.

    ```toml theme={"dark"}
    # This is a TOML config file.
    # For more information, see https://github.com/toml-lang/toml

    # NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or
    # relative to the home directory (e.g. "data"). The home directory is
    # "$HOME/.tendermint" by default, but could be changed via $TMHOME env variable
    # or --home cmd flag.

    #######################################################################
    ###                   Main Base Config Options                      ###
    #######################################################################

    # TCP or UNIX socket address of the ABCI application,
    # or the name of an ABCI application compiled in with the Tendermint binary
    proxy-app = "tcp://127.0.0.1:26658"

    # A custom human readable name for this node
    moniker = "docs-example"

    # Mode of Node: full | validator | seed
    # * validator node
    #   - all reactors
    #   - with priv_validator_key.json, priv_validator_state.json
    # * full node
    #   - all reactors
    #   - No priv_validator_key.json, priv_validator_state.json
    # * seed node
    #   - only P2P, PEX Reactor
    #   - No priv_validator_key.json, priv_validator_state.json
    mode = "full"

    # Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb
    # * goleveldb (github.com/syndtr/goleveldb - most popular implementation)
    #   - pure go
    #   - stable
    # * cleveldb (uses levigo wrapper)
    #   - fast
    #   - requires gcc
    #   - use cleveldb build tag (go build -tags cleveldb)
    # * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt)
    #   - EXPERIMENTAL
    #   - may be faster is some use-cases (random reads - indexer)
    #   - use boltdb build tag (go build -tags boltdb)
    # * rocksdb (uses github.com/tecbot/gorocksdb)
    #   - EXPERIMENTAL
    #   - requires gcc
    #   - use rocksdb build tag (go build -tags rocksdb)
    # * badgerdb (uses github.com/dgraph-io/badger)
    #   - EXPERIMENTAL
    #   - use badgerdb build tag (go build -tags badgerdb)
    db-backend = "goleveldb"

    # Database directory
    db-dir = "data"

    # Output level for logging, including package level options
    log-level = "info"

    # Output format: 'plain' (colored text) or 'json'
    log-format = "text"

    ##### additional base config options #####

    # Path to the JSON file containing the initial validator set and other meta data
    genesis-file = "config/genesis.json"

    # Path to the JSON file containing the private key to use for node authentication in the p2p protocol
    node-key-file = "config/node_key.json"

    # Mechanism to connect to the ABCI application: socket | grpc
    abci = "socket"

    # If true, query the ABCI app on connecting to a new peer
    # so the app can decide if we should keep the connection or not
    filter-peers = false

    #######################################################################
    ###                 Advanced Configuration Options                  ###
    #######################################################################

    #######################################################
    ###       RPC Server Configuration Options          ###
    #######################################################
    [rpc]

    # TCP or UNIX socket address for the RPC server to listen on
    laddr = "tcp://0.0.0.0:26657"

    # A list of origins a cross-domain request can be executed from
    # Default value '[]' disables cors support
    # Use '["*"]' to allow any origin
    cors-allowed-origins = []

    # A list of methods the client is allowed to use with cross-domain requests
    cors-allowed-methods = ["HEAD", "GET", "POST", ]

    # A list of non simple headers the client is allowed to use with cross-domain requests
    cors-allowed-headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ]

    # Activate unsafe RPC commands like /dial-seeds and /unsafe-flush-mempool
    unsafe = false

    # Maximum number of simultaneous connections (including WebSocket).
    # If you want to accept a larger number than the default, make sure
    # you increase your OS limits.
    # 0 - unlimited.
    # Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
    # 1024 - 40 - 10 - 50 = 924 = ~900
    max-open-connections = 900

    # Maximum number of unique clientIDs that can /subscribe
    # If you're using /broadcast_tx_commit, set to the estimated maximum number
    # of broadcast_tx_commit calls per block.
    max-subscription-clients = 100

    # Maximum number of unique queries a given client can /subscribe to
    # If you're using a Local RPC client and /broadcast_tx_commit, set this
    # to the estimated maximum number of broadcast_tx_commit calls per block.
    max-subscriptions-per-client = 5

    # If true, disable the websocket interface to the RPC service.  This has
    # the effect of disabling the /subscribe, /unsubscribe, and /unsubscribe_all
    # methods for event subscription.
    #
    # EXPERIMENTAL: This setting will be removed in Tendermint v0.37.
    experimental-disable-websocket = false

    # The time window size for the event log. All events up to this long before
    # the latest (up to EventLogMaxItems) will be available for subscribers to
    # fetch via the /events method.  If 0 (the default) the event log and the
    # /events RPC method are disabled.
    event-log-window-size = "30s"

    # The maxiumum number of events that may be retained by the event log.  If
    # this value is 0, no upper limit is set. Otherwise, items in excess of
    # this number will be discarded from the event log.
    #
    # Warning: This setting is a safety valve. Setting it too low may cause
    # subscribers to miss events.  Try to choose a value higher than the
    # maximum worst-case expected event load within the chosen window size in
    # ordinary operation.
    #
    # For example, if the window size is 10 minutes and the node typically
    # averages 1000 events per ten minutes, but with occasional known spikes of
    # up to 2000, choose a value > 2000.
    event-log-max-items = 0

    # How long to wait for a tx to be committed during /broadcast_tx_commit.
    # WARNING: Using a value larger than 10s will result in increasing the
    # global HTTP write timeout, which applies to all connections and endpoints.
    # See https://github.com/tendermint/tendermint/issues/3435
    timeout-broadcast-tx-commit = "10s"

    # Maximum size of request body, in bytes
    max-body-bytes = 1000000

    # Maximum size of request header, in bytes
    max-header-bytes = 1048576

    # The path to a file containing certificate that is used to create the HTTPS server.
    # Might be either absolute path or path related to Tendermint's config directory.
    # If the certificate is signed by a certificate authority,
    # the certFile should be the concatenation of the server's certificate, any intermediates,
    # and the CA's certificate.
    # NOTE: both tls-cert-file and tls-key-file must be present for Tendermint to create HTTPS server.
    # Otherwise, HTTP server is run.
    tls-cert-file = ""

    # The path to a file containing matching private key that is used to create the HTTPS server.
    # Might be either absolute path or path related to Tendermint's config directory.
    # NOTE: both tls-cert-file and tls-key-file must be present for Tendermint to create HTTPS server.
    # Otherwise, HTTP server is run.
    tls-key-file = ""

    # pprof listen address (https://golang.org/pkg/net/http/pprof)
    pprof-laddr = ""

    # timeout for any read request
    timeout-read = "10s"

    #######################################################################
    ###           P2P Configuration Options                             ###
    #######################################################################
    [p2p]

    # Select the p2p internal queue
    queue-type = "simple-priority"

    # Address to listen for incoming connections
    laddr = "tcp://0.0.0.0:26656"

    # Address to advertise to peers for them to dial
    # If empty, will use the same port as the laddr,
    # and will introspect on the listener or use UPnP
    # to figure out the address. ip and port are required
    # example: 159.89.10.97:26656
    external-address = ""

    # Comma separated list of peers to be added to the peer store
    # on startup. Either BootstrapPeers or PersistentPeers are
    # needed for peer discovery
    bootstrap-peers = ""

    # Comma separated list of nodes to keep persistent connections to
    persistent-peers = ""

    # Comma separated list of nodes for block sync only
    blocksync-peers = ""

    # UPNP port forwarding
    upnp = false

    # Maximum number of connections (inbound and outbound).
    max-connections = 100

    # Rate limits the number of incoming connection attempts per IP address.
    max-incoming-connection-attempts = 100

    # Set true to enable the peer-exchange reactor
    pex = true

    # Comma separated list of peer IDs to keep private (will not be gossiped to other peers)
    # Warning: IPs will be exposed at /net_info, for more information https://github.com/tendermint/tendermint/issues/3055
    private-peer-ids = ""

    # Toggle to disable guard against peers connecting from the same ip.
    allow-duplicate-ip = false

    # Peer connection configuration.
    handshake-timeout = "10s"
    dial-timeout = "3s"

    # Time to wait before flushing messages out on the connection
    # TODO: Remove once MConnConnection is removed.
    flush-throttle-timeout = "100ms"

    # Maximum size of a message packet payload, in bytes
    # TODO: Remove once MConnConnection is removed.
    # WARNING: coordinate before changing this default; impacts network interoperability
    max-packet-msg-payload-size = 1000000

    # Rate at which packets can be sent, in bytes/second
    # TODO: Remove once MConnConnection is removed.
    send-rate = 20971520

    # Rate at which packets can be received, in bytes/second
    # TODO: Remove once MConnConnection is removed.
    recv-rate = 20971520

    # List of node IDs, to which a connection will be (re)established, dropping an existing peer if any existing limit has been reached
    unconditional-peer-ids = ""

    #######################################################################
    ###          Mempool Configuration Options                          ###
    #######################################################################
    [mempool]

    # recheck has been moved from a config option to a global
    # consensus param in v0.36
    # See https://github.com/tendermint/tendermint/issues/8244 for more information.

    # Set true to broadcast transactions in the mempool to other nodes
    broadcast = true

    # Maximum number of transactions in the mempool
    size = 5000

    # Limit the total size of all txs in the mempool.
    # This only accounts for raw transactions (e.g. given 1MB transactions and
    # max-txs-bytes=5MB, mempool will only accept 5 transactions).
    max-txs-bytes = 1073741824

    # Size of the cache (used to filter transactions we saw earlier) in transactions
    cache-size = 10000

    # Size of the cache duplicate tx keys for tracking metrics
    duplicate-txs-cache-size = "100000"

    # Do not remove invalid transactions from the cache (default: false)
    # Set to true if it's not possible for any invalid transaction to become valid
    # again in the future.
    keep-invalid-txs-in-cache = false

    # Maximum size of a single transaction.
    # NOTE: the max size of a tx transmitted over the network is {max-tx-bytes}.
    max-tx-bytes = 1048576

    # Maximum size of a batch of transactions to send to a peer
    # Including space needed by encoding (one varint per transaction).
    # XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796
    max-batch-bytes = 0

    # ttl-duration, if non-zero, defines the maximum amount of time a transaction
    # can exist for in the mempool.
    #
    # Note, if ttl-num-blocks is also defined, a transaction will be removed if it
    # has existed in the mempool at least ttl-num-blocks number of blocks or if it's
    # insertion time into the mempool is beyond ttl-duration.
    ttl-duration = "5s"

    # ttl-num-blocks, if non-zero, defines the maximum number of blocks a transaction
    # can exist for in the mempool.
    #
    # Note, if ttl-duration is also defined, a transaction will be removed if it
    # has existed in the mempool at least ttl-num-blocks number of blocks or if
    # it's insertion time into the mempool is beyond ttl-duration.
    ttl-num-blocks = 10

    tx-notify-threshold = 0

    check-tx-error-blacklist-enabled = true

    check-tx-error-threshold = 50

    pending-size = 5000

    max-pending-txs-bytes = 1073741824

    pending-ttl-duration = "0s"

    pending-ttl-num-blocks = 0

    # Defines the percentage of transactions with the lowest priority hint
    # (expressed as a percentage in the range [0.0, 1.0]) that will be
    # dropped from the mempool once the configured utilisation threshold
    # is reached.
    drop-priority-threshold = 0.1

    # Defines the mempool utilisation level (expressed as a percentage in
    # the range [0.0, 1.0]) above which transactions will be selectively
    # dropped based on their priority hint.
    #
    # For example, if this parameter is set to 0.8, then once the mempool reaches
    # 80% capacity, transactions with priority hints below drop-priority-threshold
    # percentile will be dropped to make room for new transactions.
    drop-utilisation-threshold = 1

    # Defines the size of the reservoir for keeping track
    # of the distribution of transaction priorities in the mempool.
    #
    # This is used to determine the priority threshold below which transactions will
    # be dropped when the mempool utilisation exceeds drop-priority-threshold.
    #
    # The reservoir is a statistically representative sample of transaction
    # priorities in the mempool, and is used to estimate the priority distribution
    # without needing to store all transaction priorities.
    #
    # A larger reservoir size will yield a more accurate estimate of the priority
    # distribution, but will consume more memory.
    #
    # The default value of 10,240 is a reasonable compromise between accuracy and
    # memory usage for most use cases. It takes approximately 80KB of memory storing
    # int64 transaction priorities.
    #
    # See DropUtilisationThreshold and DropPriorityThreshold.
    drop-priority-reservoir-size = 10240

    #######################################################################
    ###         State Sync Configuration Options                        ###
    #######################################################################
    [statesync]
    # State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine
    # snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in
    # the network to take and serve state machine snapshots. State sync is not attempted if the node
    # has any local state (LastBlockHeight > 0). The node will have a truncated block history,
    # starting from the height of the snapshot.
    enable = false

    # State sync uses light client verification to verify state. This can be done either through the
    # P2P layer or RPC layer. Set this to true to use the P2P layer. If false (default), RPC layer
    # will be used.
    use-p2p = false

    # If using RPC, at least two addresses need to be provided. They should be compatible with net.Dial,
    # for example: "host.example.com:2125"
    rpc-servers = ""

    # The hash and height of a trusted block. Must be within the trust-period.
    trust-height = 0
    trust-hash = ""

    # The trust period should be set so that Tendermint can detect and gossip misbehavior before
    # it is considered expired. For chains based on the Cosmos SDK, one day less than the unbonding
    # period should suffice.
    trust-period = "168h0m0s"

    # Backfill sequentially fetches after state sync completes, verifies and stores light blocks in reverse order.
    # backfill-blocks means it will keep reverse fetching up to backfill-blocks number of blocks behind state sync position
    # backfill-duration means it will keep fetching up to backfill-duration old time
    # The actual backfill process will take at backfill-blocks as priority:
    # - If backfill-blocks is set, use backfill-blocks to backfill
    # - If backfill-blocks is not set to be greater than 0, use backfill-duration to backfill
    backfill-blocks = "0"
    backfill-duration = "0s"

    # Time to spend discovering snapshots before initiating a restore.
    discovery-time = "15s"

    # Temporary directory for state sync snapshot chunks, defaults to os.TempDir().
    # The synchronizer will create a new, randomly named directory within this directory
    # and remove it when the sync is complete.
    temp-dir = ""

    # Whether to use local snapshot only for state sync or not.
    # If this is true, then state sync will look for existing snapshots
    # which are located in the snapshot-dir configured in app.toml (default to [home-dir]/data/snapshots)
    use-local-snapshot = false

    # The timeout duration before re-requesting a chunk, possibly from a different
    # peer (default: 15 seconds).
    chunk-request-timeout = "15s"

    # The number of concurrent chunk and block fetchers to run (default: 4).
    fetchers = "2"

    verify-light-block-timeout = "1m0s"

    blacklist-ttl = "5m0s"

    #######################################################################
    ###         Consensus Configuration Options                         ###
    #######################################################################
    [consensus]

    wal-file = "data/cs.wal/wal"

    # How many blocks to look back to check existence of the node's consensus votes before joining consensus
    # When non-zero, the node will panic upon restart
    # if the same consensus key was used to sign {double-sign-check-height} last blocks.
    # So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic.
    double-sign-check-height = 0

    # EmptyBlocks mode and possible interval between empty blocks
    create-empty-blocks = true
    create-empty-blocks-interval = "0s"

    # Only gossip hashes, not the actual data
    gossip-tx-key-only = "true"

    # Reactor sleep duration parameters
    peer-gossip-sleep-duration = "100ms"
    peer-query-maj23-sleep-duration = "2s"

    ### Unsafe Timeout Overrides ###

    # These fields provide temporary overrides for the Timeout consensus parameters.
    # Use of these parameters is strongly discouraged. Using these parameters may have serious
    # liveness implications for the validator and for the chain.
    #
    # These fields will be removed from the configuration file in the v0.37 release of Tendermint.
    # For additional information, see ADR-74:
    # https://github.com/tendermint/tendermint/blob/master/docs/architecture/adr-074-timeout-params.md

    # This field provides an unsafe override of the Propose timeout consensus parameter.
    # This field configures how long the consensus engine will wait for a proposal block before prevoting nil.
    # If this field is set to a value greater than 0, it will take effect.
    unsafe-propose-timeout-override = "0s"

    # This field provides an unsafe override of the ProposeDelta timeout consensus parameter.
    # This field configures how much the propose timeout increases with each round.
    # If this field is set to a value greater than 0, it will take effect.
    unsafe-propose-timeout-delta-override = "0s"

    # This field provides an unsafe override of the Vote timeout consensus parameter.
    # This field configures how long the consensus engine will wait after
    # receiving +2/3 votes in a round.
    # If this field is set to a value greater than 0, it will take effect.
    unsafe-vote-timeout-override = "0s"

    # This field provides an unsafe override of the VoteDelta timeout consensus parameter.
    # This field configures how much the vote timeout increases with each round.
    # If this field is set to a value greater than 0, it will take effect.
    unsafe-vote-timeout-delta-override = "0s"

    # This field provides an unsafe override of the Commit timeout consensus parameter.
    # This field configures how long the consensus engine will wait after receiving
    # +2/3 precommits before beginning the next height.
    # If this field is set to a value greater than 0, it will take effect.
    unsafe-commit-timeout-override = "0s"

    # This field provides an unsafe override of the BypassCommitTimeout consensus parameter.
    # This field configures if the consensus engine will wait for the full Commit timeout
    # before proceeding to the next height.
    # If this field is set to true, the consensus engine will proceed to the next height
    # as soon as the node has gathered votes from all of the validators on the network.
    # unsafe-bypass-commit-timeout-override = <nil>

    #######################################################################
    ###   Transaction Indexer Configuration (Auto-managed)              ###
    #######################################################################
    [tx-index]

    # The backend database list to back the indexer.
    # If list contains "null" or "", meaning no indexer service will be used.
    #
    # The application will set which txs to index. In some cases a node operator will be able
    # to decide which txs to index based on configuration set in the application.
    #
    # Options:
    #   1) "null" (default) - no indexer services.
    #   2) "kv" - a simple indexer backed by key-value storage (see DBBackend)
    #   3) "psql" - the indexer services backed by PostgreSQL.
    # When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed.
    indexer = ["kv"]

    # The PostgreSQL connection configuration, the connection format:
    #   postgresql://<user>:<password>@<host>:<port>/<db>?<opts>
    psql-conn = ""

    #######################################################################
    ###       Instrumentation Configuration (Auto-managed)             ###
    #######################################################################
    [instrumentation]

    # When true, Prometheus metrics are served under /metrics on
    # PrometheusListenAddr.
    # Check out the documentation for the list of available metrics.
    prometheus = false

    # Address to listen for Prometheus collector(s) connections
    prometheus-listen-addr = ":26660"

    # Maximum number of simultaneous connections.
    # If you want to accept a larger number than the default, make sure
    # you increase your OS limits.
    # 0 - unlimited.
    max-open-connections = 3

    # Instrumentation namespace
    namespace = "tendermint"

    #######################################################################
    ###       Priv Validator Configuration (Auto-managed)              ###
    #######################################################################
    [priv-validator]

    # Path to the JSON file containing the private key to use as a validator in the consensus protocol
    key-file = "config/priv_validator_key.json"

    # Path to the JSON file containing the last sign state of a validator
    state-file = "data/priv_validator_state.json"

    # TCP or UNIX socket address for Tendermint to listen on for
    # connections from an external PrivValidator process
    # when the listenAddr is prefixed with grpc instead of tcp it will use the gRPC Client
    laddr = ""

    # Path to the client certificate generated while creating needed files for secure connection.
    # If a remote validator address is provided but no certificate, the connection will be insecure
    client-certificate-file = ""

    # Client key generated while creating certificates for secure connection
    client-key-file = ""

    # Path to the Root Certificate Authority used to sign both client and server certificates
    root-ca-file = ""

    #######################################################################
    ###       SelfRemediation Configuration (Auto-managed)             ###
    #######################################################################
    [self-remediation]

    # If the node has no p2p peers available then trigger a restart
    # Set to 0 to disable
    p2p-no-peers-available-window-seconds = 0

    # If node has no peers for statesync after a period of time then restart
    # Set to 0 to disable
    statesync-no-peers-available-window-seconds = 0

    # Threshold for how far back the node can be behind the current block height before triggering a restart
    # Set to 0 to disable
    blocks-behind-threshold = 0

    # How often to check if node is behind
    blocks-behind-check-interval = 60

    # Cooldown between each restart
    restart-cooldown-seconds = 600
    ```
  </Tab>

  <Tab title="client.toml">
    CLI and client defaults used by `seid` itself (chain id, keyring backend,
    output format, node endpoint).

    ```toml theme={"dark"}
    # This is a TOML config file.
    # For more information, see https://github.com/toml-lang/toml

    ###############################################################################
    ###                           Client Configuration                            ###
    ###############################################################################

    # The network chain ID
    chain-id = "pacific-1"
    # The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory)
    keyring-backend = "os"
    # CLI output format (text|json)
    output = "text"
    # <host>:<port> to Tendermint RPC interface for this chain
    node = "tcp://localhost:26657"
    # Transaction broadcasting mode (sync|async|block)
    broadcast-mode = "sync"
    ```
  </Tab>
</Tabs>

## 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](/node/rocksdb-backend) 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](#default-configurations) above. The block below
covers the values most node operators tune in practice.

```toml theme={"dark"}
[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 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.

<Info>For step-by-step instructions — including the full state-sync flow, startup verification, safety checks, and rollback — see the [Giga SS Store Migration Guide](/node/giga-storage-migration). The snippet below is just the resulting `app.toml` shape.</Info>

```toml theme={"dark"}
[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](/node/giga-storage-migration) 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:

```toml theme={"dark"}
[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:

```bash theme={"dark"}
# Check database size
du -sh $HOME/.sei/data/

# Confirm correct file paths as per your own setup before proceeding.
# Back up the data directory BEFORE wiping it:
cp -r $HOME/.sei/data/ $HOME/sei-backup-$(date +%Y%m%d)/

# Your keys and config live in $HOME/.sei/config and are NOT removed by the
# wipe below, but keep them safe regardless:
# - `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.

# Wipe database for a fresh resync (destructive — deletes all chain data
# except priv_validator_state.json)
find $HOME/.sei/data/ -mindepth 1 ! -name 'priv_validator_state.json' -delete && rm -rf $HOME/.sei/wasm
```

<Warning>The wipe command above deletes the entire local database (everything except `priv_validator_state.json`) and the `wasm` folder. It does not compact data in place — after running it, the node must be re-synced from a [snapshot](/node/snapshot) or via [state sync](/node/statesync) before it can serve traffic again.</Warning>

## Service Management

### Systemd Commands

```bash theme={"dark"}
# 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:

```bash theme={"dark"}
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:

```bash theme={"dark"}
# 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.

```bash theme={"dark"}
# After node halts
cd sei-chain
git pull
git checkout [new-version]
make install
sudo systemctl restart seid
```

<Tip>
  Build the upgrade before the halt-height so you can quickly replace it
  with minimal downtime.
</Tip>

## 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.

```bash theme={"dark"}
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.

```bash theme={"dark"}
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.

```bash theme={"dark"}
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:

```bash theme={"dark"}
#!/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:

```bash theme={"dark"}
# 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](/node/advanced-config-monitoring).
