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}
+        
+
+ +
+
+
+ ); +};