How a node finds peers
A new node needs at least one address to start from. It dials theseeds and receives addresses from them through peer exchange (PEX). It stores those addresses in config/addrbook.json and from then on dials from the address book. Entries in persistent_peers are dialed regardless and redialed when the connection drops. Everything is in config.toml under [p2p]. The gaiad init command writes these defaults:
<node-id>@<host>:<port>. The node ID is the hash of the node key in config/node_key.json:
node_key.json and restarting generates a new one. The node then gets a new ID that other operators’ persistent_peers entries no longer match.
Seeds and persistent peers for cosmoshub-4
The maintained list is in the chain registry underpeers.seeds and peers.persistent_peers (ten seeds and eight persistent peers on 2026-10-15). Pull the seeds from there rather than copying a list that goes stale:
seeds. The -s flag (--skip-validate) is required for every config.toml key on v28.3.1. Without it the command fails with cometbft config is not supported.
persistent_peers short. Put your own sentries or a few nodes you trust there. A long list of public persistent peers only wastes dial attempts when they are full. Testnet seeds for chain-id provider are in the cosmos/testnets provider README.
Peer limits and addresses
The defaultsmax_num_inbound_peers = 40 and max_num_outbound_peers = 10 suit a normal full node. An endpoint node that many others want to dial can raise inbound to 80 or more if it has the bandwidth. Outbound rarely needs to go above 20. Each peer costs memory and a steady few KiB/s.
The external_address key must be set when the node is behind network address translation (NAT) or a cloud public IP that the interface does not have. Otherwise peers receive the private address and cannot dial back:
private_peer_ids to the validator’s node ID so the validator address is never gossiped. The validator sets pex = false with only its sentries in persistent_peers. The full layout is on Validator security.
Run a seed node
A seed node answers address requests and disconnects. It does not keep peers or relay blocks. It is a normal full node with:<node-id>@<host>:26656 in the chain registry peers.seeds list once it has run stably. A seed that goes offline leaves every node that copied it dialing a dead address at startup. Remove the entry before decommissioning.
Verify
Count connected peers through the local RPC:n_peers count should stay near max_num_outbound_peers plus whatever inbound traffic arrives. The listening field is true. If n_peers stays at 0, the seeds entry is empty or malformed. The log line Dialing peer followed by auth failure means the node ID in an entry does not match the peer’s key. The node’s own ID comes from gaiad comet show-node-id. Compare it with what a remote operator put in their config if they cannot reach you.
Next
- Sync options if the node has peers but does not catch up.
- Validator security for sentries and private peers.
- Monitoring for the
cometbft_p2p_peersmetric.