Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 25 additions & 16 deletions node/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
---

import { VersionTable } from '/snippets/version-table.jsx';
import { RandomPeers } from '/snippets/random-peers.jsx';
import { Seeds } from '/snippets/seeds.jsx';

**Power the Sei network infrastructure**

Expand Down Expand Up @@ -61,7 +61,7 @@
timedatectl
```

##### Install Go

Check warning on line 64 in node/index.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/index.mdx#L64

Use sentence case for headings: 'Install Go'.

You need Go only if you build `seid` from source. The prebuilt binary and Docker
install paths in the next step do not require it.
Expand Down Expand Up @@ -209,16 +209,6 @@

<Info>The default init mode is **full**, in which RPC and P2P bind to all interfaces. For **validator** or **seed** nodes, use `--mode validator` or `--mode seed`. In these modes, RPC and P2P bind to localhost only. For the full validator init example, see the [Validator Operations Guide](/node/validators).</Info>

You can find peers here:

- Sei Mainnet (pacific-1):

<RandomPeers network="mainnet" format="bash" />

- Sei Testnet (atlantic-2):

<RandomPeers network="testnet" format="bash" />

```bash
# Initialize node (default mode is full: RPC/P2P bind to all interfaces)
# --chain-id is required, e.g. pacific-1 or atlantic-2
Expand All @@ -232,13 +222,32 @@
# discovery works with no manual configuration. Devnets (arctic-1) and
# unknown/private chains get none, and any bootstrap-peers value you already set
# is never overwritten.
```

# Optionally configure additional persistent peers in config.toml.
PEERS="<comma-separated-peer-list>"
##### Peer discovery

#Set persistent peers in config.toml
sed -i 's/persistent-peers = .*/persistent-peers = "'$PEERS'"/' ~/.sei/config/config.toml
```
As of **v6.6.2**, `seid init` writes the Sei Labs seed nodes into `bootstrap-peers`, so a
fresh node finds peers with no further configuration. The seeds run in three regions per
network and gossip the rest of the network to you over PEX, so there is no peer list to
maintain.

<Info>
Seeds belong in `bootstrap-peers`, not `persistent-peers`. Bootstrap peers seed your
address book and may be dropped once you have real peers, whereas `persistent-peers`
holds connections open indefinitely, which is only appropriate for nodes you operate
yourself.
</Info>

If you need to set them by hand, for example on a node initialized before v6.6.2 or a
home directory you did not create with `seid init`, the values are:

- Sei Mainnet (pacific-1):

<Seeds network="mainnet" format="toml" />

- Sei Testnet (atlantic-2):

<Seeds network="testnet" format="toml" />

##### Configure app settings

Expand Down Expand Up @@ -284,7 +293,7 @@

**2. Configure archive node peers**: To sync from the height at which your snapshot was created, you need peers that keep many historical blocks. During the initial sync, the node needs these specific peers. You can change them later.

#### Mempool configuration

Check warning on line 296 in node/index.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/index.mdx#L296

Use sentence case for headings: 'Mempool configuration'.

For optimal transaction handling and resource management, update the mempool settings in your `config.toml` file.

Expand Down
2 changes: 1 addition & 1 deletion node/technical-reference.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@

Responses proxied to a single backend carry a `Sei-RPC-Route` header. The header identifies which backend served the response: `frozen:<height>` for the frozen node at that freeze height, or `live` for the live node. A batch split across multiple backends returns `mixed`. Router-generated errors (oversized or malformed requests, batches over the limit, block ranges that span intervals, and unreachable backends) do not carry the header. Neither does non-`POST` traffic that passes through to the live node.

### seidb tooling commands

Check warning on line 126 in node/technical-reference.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/technical-reference.mdx#L126

Use sentence case for headings: 'seidb tooling commands'.

The `seidb` binary has low-level tools to inspect and maintain a node's on-disk state.

Expand Down Expand Up @@ -195,7 +195,7 @@
- `--details` (inspect list mode): Include backend-specific version metadata.
- `--find-hash`: An optional 32-byte hex per-entry hash to search for. When two `bucket_digest` values differ by exactly one entry, their XOR is the hash of that entry. This flag prints every matching entry, so you can locate a single diverging row.

### Autobahn (GigaRouter) config generation

Check warning on line 198 in node/technical-reference.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/technical-reference.mdx#L198

Use sentence case for headings: 'Autobahn (GigaRouter) config generation'.

When you use the Autobahn (GigaRouter) networking layer, you can generate the Autobahn JSON config from a set of node directories. Each directory must contain `validator_pubkey.txt`, `node_pubkey.txt`, `autobahn_address.txt`, and `evmrpc_url.txt`. Unlike the key files, `evmrpc_url.txt` is not written automatically, so you must create it by hand with the node's EVM RPC URL. If the file is missing, the command fails with an error. The `mempool_size` field is no longer part of `autobahn.json`. Remove it from existing config files.

Expand Down Expand Up @@ -368,7 +368,7 @@
upnp = false
max-connections = 100
max-outbound-connections = 20
max-packet-msg-payload-size = 10240
max-packet-msg-payload-size = 1000000
handshake-timeout = "10s"
dial-timeout = "3s"
# How often the node accepts a new inbound connection. A larger interval paces
Expand Down
11 changes: 8 additions & 3 deletions node/troubleshooting.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
keywords: ['sei node', 'blockchain node', 'node configuration', 'bug', 'troubleshooting']
---

import { RandomPeers } from '/snippets/random-peers.jsx';
import { Seeds } from '/snippets/seeds.jsx';

Knowing common errors and their solutions helps keep your node healthy.

Expand Down Expand Up @@ -84,7 +84,7 @@
top -p $(pgrep seid)
```

## AppHash mismatch errors

Check warning on line 87 in node/troubleshooting.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/troubleshooting.mdx#L87

Use sentence case for headings: 'AppHash mismatch errors'.

If you get an AppHash mismatch, capture the state to compare it with a known-good version:

Expand Down Expand Up @@ -164,7 +164,7 @@

When you report a problem, always include the app hash, commit hash, and block height from your logs.

### Identifying AppHash errors

Check warning on line 167 in node/troubleshooting.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/troubleshooting.mdx#L167

Use sentence case for headings: 'Identifying AppHash errors'.

In logs, AppHash errors usually look like this:

Expand Down Expand Up @@ -249,9 +249,14 @@

**Resolution steps:**

1. **Update peer configurations** with current node IDs:
1. **Reset peer configuration to the Sei Labs seeds.** These are stable published
addresses, so a stale or mismatched node ID is the usual cause of this error:

<RandomPeers network="mainnet" format="toml" />
<Seeds network="mainnet" format="toml" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] This step only shows mainnet seeds. A Sei Testnet operator who hits peer handshake failed would copy pacific-1 seeds into an atlantic-2 node. Consider adding the testnet block with labels, as node/index.mdx does: - Sei Mainnet (pacific-1): / - Sei Testnet (atlantic-2):.


On `seid` v6.6.2 and later, `seid init` writes these for you. Re-running `init`
against an existing home will not overwrite a `bootstrap-peers` value you have
already set, so edit `config.toml` directly if you need to replace one.

2. **Verify network connectivity:**

Expand Down
175 changes: 0 additions & 175 deletions snippets/random-peers.jsx

This file was deleted.

119 changes: 119 additions & 0 deletions snippets/seeds.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
export const Seeds = ({ format = 'bash', network = 'mainnet' }) => {
// Sei Labs operated seed nodes. Three per network, one per region, so losing
// a region does not cost bootstrap capability.
//
// These are stable, published addresses: the NodeID is pinned by the
// secret-connection handshake, so a mismatched pair is rejected rather than
// silently degraded. They must match the seed table compiled into seid
// (app/seeds in sei-protocol/sei-chain), which is what `seid init` writes.
const SEEDS = {
mainnet: [
'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'
],
testnet: [
'362f934ead3654fca9cafdac63b52b47b2f9a95e@seed-0-p2p.atlantic-2.prod.platform.sei.io:26656',
'1f55cd51183d3a6cad8a3667b91d08d0338bd52e@seed-1-p2p.atlantic-2.prod-euw1.platform.sei.io:26656',
'7152be2e4c1a057d2b2467723058c5f0ec790472@seed-2-p2p.atlantic-2.prod-use2.platform.sei.io:26656'
]
};

const CopyIcon = ({ className }) => (
<svg
role="img"
aria-label="Copy"
xmlns="http://www.w3.org/2000/svg"
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
className={className}>
<path d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" />
<path d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" />
</svg>
);

const CheckIcon = ({ className }) => (
<svg
role="img"
aria-label="Copied"
xmlns="http://www.w3.org/2000/svg"
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
className={className}>
<path d="M5 12l5 5l10 -10" />
</svg>
);

const [copied, setCopied] = useState(false);

const seeds = SEEDS[network] ?? [];

if (seeds.length === 0) {
return (
<div className="not-prose w-full">
<pre
className="m-0 p-3 rounded-md bg-neutral-100 dark:bg-neutral-800 text-sm opacity-70"
style={{ fontFamily: 'var(--sei-font-mono)' }}>
No seeds configured for network “{network}”.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] This line uses curly quotes (“ ”), while the rest of the codebase uses straight quotes. Purely cosmetic.

</pre>
</div>
);
}

const seedString = seeds.join(',');
const displayText = format === 'toml' ? `bootstrap-peers = "${seedString}"` : `SEEDS="${seedString}"`;

const handleCopy = async () => {
try {
await navigator.clipboard.writeText(displayText);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
} catch {
// noop
}
};

return (
<div className="not-prose w-full">
<div className="relative">
<pre
className="m-0 px-4 py-3 pr-24 rounded-lg bg-neutral-100 dark:bg-neutral-900 text-[12.5px] leading-[1.55] whitespace-pre-wrap break-all border border-neutral-200 dark:border-neutral-700 text-neutral-900 dark:text-neutral-100"
style={{ fontFamily: 'var(--sei-font-mono)' }}>
<code style={{ fontFamily: 'var(--sei-font-mono)' }}>{displayText}</code>
</pre>
<div className="absolute top-2 right-2 flex items-center gap-1.5">
<button
type="button"
onClick={handleCopy}
aria-label="Copy seeds"
title="Copy to clipboard"
className="inline-flex items-center gap-1 px-2 py-1 rounded-md text-[11px] font-semibold border border-neutral-300 dark:border-neutral-600 bg-white/80 dark:bg-neutral-800/80 text-neutral-700 dark:text-neutral-200 hover:bg-white dark:hover:bg-neutral-800 transition-colors">
{copied ? (
<>
<CheckIcon className="text-green-600" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] The old snippet used text-green-600 dark:text-green-400 for the Copied check icon. The dark: variant was dropped here, so the icon has lower contrast in dark mode. Consider restoring it.

Copied
</>
) : (
<>
<CopyIcon />
Copy
</>
)}
</button>
</div>
</div>
</div>
);
};
Loading