From c9627437957d7f2ea560627327e698dec03aedb0 Mon Sep 17 00:00:00 2001 From: "seidroid[bot]" <257742136+seidroid[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 21:24:38 +0000 Subject: [PATCH 1/4] docs: The `--freeze-height` flag (and `freeze-height` config field) now puts a full node into read-only freeze mode where transaction/evidence submission, mempool gossip, and state sync are disabled, and it is no longer supported in validator or seed modes. (sei-protocol/sei-chain#4006) --- node/technical-reference.mdx | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/node/technical-reference.mdx b/node/technical-reference.mdx index f8c9c2d..ee659c8 100644 --- a/node/technical-reference.mdx +++ b/node/technical-reference.mdx @@ -37,6 +37,36 @@ seid tendermint show-validator seid query node info ``` + +#### Freeze Mode (`--freeze-height`) + +The `--freeze-height` start flag (and the corresponding `freeze-height` field in `app.toml`) puts a full node into read-only freeze mode at a specified block height. Query RPC remains available so the node can continue serving reads, but write and network paths are disabled from startup: + +- Transaction and evidence submission is rejected. The `BroadcastTx`, `BroadcastTxAsync`, `BroadcastTxSync`, `BroadcastTxCommit`, and `BroadcastEvidence` RPC calls all return `ErrReadOnly` (`RPC writes are disabled in freeze mode`). +- Mempool gossip is disabled — the mempool reactor is not started and the mempool p2p channel is not advertised to peers. +- State sync is disabled. + +Block sync and consensus stop before executing the configured height and will not advance beyond it. + +```bash +# Start a full node in read-only freeze mode at a given block height +seid start --freeze-height +``` + +The same behavior can be configured persistently via the `freeze-height` field. `freeze-height` is the first block height a full node must not execute; a value of `0` disables freeze mode. + +```toml +# 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. Set to 0 to disable freeze mode. +freeze-height = 0 +``` + + + Freeze mode is only supported for full nodes. Setting a non-zero `freeze-height` in validator or seed mode is rejected at startup with an error (`freeze height is not supported in mode`). + + + ### seidb Tooling Commands The `seidb` binary provides low-level tooling for inspecting and maintaining a node's on-disk state. From b5a7bc74fb97fde14d163e8e1597090923e46efc Mon Sep 17 00:00:00 2001 From: "seidroid[bot]" <257742136+seidroid[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 21:25:24 +0000 Subject: [PATCH 2/4] docs: Adds a new `frozen-rpc-router` binary that proxies EVM JSON-RPC requests to live and freeze-height-frozen nodes based on block number, plus a new `--freeze-height` flag on `seid start`. (sei-protocol/sei-chain#4024) --- node/node-types.mdx | 1 + node/technical-reference.mdx | 37 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/node/node-types.mdx b/node/node-types.mdx index 12c4b25..6a82444 100644 --- a/node/node-types.mdx +++ b/node/node-types.mdx @@ -24,6 +24,7 @@ Seid uses the following TCP ports. Toggle their settings to match your environme - `8545`: The default port for EVM HTTP RPC. This port is used for Ethereum JSON-RPC calls and must be open if you want to interact with EVM-compatible applications. - `8546`: The default port for EVM WebSocket RPC. This port provides real-time communication for EVM applications that require WebSocket connections. - `26660`: The default port for interacting with the Prometheus database, which can be used to monitor the environment. In the default configuration, this port is not open. +- `8545`: Also the default listen address (`127.0.0.1:8545`) for the `frozen-rpc-router` binary, which proxies EVM JSON-RPC requests to a live node and one or more freeze-height-frozen nodes based on block number. It shares the standard EVM JSON-RPC port convention with the live node. These ports are all customizable in `$HOME/.sei/config/config.toml` and `$HOME/.sei/config/app.toml`. diff --git a/node/technical-reference.mdx b/node/technical-reference.mdx index ee659c8..6a5baa1 100644 --- a/node/technical-reference.mdx +++ b/node/technical-reference.mdx @@ -67,6 +67,43 @@ freeze-height = 0 + +### Frozen RPC Router + +The `frozen-rpc-router` binary is a companion to freeze mode. It exposes a single HTTP EVM JSON-RPC endpoint that transparently proxies requests to a live node and one or more freeze-height-frozen nodes, routing each request to the correct backend based on the block height it references. This lets a set of archival nodes — each frozen before a different height — collectively serve historical state through one endpoint. + +Because a freeze height is an exclusive boundary, a node started with `--freeze-height 100` serves blocks through height 99. The router therefore sends height 99 to that node and height 100 to the next configured interval (or to the live node when no frozen interval covers it). + +```bash +# Route between a live node and two frozen nodes +go run ./cmd/frozen-rpc-router \ + --listen-address 0.0.0.0:8545 \ + --live-node localhost:9545 \ + --frozen-node 1000000=localhost:9546 \ + --frozen-node 2000000=10.0.0.12:8545 +``` + +The binary accepts the following flags: + +- `--listen-address` — address on which the router listens (default `127.0.0.1:8545`). +- `--live-node` — HTTP RPC address of the live node (required). +- `--frozen-node` — a `freeze-height=ip:port` pair; repeat once per frozen node. Bare `ip:port`, `http://`, and `https://` URLs are all accepted. Frozen nodes may be listed in any order, but freeze heights must be unique. +- `--max-request-body-bytes` — maximum JSON-RPC request body size (default 5MiB); larger requests are rejected with HTTP `413`. +- `--shutdown-timeout` — graceful shutdown timeout (default `10s`). + +#### Routing Rules + +- Methods with an explicit numeric block parameter (for example `eth_getBlockByNumber`, `eth_getBalance`, `eth_call`, `eth_getStorageAt`, `debug_traceBlockByNumber`) are routed to the interval that contains that height. The `earliest` tag resolves to height 0. +- `eth_getLogs` and `eth_feeHistory` are routed only when their entire explicit block range falls within a single interval. A range that crosses an interval boundary is rejected with JSON-RPC error `-32000` (`block ranges spanning multiple frozen-node intervals are not supported`). +- Latest-style block tags (`latest`, `pending`, `safe`, `finalized`), requests referencing a block by hash, methods without a block parameter, stateful filter methods, subscriptions, and WebSocket connections are all forwarded to the live node. +- Batch requests are split so each call reaches its correct backend, then reassembled into a single response. + +#### Route Header + +Every HTTP response carries a `Sei-RPC-Route` header identifying which backend served it: `frozen:` for a request served by the frozen node at that freeze height, `live` for the live node, and `mixed` for a batch split across multiple backends. + + + ### seidb Tooling Commands The `seidb` binary provides low-level tooling for inspecting and maintaining a node's on-disk state. From c76347881291d0909127f7460e91cc8da38b8222 Mon Sep 17 00:00:00 2001 From: "seidroid[bot]" <257742136+seidroid[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 21:26:20 +0000 Subject: [PATCH 3/4] docs: The frozen-rpc-router command adds a new --max-block-reference-depth CLI flag (default 16) to bound nested block reference parsing depth. (sei-protocol/sei-chain#4034) --- node/technical-reference.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/node/technical-reference.mdx b/node/technical-reference.mdx index 6a5baa1..be1c569 100644 --- a/node/technical-reference.mdx +++ b/node/technical-reference.mdx @@ -89,6 +89,7 @@ The binary accepts the following flags: - `--live-node` — HTTP RPC address of the live node (required). - `--frozen-node` — a `freeze-height=ip:port` pair; repeat once per frozen node. Bare `ip:port`, `http://`, and `https://` URLs are all accepted. Frozen nodes may be listed in any order, but freeze heights must be unique. - `--max-request-body-bytes` — maximum JSON-RPC request body size (default 5MiB); larger requests are rejected with HTTP `413`. +- `--max-block-reference-depth` — maximum nested block reference depth (default `16`); bounds how deeply nested `blockNumber` object references are parsed when resolving a request's block parameter. Must be positive. - `--shutdown-timeout` — graceful shutdown timeout (default `10s`). #### Routing Rules From b4f934dc2d30f5e0822c86526d0c97041a56a088 Mon Sep 17 00:00:00 2001 From: "seidroid[bot]" <257742136+seidroid[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 21:26:58 +0000 Subject: [PATCH 4/4] docs: The frozen-rpc-router adds two new CLI flags, --batch-request-limit and --write-timeout, to configure JSON-RPC batch size limits and HTTP response write timeouts. (sei-protocol/sei-chain#4048) --- node/technical-reference.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/node/technical-reference.mdx b/node/technical-reference.mdx index be1c569..47645ee 100644 --- a/node/technical-reference.mdx +++ b/node/technical-reference.mdx @@ -90,6 +90,8 @@ The binary accepts the following flags: - `--frozen-node` — a `freeze-height=ip:port` pair; repeat once per frozen node. Bare `ip:port`, `http://`, and `https://` URLs are all accepted. Frozen nodes may be listed in any order, but freeze heights must be unique. - `--max-request-body-bytes` — maximum JSON-RPC request body size (default 5MiB); larger requests are rejected with HTTP `413`. - `--max-block-reference-depth` — maximum nested block reference depth (default `16`); bounds how deeply nested `blockNumber` object references are parsed when resolving a request's block parameter. Must be positive. +- `--batch-request-limit` — maximum number of calls in a JSON-RPC batch (default `1000`). Must be positive. A batch exceeding this limit is rejected with JSON-RPC error `-32600` (`batch too large`). +- `--write-timeout` — maximum duration for writing an HTTP response (default `30s`). Must be positive. - `--shutdown-timeout` — graceful shutdown timeout (default `10s`). #### Routing Rules