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)
- Cosmos SS uses
$HOME/.sei/data/{backend}in the legacy layout and$HOME/.sei/data/state_store/cosmos/{backend}in the current layout. - EVM SS uses
$HOME/.sei/data/evm_ssin the legacy layout and$HOME/.sei/data/state_store/evm/{backend}in the current layout. - Non-empty
ss-db-directoryandevm-ss-db-directorysettings override those locations.
app.toml, config.toml, and
client.toml files from the latest tagged seid release, see
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
# (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) is mandatory. The legacy IAVL backend
# has been fully removed; if sc-enable is false the node panics at startup with
# "SeiDB state-commit (SC) must be enabled; IAVL backend has been fully deprecated".
sc-enable = true
[state-store]
# Historical SS layer for queries. Required for any node serving RPC.
ss-enable = true
# State-store backend. Use PebbleDB; RocksDB support will be removed.
ss-backend = "pebbledb"
# 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. Supported backends: pebbledb
# (aka pebble) and littidx.
rs-backend = "pebbledb"
The receipt-store backend accepts
pebbledb (also called pebble) and
littidx. The node rejects an unsupported value, such as rs-backend = "parquet"
(or RECEIPT_BACKEND=parquet), with the error unsupported receipt-store backend "parquet"; supported: pebbledb, littidx.littidx stores receipt bodies in LittDB and keeps a PebbleDB tag index. With
this index, eth_getLogs can filter logs without a scan of whole blocks. It uses
the same min-retain-blocks and prune-interval-seconds settings as pebbledb.
It flushes receipt bodies every few milliseconds and does not write them through
a WAL. A hard crash can therefore lose the newest receipt bodies. A read of a
lost receipt returns not found.In the localnode and rpcnode configuration scripts, if you enable Giga Storage
(GIGA_STORAGE=true) and RECEIPT_BACKEND is not set, the receipt backend
defaults to pebble. The former receipt-store.tx-index-backend config field
has been removed.Default configurations
This section shows the full unmodifiedapp.toml, config.toml, and
client.toml files that seid init produces with the latest tagged seid
release. Use them as the canonical reference for every available setting and
its default value.
Do not use RocksDB for new or resynced nodes. The generated
app.toml below mirrors the latest tagged release and may still list RocksDB as a state-store option. RocksDB support for the SeiDB state store will be removed. No target release has been published.- app.toml
- config.toml
- client.toml
Application-layer configuration: gas, API, gRPC, pruning, SeiDB, EVM, and other settings.
# 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
# FreezeHeight contains the first block height a full node must not execute.
# Query RPC remains available, while transaction and evidence submission,
# mempool gossip, and state sync are disabled from startup.
freeze-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 = []
# CompactionInterval sets (in seconds) the interval between forced levelDB
# compaction. A value of 0 means no forced levelDB.
# Default is 0.
compaction-interval = 0
###############################################################################
### 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 = ""
###############################################################################
### Query Configuration ###
###############################################################################
# Pagination limits on the ABCI and gRPC query path protect the node from expensive
# store scans by untrusted callers (for example, public RPC clients). Operators tune
# these values for their deployment, allowlist trusted indexers on Tendermint RPC or
# Cosmos gRPC, or set disable-limits on nodes not exposed to untrusted callers.
[query]
# DisableLimits turns off pagination limits for all query origins. Use only on nodes
# that are not exposed to untrusted callers.
disable-limits = false
# TrustedCIDRs lists caller CIDRs that bypass pagination limits. Matching uses the
# direct TCP peer (Tendermint RPC RemoteAddr or Cosmos gRPC peer address), not
# forwarded headers. It applies only to abci_query on the Tendermint RPC listener
# and to queries on grpc.address; REST/LCD on api.address (including grpc-gateway
# routes) relays queries in-process without caller origin, so trusted-cidrs has no
# effect there. Trusted indexers using REST should use gRPC or Tendermint RPC, or
# set disable-limits on nodes not exposed to untrusted callers.
# Behind a load balancer or reverse proxy every external client shares the proxy
# address, so adding the proxy CIDR here bypasses limits for all traffic through
# that ingress, not just internal indexers.
trusted-cidrs = []
# MaxLimit is the maximum page size for untrusted query origins. 0 uses the default.
max-limit = 1000
# MaxOffset is the maximum offset for untrusted query origins. 0 uses the default.
max-offset = 10000
# MaxIterations is the maximum store entries a single untrusted query may scan. 0 uses
# the default. When the budget is exhausted the response is a partial page with next_key;
# total stays 0 even when the client set count_total, so next_key != nil with total == 0
# means the total is unknown rather than zero results.
max-iterations = 11000
###############################################################################
### State Commit Configuration ###
###############################################################################
[state-commit]
# Enable defines if the SeiDB state-commit should be enabled.
sc-enable = true
# Defines the SC store directory, if not explicitly set, default to application home directory
sc-directory = ""
# 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 1: a configured value of 0 is overridden to 1.
sc-keep-recent = 1
# 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
# sc-write-mode is the write routing mode. By default it is IGNORED: the
# advanced, unrendered state-commit.sc-write-mode-enable-auto defaults to true,
# which forces the node to run in auto regardless of this value. In auto the
# effective mode is derived from the on-disk migration state and advanced by the
# NumKeysToMigratePerBlock gov param, so the node follows a governance-driven EVM
# migration with no edits here.
#
# To pin an explicit mode (memiavl_only, flatkv_only, evm_migrated,
# test_only_dual_write, ...) you MUST also set
# state-commit.sc-write-mode-enable-auto = false; only then is this value
# honored. A pinned node does not participate in a governance-driven migration
# and diverges from the network once the chain migrates (e.g. auto left enabled
# on a flatkv_only-style node would either fail every commit with a
# version-mismatch error or silently serve reads from an empty memiavl).
#
# Valid values: memiavl_only, migrate_evm, evm_migrated, migrate_all_but_bank,
# all_migrated_but_bank, migrate_bank, flatkv_only, test_only_dual_write, auto.
sc-write-mode = "memiavl_only"
# HashLogger records a per-block CSV of named hashes (memIAVL module/root hashes, flatKV DB/root
# hashes, the app hash, the block hash, and the changeset hash) so block-hash computation can be
# studied and compared across nodes. It is a debugging/forensics tool; enabled by default.
sc-hash-logger-enable = true
# Directory for hash log files. If empty, defaults to a "hash.log" directory under the SC store's data
# directory (i.e. <home>/data/hash.log).
sc-hash-logger-directory = ""
# Number of most-recent blocks to retain on disk. 0 disables block-count retention (disk-size cap only).
sc-hash-logger-blocks-to-retain = 0
# Size in bytes a hash log file may reach before it is sealed and rotated. Must be > 0.
sc-hash-logger-target-file-size = 16777216
# Backstop cap in bytes on the total size of sealed hash log files. 0 disables the disk-size cap
# (block-count retention only).
sc-hash-logger-max-disk-size = 17179869184
###############################################################################
### FlatKV (EVM) Configuration ###
###############################################################################
[state-commit.flatkv]
# FlatKV runs with in-code defaults for now; no options are exposed here yet.
###############################################################################
### 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
# EnableReadWriteMetrics emits estimated PebbleDB MVCC read/write counters.
# Applies when ss-backend = "pebbledb". Default: false.
ss-enable-read-write-metrics = false
# SnapshotEnable turns on periodic online state-store snapshots. The cadence is
# not configurable here: it mirrors the state-commit snapshot settings.
# Two configurations fail startup rather than run without snapshots: an
# ss-backend other than "pebbledb", and any SS database that cannot hardlink into
# its own snapshot root.
# Each retained snapshot pins the SST files it references against compaction, so
# budget the write churn of one snapshot interval per retained snapshot. This is
# substantial on a multi-TB state store.
# Snapshot directories are rollback restore points, not an archive format.
# They have no lease, so do not build tools that resolve one and open it later.
# Cost and progress are exported as ss_snapshot_* metrics. Default: false.
ss-snapshot-enable = false
# 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)
# defaults to pebbledb
rs-backend = "pebbledb"
# Defines the receipt store directory. If unset, defaults to <home>/data/ledger/receipt/{backend}
db-directory = ""
# AsyncWriteBuffer defines the async queue length for commits to be applied to receipt store.
# Applies only when rs-backend = "pebbledb".
# 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
# EnableReadWriteMetrics emits estimated read/write counters for Pebble-backed
# receipt storage.
# Default: false.
enable-read-write-metrics = false
# LogFilterParallelism bounds how many blocks a single eth_getLogs query scans
# concurrently. Applies only when rs-backend = "littidx".
# Set <= 0 to use the default.
# defaults to 16
log-filter-parallelism = 16
###############################################################################
### 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
# Enables simulation before broadcasting EVM RPC sendRawTransaction.
enable_simulation = true
# Deny list defines list of methods that EVM RPC should fail fast, e.g ["debug_traceBlockByNumber"]
deny_list = []
# Legacy sei_* JSON-RPC (EVM HTTP only - not Cosmos REST on 1317).
#
# DEPRECATION: The sei_* JSON-RPC surface is 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 all three
# remaining address/Cosmos helpers.
enabled_legacy_sei_apis = [
"sei_getSeiAddress",
"sei_getEVMAddress",
"sei_getCosmosTx",
]
# max number of logs a single eth_getLogs query may match before it errors,
# for both bounded and open-ended block ranges
max_log_no_block = 10000
# max estimated heap bytes of matched logs a single eth_getLogs query may return
max_log_bytes = 67108864
# max number of blocks to query logs for
max_blocks_for_log = 2000
# max number of calls allowed in an eth_estimateGasAfterCalls request
max_estimate_gas_calls = 100
# max number of accounts allowed in a single state override
max_state_override_accounts = 100
# max number of storage slots allowed per account in a state override
max_state_override_slots = 1000
# max number of concurrent NewHead subscriptions
max_subscriptions_new_head = 10000
# max number of concurrent logs subscriptions
max_subscriptions_logs = 1000
# 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"
# MaxTraceStructLogBytes bounds the retained struct-logger output (in bytes) per traced
# transaction on the default debug_trace* endpoints, guarding against quadratic memory growth
# from traces that read many distinct storage slots. The bound is per transaction, not per RPC
# call: a debug_traceBlock* call over N transactions retains up to N times this value (and the
# parallelized path holds several concurrent traces live). Set to 0 for unlimited (matches
# upstream geth behavior).
max_trace_struct_log_bytes = 33554432
# Native debug tracers that may be requested with TraceConfig.Tracer. The default
# struct logger remains available when Tracer is omitted. Request-supplied
# JavaScript tracer source is disabled and cannot be enabled through this list.
# Set to [] to disable all named tracers.
trace_allowed_tracers = ["callTracer", "prestateTracer", "flatCallTracer", "4byteTracer", "noopTracer", "muxTracer"]
# Allow request-supplied JavaScript tracer source in TraceConfig.Tracer. This
# executes untrusted code in-process; keep disabled on public/default RPC nodes.
# Enabling this does not widen trace_allowed_tracers: native tracer names must
# still be listed there to be usable.
trace_allow_js_tracers = false
# 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
# TraceBakeEnabled, when true, runs a background worker that re-executes
# each committed block with the configured tracers and stores the result
# to <home>/data/trace_db. debug_traceTransaction with a bakeable
# tracer config (callTracer / prestateTracer / flatCallTracer) returns
# from cache on hit. Recommended for RPC nodes only; default false.
trace_bake_enabled = false
# Number of re-execution worker goroutines (default 1).
trace_bake_workers = 1
# Bounded in-flight height queue. Drops on full so consensus never blocks.
trace_bake_queue_size = 4096
# Which tracers to bake per block; must be native tracer names (validated at startup).
trace_bake_tracers = ["callTracer"]
# Rolling cache window: prune blocks older than (latest - this).
# 0 disables pruning (cache grows forever).
trace_bake_window_blocks = 0
# TraceBakeUseSnapshot, when true, uses in-memory memiavl snapshots as the
# state backend for trace baking when the store backend supports snapshots.
# Watch these metrics when enabling on a high-throughput node:
# - memiavl_mem_node_total_size / memiavl_num_of_mem_node: rise if held
# snapshots are pinning too many COW nodes; lower the window or drop the
# memiavl snapshot interval.
# - trace baker dropped/baked counters: dropped > 0 or baked lagging chain
# tip means the baker is falling behind.
trace_bake_use_snapshot = false
# Number of recent memiavl snapshots to retain for trace baking.
trace_bake_snapshot_window = 64
# ip_rate_limit_rps is the per-IP sustained request rate in requests/second.
# Set to 0 to disable per-IP throttling (no HTTP 429). Does not bypass the
# admission middleware; set rate_limiting_enabled = false for a full bypass.
ip_rate_limit_rps = 200
# ip_rate_limit_burst is the maximum per-IP burst above the sustained rate.
# Set to 0 to disable per-IP throttling (same effect as ip_rate_limit_rps = 0).
# Must be at least batch_request_limit when both are positive and rate_limiting_enabled
# is true (one token is charged per batch element) - enforced at startup.
ip_rate_limit_burst = 1000
# rate_limiting_enabled is the master switch for the rate-limit admission
# middleware on the EVM HTTP plane (:8545). When false, requests bypass method
# extraction and all rejections from that layer (HTTP 400/413/429).
rate_limiting_enabled = false
# trusted_proxy_cidrs lists CIDRs whose X-Forwarded-For headers are trusted when
# resolving the client IP for rate limiting. Empty means trust no proxy — set
# this to your ingress/LB CIDRs when the node sits behind a reverse proxy.
# Do NOT use the full RFC-1918 private ranges unless every address in them is
# your own controlled infrastructure.
trusted_proxy_cidrs = []
# batch_request_limit is the maximum number of requests allowed in a single
# JSON-RPC batch (HTTP and WebSocket). Set to 0 to disable the limit.
batch_request_limit = 1000
# batch_response_max_size is the maximum number of bytes returned from a
# batched JSON-RPC call (HTTP and WebSocket). Set to 0 to disable the limit.
batch_response_max_size = 25000000
# max_request_body_bytes is the maximum size, in bytes, of a single HTTP (:8545)
# or WebSocket (:8546) JSON-RPC request/frame. HTTP larger requests are rejected
# (HTTP 413) before decode, including at the rate limiter method-extraction
# layer. WS frames exceeding this limit close the connection with WebSocket
# close code 1009 (no JSON-RPC error). Set to 0 to use the default (5 MiB).
# Upgrade note: WS previously used a hardcoded 10 MiB frame cap; if WS clients
# send frames in the 5-10 MiB range, set max_request_body_bytes = 10485760
# (10 MiB) in app.toml.
max_request_body_bytes = 5242880
# max_concurrent_request_bytes bounds total request bytes admitted concurrently
# on HTTP (:8545) and WebSocket (:8546). Each protocol gets an independent
# budget, so peak in-flight bytes process-wide can reach 2× this value. HTTP
# charges the budget incrementally as body bytes are read, bounding what a
# slow/stalled upload can pin to about one read batch rather than the full
# declared Content-Length; requests that would exceed the budget mid-read are
# rejected (HTTP 429). WS blocks until budget frees or ws_admission_timeout
# elapses; on timeout the peer gets JSON-RPC error -32005 and the connection
# closes. Set to 0 to disable on either protocol.
max_concurrent_request_bytes = 134217728
# ws_admission_timeout bounds how long a WebSocket connection waits for
# concurrent-byte budget before the next frame is read or committed. On expiry
# the peer receives JSON-RPC error -32005 and the connection closes. Zero or
# negative values use the go-ethereum default (30s).
ws_admission_timeout = "30s"
# body_read_idle_timeout is the maximum idle time allowed between body chunks
# while reading an HTTP JSON-RPC request. Stalled body reads return HTTP 408 and
# release any byte budget held so far. Set to 0 to disable (ReadTimeout remains
# the whole-request backstop).
body_read_idle_timeout = "10s"
# max_open_connections caps the number of simultaneously accepted connections on
# the EVM HTTP and WebSocket listeners. Set to 0 to disable the limit.
max_open_connections = 2000
###############################################################################
### Giga Executor Configuration ###
###############################################################################
[giga_executor]
# enabled controls whether to use the Giga executor for improved EVM throughput.
# Default: true
enabled = true
# 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: true
occ_enabled = true
###############################################################################
### 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"
# MaxRecvMsgSize defines the maximum message size in bytes the server can receive.
# It bounds per-request memory allocation before the rate limiter fires. Default 4 MB.
max-recv-msg-size = 4194304
# MaxOpenConnections defines the maximum number of simultaneous open connections. 0 means unlimited.
max-open-connections = 1000
# MaxConnectionIdle is the duration after which an idle connection is closed (e.g. "5m"). 0 means infinity.
max-connection-idle = "5m0s"
# MaxConnectionAge is the maximum duration a connection may exist before it is closed (e.g. "30m"). 0 means infinity.
max-connection-age = "0s"
# MaxConnectionAgeGrace is an additive period after max-connection-age during which the connection is forcibly closed. 0 means infinity.
max-connection-age-grace = "0s"
# KeepaliveTime is the interval after which, with no activity, the server pings the client to check liveness.
keepalive-time = "2h0m0s"
# KeepaliveTimeout is the duration the server waits for a keepalive ping ack before closing the connection.
keepalive-timeout = "20s"
# KeepaliveMinTime is the minimum interval a client must wait between keepalive pings; more frequent pings are penalized.
keepalive-min-time = "5m0s"
# KeepalivePermitWithoutStream defines whether the server allows keepalive pings even when there are no active streams.
keepalive-permit-without-stream = false
###############################################################################
### 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
# MaxOpenConnections defines the number of maximum open connections. 0 means unlimited.
max-open-connections = 1000
###############################################################################
### 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 = ""
###############################################################################
### 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
The generated comments above do not describe two behaviors. First,
min-retain-blocks also controls receipt store retention. The receipt store’s
KeepRecent is derived from min-retain-blocks, and 0 means keep
everything. Second, when evm-ss-db-directory is unset, nodes with an existing
<home>/data/evm_ss directory keep using that legacy path. New nodes default
to <home>/data/state_store/evm/{backend}.Tendermint and consensus-layer configuration: P2P, RPC, mempool, consensus,
state sync, and other settings.
# 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 ###
#######################################################################
# 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"
# A JSON file containing the private key to use for p2p authenticated encryption
node-key-file = "config/node_key.json"
# FastCheckTx bypasses application CheckTx with a stateless EVM transaction parser.
# TEST-ONLY
fast-check-tx = false
# MockApp replaces the provided ABCI application with an in-memory EVM nonce app.
# TEST-ONLY
mock-app = false
#######################################################################
### Autobahn Configuration ###
#######################################################################
# AutobahnConfigFile is the path to a JSON file containing the Autobahn (GigaRouter)
# configuration.
#
# Empty disables Autobahn.
#
# Placed here (as a top-level key, before any [section] header) so the
# TOML parser sees it at root scope where mapstructure expects it — viper
# would otherwise nest it under the immediately preceding section.
autobahn-config-file = ""
# hash-vault-disabled-unsafe disables the app-hash equivocation guard (HashVault).
# DO NOT set this to true unless you are knowingly running an UNSAFE node as a last-resort
# recovery measure. A node with this enabled has NO protection against changing its mind about
# a committed block's app hash, and will log error-level warnings on every startup.
#
# It is safer to leave HashVault enabled: if you hit a startup panic, first remove the HashVault
# files as instructed in the panic message and let the node run. Only disable HashVault if you are
# very sure the stored hashes are totally wrong and you keep hitting the same panic on new blocks.
#
# Placed here (as a top-level key, before any [section] header) so the TOML parser sees it at
# root scope where mapstructure expects it — viper would otherwise nest it under the
# immediately preceding section.
hash-vault-disabled-unsafe = 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"
# timeout to read HTTP request headers; mitigates slowloris attacks.
# Set to "0s" to disable (not recommended).
timeout-read-header = "10s"
# HTTP write timeout; acts as a hard backstop for all handlers.
# Set to "0s" to disable (not recommended).
timeout-write = "30s"
# Maximum number of results returned by tx_search and block_search.
# Set to 0 to disable the cap (not recommended on public nodes).
max-tx-search-results = 10000
# Maximum number of KV index entries that all in-flight tx_search and
# block_search requests may visit at once. This is a process-wide safety cap
# that bounds peak memory (and scan CPU) under broad or highly concurrent
# search load; it is shared across requests, not applied per-query. When the
# budget is exhausted an in-flight search fails rather than continuing to
# accumulate. Set to 0 to disable the cap (not recommended on public nodes).
max-search-scan-budget = 100000
# ip-rate-limit-rps is the per-IP sustained request rate in requests/second for
# CometBFT RPC HTTP (:26657). Zero disables the token bucket (no HTTP 429
# rejections). When rate-limiting-enabled is true, the admission middleware still
# runs: bodies are parsed and oversize/malformed requests are rejected before dispatch.
ip-rate-limit-rps = 200
# ip-rate-limit-burst is the maximum per-IP burst above the sustained rate.
# Zero disables the token bucket (same effect as ip-rate-limit-rps = 0) and does
# not bypass the admission middleware when rate-limiting-enabled is true. Must be
# at least the JSON-RPC batch size limit when both are positive and
# rate-limiting-enabled is true because the rate limiter charges one token per
# JSON-RPC batch element.
ip-rate-limit-burst = 400
# rate-limiting-enabled is the master switch for the rate-limit admission
# middleware on the CometBFT RPC HTTP plane. When false, requests bypass method
# extraction and all rejections from that layer (HTTP 400/413/429).
rate-limiting-enabled = false
# trusted-proxy-cidrs lists CIDRs whose X-Forwarded-For headers are trusted when
# resolving the client IP for rate limiting. Empty means trust no proxy.
trusted-proxy-cidrs = []
#######################################################################
### 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 = "0cd5f57c249b5aca815710338e1fe7a14797585d@seed-0-p2p.pacific-1.prod.platform.sei.io:26656,f0f057f1593d28bec11591cf146bd223e0be1866@seed-1-p2p.pacific-1.prod-euw1.platform.sei.io:26656,8e28f62368a1ceae0102645db8584b218650930d@seed-2-p2p.pacific-1.prod-use2.platform.sei.io:26656"
# 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"
# How often the node accepts a new inbound connection. A larger interval paces
# the accept loop more slowly; if the kernel accept backlog outpaces it, arriving
# peers wait past handshake-timeout and the node silently stops acquiring inbound
# peers. A value of 0 disables the limiter.
accept-interval = "10ms"
# 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"
# 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
# Advanced state-sync tuning knobs are intentionally omitted from this template:
# - backfill-blocks, backfill-duration: post-sync historical light-block backfill
# - discovery-time, temp-dir: snapshot discovery and chunk staging
# - chunk-request-timeout, fetchers: chunk transfer behavior
# - verify-light-block-timeout, blacklist-ttl: light client verification
# They are still parsed if set explicitly here; see the Sei docs for the full list
# and recommended values.
#######################################################################
### Consensus Configuration Options ###
#######################################################################
[consensus]
wal-file = "data/tendermint/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"
#######################################################################
### 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 scrapes served concurrently. Not a socket limit despite the
# name: requests past it receive a 503 rather than being queued. Keep it above
# the number of scrapers that can overlap (an HA Prometheus pair, probes, a human
# curl) — a slow reader holds a slot until it finishes or times out.
# 0 - unlimited.
max-open-connections = 3
#######################################################################
### 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
Out-of-process Application Blockchain Interface (ABCI) support has been
removed. The node runs only with Tendermint in-process. As a result, the legacy
proxy-app and abci base config fields no longer appear in the generated
file and have no effect. When you upgrade, remove any proxy-app and abci
lines from your existing config.toml.The
[p2p] section also accepts max-outbound-connections, which seid init
does not emit. Inbound and outbound connections are managed in separate pools.
This field caps the outbound pool, and the inbound pool is derived as
max-connections - max-outbound-connections. Persistent and unconditional
peers bypass both limits. If the field is unset, it defaults to 20, or to half
of max-connections (rounded up) when max-connections is below 40. If you
set it explicitly, the effective value is
min(max-connections, max-outbound-connections).The Tendermint mempool was substantially rewritten. A unified transaction store
drives transaction admission, ordering, eviction, and gossip. The store uses
inclusion ordering, soft and hard size limits, and cache-based deduplication.
As a result, node operators may observe different ordering, eviction, and
gossip behavior after they upgrade.A zero
ttl-duration or ttl-num-blocks disables that form of TTL purging
entirely. Expired PENDING transactions are always pruned. Expired READY
transactions are pruned when remove-expired-txs-from-queue is true (the
default). The pending-ttl-duration and pending-ttl-num-blocks fields are
deprecated and have no effect. Pending transactions are no longer purged based
on their own TTL.The
[consensus] section also accepts unsafe-overrides-enabled (default
false), which seid init does not emit. The unsafe-*-override timeout
fields take effect only when unsafe-overrides-enabled is true or when the
onchain timeout params still equal the legacy pacific-1 values. The second case
is a backward-compatibility carve-out during migration. Otherwise, the
overrides are ignored, and the onchain (or default) timeout params are used.CLI and client defaults that
seid itself uses (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 uses SeiDB to store chain data. SeiDB is a two-layer design that replaces the legacy single-database IAVL store with separate tiers for hot and historical data:- State Commit (SC): the active chain state. It is 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 also be routed through FlatKV, an EVM-tuned PebbleDB store with per-type sub-databases (account,code,storage, andmisc). Since v6.7.0, nodes run in theautowrite mode by default and move EVM state into FlatKV when governance starts the migration. See the FlatKV EVM SC migration flow. - State Store (SS): versioned raw key-value pairs for historical queries. It is required for any node that serves RPC. The default backend is PebbleDB. Do not use RocksDB for new nodes. If you already use RocksDB, follow Move off RocksDB before support is removed.
sc-enable = false, the node panics at startup with SeiDB state-commit (SC) must be enabled; IAVL backend has been fully deprecated.
SeiDB configuration
The full set of settings is in the auto-generated Default configurations above. The block below covers the values that most node operators tune in practice.[state-commit]
# SeiDB state-commit is mandatory; setting this to false panics at startup.
sc-enable = true
# Async commit queue. Larger values improve catch-up; 0 = synchronous.
sc-async-commit-buffer = 100
# 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
# The node runs in the auto write mode by default. It checks that sc-write-mode
# has a valid value, but it does not use the value.
# To pin a mode, also set sc-write-mode-enable-auto = false. Read the Giga
# storage migration guide first.
# sc-read-mode and sc-enable-lattice-hash are not seid config keys. Since
# v6.7.0, the node also ignores sc-keys-to-migrate-per-block. You can remove
# these keys.
sc-write-mode = "memiavl_only"
[state-commit.flatkv]
# FlatKV uses built-in defaults. The only key in this section that the node
# applies is enable-read-write-metrics (default false).
[state-store]
# Historical SS layer. Validators can disable this to save disk; any node
# serving RPC must keep it on.
ss-enable = true
# Use PebbleDB. RocksDB support will be removed.
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 — when true, EVM data is routed exclusively to a
# dedicated EVM SS backend (no fallback between backends). Leave false
# unless you have completed the Giga SS Store migration.
evm-ss-split = false
evm-ss-separate-dbs = false
[receipt-store]
# Supported backends: pebbledb (aka pebble) and littidx. parquet was removed in v6.6.0.
# Receipts are pruned together with blocks according to min-retain-blocks above.
rs-backend = "pebbledb"
async-write-buffer = 100
prune-interval-seconds = 600
PebbleDB version encoding
New PebbleDB state stores use descending-version MVCC encoding. Sei includes the version in each key and sorts newer versions first. This lets latest-version reads reach the newest visible value without scanning older versions. The store records this format with thes/_mvcc_descending sentinel
key, which seid detects automatically when it opens the database.
PebbleDB state stores created by older builds use ascending-version encoding.
seid detects these stores and opens them in compatibility mode without an
error. They remain on the slower ascending read path. To adopt descending
encoding, rebuild the state store through state sync with a
current seid release. A filesystem snapshot preserves the source store’s
encoding, so confirm its encoding with the snapshot provider.
Move off RocksDB
Check the Sei release notes before every upgrade. RocksDB support for the SeiDB state store will be removed. No target release has been published.
ss-backend = "rocksdb" to ss-backend = "pebbledb" on the same data
does not convert the store. Rebuild the state store instead.
For a non-archive node:
- Stop
seid. Then back up the validator key, validator state, node key, configuration, and genesis file that you need to preserve. - Check
ss-db-directoryandevm-ss-db-directoryinapp.toml. An empty value uses a path under$HOME/.sei/data. If either setting points elsewhere, move the old RocksDB data out of the active path. Keep it with the backup. Clearing$HOME/.sei/datadoes not clear a custom directory. - Set
ss-backend = "pebbledb". Then rebuild through state sync or a provider-confirmed PebbleDB snapshot. - Confirm that the startup log reports
"SeiDB SS is enabled"with the PebbleDB backend. Before you delete the old RocksDB backup, test the RPC methods that your node serves.
Do not use state sync or a pruned snapshot to migrate an archive node. Both start from a recent height and discard the earlier state-store versions that an archive node must retain.
seid release until the replacement has caught
up and you have tested historical queries at old heights. If you cannot get
a full-history PebbleDB source, do not wipe the existing archive data. Contact
the Sei Tech Chat before you upgrade.
PebbleDB can be slower for iteration-heavy historical queries, including
debug_trace* requests. Descending-version encoding improves recent reads,
but it does not remove the cost of long-history iteration. Before you cut over,
benchmark the replacement under your trace workload.
Giga Storage and Giga Executor
These are two separate features that ship in newerseid releases.
Giga Storage repartitions SeiDB so that EVM state lives in its own
databases at both the SC and SS layers. This frees non-EVM modules from EVM
write amplification.
For step-by-step instructions, see the Giga SS Store Migration Guide. The guide includes the full state sync flow, startup verification, safety checks, and rollback. The snippet below shows only the resulting
app.toml shape.[state-store]
# Route EVM data to a dedicated EVM SS backend (Giga SS Store migration).
evm-ss-split = true
sc-write-mode or sc-write-mode-enable-auto, see the
FlatKV EVM SC migration flow.
Enabling Giga Storage requires a fresh state sync. If you flip evm-ss-split
on a node with existing data, the node fails the startup safety checks. This
is 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. The procedure
is currently supported on RPC nodes only. Validators and archive nodes are
not yet covered.
Giga Executor is independent of Giga Storage. From the v6.6 release line,
newly generated configurations and configurations that omit these fields
default to the Giga execution path with OCC enabled. To opt out, set both
fields explicitly to false. Before you change either setting, follow the
release-specific operator instructions:
[giga_executor]
# Use the Giga execution path.
# Default: true.
enabled = true
# Run Giga-executed txs in parallel with Optimistic Concurrency Control.
# Default: true.
occ_enabled = true
Database maintenance
The database is typically stable and can be left alone. However, it may need some attention:# 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
After you run the wipe command above, resync the node from a snapshot or through state sync. Until then, the node cannot serve traffic. The command deletes the entire local database (everything except
priv_validator_state.json) and the wasm folder. It does not compact data in place.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
To stop logs from using too much disk space, enable log 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
Upgrade with the same method that you used for the original install. The
make install command writes seid to $(go env GOPATH)/bin, but the
prebuilt-binary flow installs to /usr/local/bin. If you mix the two,
separate binaries stay on your PATH, and your service unit may keep running
the old version. The which -a seid command lists every copy.Minor updates
For minor updates that do not break consensus:- Prebuilt binary
- Build from source
# Stop node
sudo systemctl stop seid
# Download and verify the new release binary
VERSION=<new-version> # the new release tag, e.g. v6.6.1
FILE=sei-chain_${VERSION#v}_linux_x86_64.tar.gz # asset filenames omit the leading v
curl -fLO https://github.com/sei-protocol/sei-chain/releases/download/${VERSION}/${FILE}
curl -fLO https://github.com/sei-protocol/sei-chain/releases/download/${VERSION}/checksums.txt
sha256sum -c checksums.txt --ignore-missing \
&& tar -xzf ${FILE} seid \
&& sudo install -m 0755 seid /usr/local/bin/seid
# Restart node
sudo systemctl restart seid
# 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. You can find it in the upgrade proposal under ‘plan’.
- The node halts automatically.
- Update or replace the binary.
- Restart the node.
- Prebuilt binary
- Build from source
# After node halts
VERSION=<new-version> # the new release tag, e.g. v6.6.1
FILE=sei-chain_${VERSION#v}_linux_x86_64.tar.gz
curl -fLO https://github.com/sei-protocol/sei-chain/releases/download/${VERSION}/${FILE}
curl -fLO https://github.com/sei-protocol/sei-chain/releases/download/${VERSION}/checksums.txt
sha256sum -c checksums.txt --ignore-missing \
&& tar -xzf ${FILE} seid \
&& sudo install -m 0755 seid /usr/local/bin/seid
sudo systemctl restart seid
# After node halts
cd sei-chain
git pull
git checkout <new-version>
make install
sudo systemctl restart seid
Download the release archive (or build the new binary) before the halt
height. The swap then takes only seconds at upgrade time.
Performance optimization
The results of performance optimizations can vary with your system’s hardware, workload, and network conditions. Before you make any changes, research them and test them in a controlled environment. Make sure that they fit your specific configuration and requirements. Always back up important data before you make changes.Memory management (sysctl tuning)
Tuning 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 improve packet processing efficiency and throughput, particularly for nodes that handle many 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
Tuning storage settings can significantly reduce write latency and improve database performance, especially for nodes that use 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
If data is corrupted or accidentally deleted, restore it from a backup:# 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)