diff --git a/network/p2pNetwork.go b/network/p2pNetwork.go index e8954a0657..92a8241932 100644 --- a/network/p2pNetwork.go +++ b/network/p2pNetwork.go @@ -642,6 +642,9 @@ func (n *P2PNetwork) GetPeers(options ...PeerOption) []Peer { const maxNodes = 100 addrInfos := n.pstore.GetAddresses(maxNodes, phonebook.PhoneBookEntryRelayRole) for _, peerInfo := range addrInfos { + if peerInfo.ID == n.service.ID() { + continue + } if peerCore, ok := addrInfoToWsPeerCore(n, peerInfo); ok { peers = append(peers, &peerCore) } @@ -664,9 +667,10 @@ func (n *P2PNetwork) GetPeers(options ...PeerOption) []Peer { } n.log.Debugf("Got %d archival node(s) from DHT", len(infos)) for _, addrInfo := range infos { - // TODO: remove after go1.22 - info := addrInfo - if peerCore, ok := addrInfoToWsPeerCore(n, &info); ok { + if addrInfo.ID == n.service.ID() { + continue + } + if peerCore, ok := addrInfoToWsPeerCore(n, &addrInfo); ok { peers = append(peers, &peerCore) } } diff --git a/network/p2pNetwork_test.go b/network/p2pNetwork_test.go index f42214b84f..079bbbab03 100644 --- a/network/p2pNetwork_test.go +++ b/network/p2pNetwork_test.go @@ -46,6 +46,7 @@ import ( "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" + "github.com/multiformats/go-multiaddr" ma "github.com/multiformats/go-multiaddr" "github.com/stretchr/testify/require" ) @@ -1405,3 +1406,49 @@ func TestP2PTxTopicValidator_NoWsPeer(t *testing.T) { res := net.txTopicValidator(ctx, peerID, &msg) require.Equal(t, pubsub.ValidationAccept, res) } + +// TestGetPeersFiltersSelf checks that GetPeers does not return the node's own peer ID. +// The test adds a self peer to the peerstore and another peer to the peerstore and verifies that +// the self peer is not in the returned list. +func TestGetPeersFiltersSelf(t *testing.T) { + partitiontest.PartitionTest(t) + + log := logging.TestingLog(t) + cfg := config.GetDefaultLocal() + + net, err := NewP2PNetwork(log, cfg, t.TempDir(), []string{}, "test-genesis", "test-network", &nopeNodeInfo{}, nil) + require.NoError(t, err) + selfID := net.service.ID() + + // Create and add self + selfAddr, err := ma.NewMultiaddr("/ip4/127.0.0.1/p2p/" + selfID.String()) + require.NoError(t, err) + selfInfo := &peer.AddrInfo{ + ID: selfID, + Addrs: []multiaddr.Multiaddr{selfAddr}, + } + net.pstore.AddPersistentPeers([]*peer.AddrInfo{selfInfo}, "test-network", phonebook.PhoneBookEntryRelayRole) + + // Create and add another peer + otherID, err := peer.Decode("QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N") + require.NoError(t, err) + addr, err := ma.NewMultiaddr("/ip4/127.0.0.1/p2p/" + otherID.String()) + require.NoError(t, err) + otherInfo := &peer.AddrInfo{ + ID: otherID, + Addrs: []multiaddr.Multiaddr{addr}, + } + net.pstore.AddPersistentPeers([]*peer.AddrInfo{otherInfo}, "test-network", phonebook.PhoneBookEntryRelayRole) + + peers := net.GetPeers(PeersPhonebookRelays) + + // Verify that self peer is not in the returned list + for _, p := range peers { + switch peer := p.(type) { + case *wsPeerCore: + require.NotEqual(t, selfAddr.String(), peer.GetAddress(), "GetPeers should not return the node's own peer ID") + default: + t.Fatalf("unexpected peer type: %T", peer) + } + } +}