diff --git a/network/network.go b/network/network.go index eab4ecca085..af85233beed 100644 --- a/network/network.go +++ b/network/network.go @@ -525,12 +525,10 @@ func (n *network) KnownPeers() ([]byte, []byte) { // // - Respond with all subnet IPs // - The peer requests all peers -// - We believe the peer to be a primary network validator // - We believe ourself to be a primary network validator // // - Respond with subnet IPs tracked by the peer -// - Either the peer does not request all peers or we don't consider them to -// be a primary network validator +// - The peer does not request all peers // - We believe ourself to be a primary network validator // // The reason we allow the peer to request all peers is so that we can avoid @@ -555,8 +553,7 @@ func (n *network) Peers( } } - _, areTheyAPrimaryNetworkValidator := n.config.Validators.GetValidator(constants.PrimaryNetworkID, peerID) - if areWeAPrimaryNetworkValidator && requestAllPeers && areTheyAPrimaryNetworkValidator { + if areWeAPrimaryNetworkValidator && requestAllPeers { // Return IPs for all subnets. return getGossipableIPs( n.ipTracker, diff --git a/network/network_test.go b/network/network_test.go index a79d5d0cf71..e2161755156 100644 --- a/network/network_test.go +++ b/network/network_test.go @@ -28,6 +28,7 @@ import ( "github.com/ava-labs/avalanchego/subnets" "github.com/ava-labs/avalanchego/upgrade" "github.com/ava-labs/avalanchego/utils" + "github.com/ava-labs/avalanchego/utils/bloom" "github.com/ava-labs/avalanchego/utils/constants" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/avalanchego/utils/ips" @@ -753,3 +754,77 @@ func TestAllowConnectionAsAValidator(t *testing.T) { } wg.Wait() } + +func TestGetAllPeers(t *testing.T) { + require := require.New(t) + + // Create a non-validator peer + dialer, listeners, nonVdrNodeIDs, configs := newTestNetwork(t, 1) + + configs[0].Beacons = validators.NewManager() + configs[0].Validators = validators.NewManager() + nonValidatorNetwork, err := NewNetwork( + configs[0], + upgrade.InitiallyActiveTime, + newMessageCreator(t), + prometheus.NewRegistry(), + logging.NoLog{}, + listeners[0], + dialer, + &testHandler{ + InboundHandler: nil, + ConnectedF: nil, + DisconnectedF: nil, + }, + ) + require.NoError(err) + + // Create a network of validators + nodeIDs, networks, wg := newFullyConnectedTestNetwork( + t, + []router.InboundHandler{ + nil, nil, nil, + }, + ) + + // Connect the non-validator peer to the validator network + wg.Add(1) + nonValidatorNetwork.ManuallyTrack(networks[0].config.MyNodeID, networks[0].config.MyIPPort.Get()) + go func() { + defer wg.Done() + + require.NoError(nonValidatorNetwork.Dispatch()) + }() + + { + // The non-validator peer should be able to get all the peers in the network + peersListFromNonVdr := networks[0].Peers(nonVdrNodeIDs[0], nil, true, bloom.EmptyFilter, []byte{}) + require.Len(peersListFromNonVdr, len(nodeIDs)-1) + peerNodes := set.NewSet[ids.NodeID](len(peersListFromNonVdr)) + for _, peer := range peersListFromNonVdr { + peerNodes.Add(peer.NodeID) + } + for _, nodeID := range nodeIDs[1:] { + require.True(peerNodes.Contains(nodeID)) + } + } + + { + // A validator peer should be able to get all the peers in the network + peersListFromVdr := networks[0].Peers(nodeIDs[1], nil, true, bloom.EmptyFilter, []byte{}) + require.Len(peersListFromVdr, len(nodeIDs)-2) // GetPeerList doesn't return the peer that requested it + peerNodes := set.NewSet[ids.NodeID](len(peersListFromVdr)) + for _, peer := range peersListFromVdr { + peerNodes.Add(peer.NodeID) + } + for _, nodeID := range nodeIDs[2:] { + require.True(peerNodes.Contains(nodeID)) + } + } + + nonValidatorNetwork.StartClose() + for _, net := range networks { + net.StartClose() + } + wg.Wait() +}