Skip to content

Commit c0b85a8

Browse files
authored
Allow non primary network validators to request all peers (#3491)
1 parent aaedc23 commit c0b85a8

File tree

2 files changed

+77
-5
lines changed

2 files changed

+77
-5
lines changed

network/network.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -525,12 +525,10 @@ func (n *network) KnownPeers() ([]byte, []byte) {
525525
//
526526
// - Respond with all subnet IPs
527527
// - The peer requests all peers
528-
// - We believe the peer to be a primary network validator
529528
// - We believe ourself to be a primary network validator
530529
//
531530
// - Respond with subnet IPs tracked by the peer
532-
// - Either the peer does not request all peers or we don't consider them to
533-
// be a primary network validator
531+
// - The peer does not request all peers
534532
// - We believe ourself to be a primary network validator
535533
//
536534
// The reason we allow the peer to request all peers is so that we can avoid
@@ -555,8 +553,7 @@ func (n *network) Peers(
555553
}
556554
}
557555

558-
_, areTheyAPrimaryNetworkValidator := n.config.Validators.GetValidator(constants.PrimaryNetworkID, peerID)
559-
if areWeAPrimaryNetworkValidator && requestAllPeers && areTheyAPrimaryNetworkValidator {
556+
if areWeAPrimaryNetworkValidator && requestAllPeers {
560557
// Return IPs for all subnets.
561558
return getGossipableIPs(
562559
n.ipTracker,

network/network_test.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/ava-labs/avalanchego/subnets"
2929
"github.com/ava-labs/avalanchego/upgrade"
3030
"github.com/ava-labs/avalanchego/utils"
31+
"github.com/ava-labs/avalanchego/utils/bloom"
3132
"github.com/ava-labs/avalanchego/utils/constants"
3233
"github.com/ava-labs/avalanchego/utils/crypto/bls"
3334
"github.com/ava-labs/avalanchego/utils/ips"
@@ -753,3 +754,77 @@ func TestAllowConnectionAsAValidator(t *testing.T) {
753754
}
754755
wg.Wait()
755756
}
757+
758+
func TestGetAllPeers(t *testing.T) {
759+
require := require.New(t)
760+
761+
// Create a non-validator peer
762+
dialer, listeners, nonVdrNodeIDs, configs := newTestNetwork(t, 1)
763+
764+
configs[0].Beacons = validators.NewManager()
765+
configs[0].Validators = validators.NewManager()
766+
nonValidatorNetwork, err := NewNetwork(
767+
configs[0],
768+
upgrade.InitiallyActiveTime,
769+
newMessageCreator(t),
770+
prometheus.NewRegistry(),
771+
logging.NoLog{},
772+
listeners[0],
773+
dialer,
774+
&testHandler{
775+
InboundHandler: nil,
776+
ConnectedF: nil,
777+
DisconnectedF: nil,
778+
},
779+
)
780+
require.NoError(err)
781+
782+
// Create a network of validators
783+
nodeIDs, networks, wg := newFullyConnectedTestNetwork(
784+
t,
785+
[]router.InboundHandler{
786+
nil, nil, nil,
787+
},
788+
)
789+
790+
// Connect the non-validator peer to the validator network
791+
wg.Add(1)
792+
nonValidatorNetwork.ManuallyTrack(networks[0].config.MyNodeID, networks[0].config.MyIPPort.Get())
793+
go func() {
794+
defer wg.Done()
795+
796+
require.NoError(nonValidatorNetwork.Dispatch())
797+
}()
798+
799+
{
800+
// The non-validator peer should be able to get all the peers in the network
801+
peersListFromNonVdr := networks[0].Peers(nonVdrNodeIDs[0], nil, true, bloom.EmptyFilter, []byte{})
802+
require.Len(peersListFromNonVdr, len(nodeIDs)-1)
803+
peerNodes := set.NewSet[ids.NodeID](len(peersListFromNonVdr))
804+
for _, peer := range peersListFromNonVdr {
805+
peerNodes.Add(peer.NodeID)
806+
}
807+
for _, nodeID := range nodeIDs[1:] {
808+
require.True(peerNodes.Contains(nodeID))
809+
}
810+
}
811+
812+
{
813+
// A validator peer should be able to get all the peers in the network
814+
peersListFromVdr := networks[0].Peers(nodeIDs[1], nil, true, bloom.EmptyFilter, []byte{})
815+
require.Len(peersListFromVdr, len(nodeIDs)-2) // GetPeerList doesn't return the peer that requested it
816+
peerNodes := set.NewSet[ids.NodeID](len(peersListFromVdr))
817+
for _, peer := range peersListFromVdr {
818+
peerNodes.Add(peer.NodeID)
819+
}
820+
for _, nodeID := range nodeIDs[2:] {
821+
require.True(peerNodes.Contains(nodeID))
822+
}
823+
}
824+
825+
nonValidatorNetwork.StartClose()
826+
for _, net := range networks {
827+
net.StartClose()
828+
}
829+
wg.Wait()
830+
}

0 commit comments

Comments
 (0)