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.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.
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)
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 unmodifiedapp.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.
- app.toml
- config.toml
- client.toml
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
Tendermint / consensus-layer configuration: P2P, RPC, mempool, consensus,
state-sync, etc.
# 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
CLI and client defaults used by
seid itself (chain id, keyring backend,
output format, node endpoint).# 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"
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:- 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 bysc-write-mode/sc-read-modeand defaults to memiavl-only — FlatKV is only opened when one of those modes is set to a non-default value. - 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).
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
Giga Storage and Giga Executor
These are two separate opt-in features that ship in newerseid
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"
[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:- Wait for the designated upgrade block height [this can be seen in the upgrade proposal under ‘plan’]
- The node will halt automatically.
- Update/replace the binary
- 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)