From 8ecac82166b6612009f2082c455b0f5f48f5888f Mon Sep 17 00:00:00 2001 From: monty-sei Date: Mon, 12 Oct 2026 10:13:39 +1100 Subject: [PATCH] docs(node): retire the random peer list in favour of the Sei Labs seeds The random peer snippet shipped 17 hardcoded community addresses, and only 6 of them still answer: 2 refuse the connection outright and 9 time out. Operators following the node guide were copying a list that is roughly two thirds dead, which looks like a broken network rather than a stale document. They no longer need it. Since v6.6.2, `seid init` writes the Sei Labs seeds into bootstrap-peers for well-known public networks, so peer discovery works with no manual configuration. index.mdx already said so in the init block while still offering the dead list above it, alongside a persistent-peers snippet that is the wrong field for seeds. Those are now one coherent section. Replaces the snippet with one that serves the seeds, in the same shape, so pages keep their copy button. The addresses match app/seeds in sei-chain v6.7.1 exactly, and all six were verified to complete a P2P handshake. Also corrects max-packet-msg-payload-size in the config.toml example, which read 10240 against an actual default of 1000000. llms-full.txt still carries the old snippet, deliberately left alone: AGENTS.md says not to hand-edit it, and the weekly regeneration workflow picks it up from the deployed site. --- node/index.mdx | 41 ++++---- node/technical-reference.mdx | 2 +- node/troubleshooting.mdx | 11 ++- snippets/random-peers.jsx | 175 ----------------------------------- snippets/seeds.jsx | 119 ++++++++++++++++++++++++ 5 files changed, 153 insertions(+), 195 deletions(-) delete mode 100644 snippets/random-peers.jsx create mode 100644 snippets/seeds.jsx diff --git a/node/index.mdx b/node/index.mdx index 39a382e..7086971 100644 --- a/node/index.mdx +++ b/node/index.mdx @@ -6,7 +6,7 @@ keywords: ["sei node", "node operations", "validator", "RPC node", "sei blockcha --- 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** @@ -209,16 +209,6 @@ For the current recommended version, see the Network Versions table above. 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). -You can find peers here: - -- Sei Mainnet (pacific-1): - - - -- Sei Testnet (atlantic-2): - - - ```bash # Initialize node (default mode is full: RPC/P2P bind to all interfaces) # --chain-id is required, e.g. pacific-1 or atlantic-2 @@ -232,13 +222,32 @@ seid init --chain-id # 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="" +##### 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. + + + 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. + + +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): + + + +- Sei Testnet (atlantic-2): + + ##### Configure app settings diff --git a/node/technical-reference.mdx b/node/technical-reference.mdx index 0b42f0b..ad805e1 100644 --- a/node/technical-reference.mdx +++ b/node/technical-reference.mdx @@ -368,7 +368,7 @@ persistent-peers = "" 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 diff --git a/node/troubleshooting.mdx b/node/troubleshooting.mdx index 7135cff..82dd16f 100644 --- a/node/troubleshooting.mdx +++ b/node/troubleshooting.mdx @@ -4,7 +4,7 @@ description: 'Detailed guide for troubleshooting node problems.' 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. @@ -249,9 +249,14 @@ ERR peer handshake failed endpoint={} err=EOF module=p2p **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: - + + + 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:** diff --git a/snippets/random-peers.jsx b/snippets/random-peers.jsx deleted file mode 100644 index 2053422..0000000 --- a/snippets/random-peers.jsx +++ /dev/null @@ -1,175 +0,0 @@ -export const RandomPeers = ({ format = 'bash', network = 'mainnet', count = 5 }) => { - const PEERS = { - mainnet: [ - 'd53ab7681ed0df3d3249fc0132df7c3a131c9c1a@45.250.253.40:51656', - '4ee8aea5bb58e9038d72e74322e3bba755287398@202.8.8.183:11956', - '81409623ae4da3ec7b400cf640dea0b0999a964b@57.128.230.96:51556', - '61a5be64b5215786fe5da712584678d0626636b5@87.249.137.71:51556', - 'f83c536f43df9a5d900cd3c2f702c04d7dddc7b5@136.243.67.45:11956', - 'b8d600a2f568576b5a2df5ee649cf9b809389064@162.19.62.176:26756', - '57860b18ed3e1bbe8901ba73f2e63c7e6fe8b3d3@57.129.54.81:26656', - '04fc6bba6c5c33034811612dca31c7adda24b299@91.134.60.37:16856', - 'de64b779c7f4091e6f1765f5ca4c46f9d3011732@65.108.70.106:46656', - '3be6b24cf86a5938cce7d48f44fb6598465a9924@p2p.state-sync.pacific-1.seinetwork.io:26656', - '70e0c91b83b5ed1beaca798267f2debdf97dac10@18.156.6.83:26656', - 'dd6b1ae002a15c1c8a38e05660f49a93c75d4159@148.251.181.225:26656' - ], - testnet: [ - '71beea83970431f55816eee5f066a611a1dc80f7@p2p.state-sync.atlantic-2.seinetwork.io:26656', - '65c257f9275beb1b99ca169ef89743c034b15db0@3.76.192.224:26656', - '33588592e477c5238ff2a5d8dc765f85790ef853@23.109.47.225:26656', - 'babc3f3f7804933265ec9c40ad94f4da8e9e0017@testnet-seed.rhinostake.com:11956', - '8542cd7e6bf9d260fef543bc49e59be5a3fa9074@seed.publicnode.com:56656' - ] - }; - - const pickRandom = (arr, n) => { - const shuffled = [...arr]; - for (let i = shuffled.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; - } - return shuffled.slice(0, Math.min(n, arr.length)); - }; - - const CopyIcon = ({ className }) => ( - - - - - ); - - const CheckIcon = ({ className }) => ( - - - - ); - - const ShuffleIcon = ({ className }) => ( - - - - - - - - ); - - const pool = PEERS[network] ?? []; - - // Peers are inlined, not fetched. Seed with a deterministic slice so the - // first paint already shows peers (no misleading "loading" text, no - // SSR/hydration mismatch), then randomize on the client in useEffect. - const [peers, setPeers] = useState(() => pool.slice(0, count)); - const [copied, setCopied] = useState(false); - - const shuffle = () => { - setPeers(pickRandom(pool, count)); - }; - - useEffect(() => { - shuffle(); - }, [network, count]); - - if (pool.length === 0) { - return ( -
-
-          No peers configured for network "{network}".
-        
-
- ); - } - - const peerString = peers.join(','); - const displayText = format === 'toml' ? `persistent_peers = "${peerString}"` : `PEERS="${peerString}"`; - - const handleCopy = async () => { - try { - await navigator.clipboard.writeText(displayText); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - } catch { - // noop - } - }; - - return ( -
-
-
-          {displayText}
-        
-
- - -
-
-
- ); -}; diff --git a/snippets/seeds.jsx b/snippets/seeds.jsx new file mode 100644 index 0000000..3b30d93 --- /dev/null +++ b/snippets/seeds.jsx @@ -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 }) => ( + + + + + ); + + const CheckIcon = ({ className }) => ( + + + + ); + + const [copied, setCopied] = useState(false); + + const seeds = SEEDS[network] ?? []; + + if (seeds.length === 0) { + return ( +
+
+          No seeds configured for network “{network}”.
+        
+
+ ); + } + + 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 ( +
+
+
+          {displayText}
+        
+
+ +
+
+
+ ); +};