From 28d3832e3f0fa11a474e52cd0a8f639e43b0b028 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 7 Feb 2023 18:34:36 +0530 Subject: [PATCH 1/3] init : add admin.setMaxPeers and getMaxPeers --- internal/web3ext/web3ext.go | 9 +++++++++ node/api.go | 21 +++++++++++++++++++++ p2p/server.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 64ceb5c42e..316aff3b38 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -192,6 +192,15 @@ web3._extend({ name: 'stopWS', call: 'admin_stopWS' }), + new web3._extend.Method({ + name: 'getMaxPeers', + call: 'admin_getMaxPeers' + }), + new web3._extend.Method({ + name: 'setMaxPeers', + call: 'admin_setMaxPeers', + params: 1 + }), ], properties: [ new web3._extend.Property({ diff --git a/node/api.go b/node/api.go index 1b32399f63..7f6bacf62c 100644 --- a/node/api.go +++ b/node/api.go @@ -61,6 +61,27 @@ type privateAdminAPI struct { node *Node // Node interfaced by this API } +// This function sets the param maxPeers for the node. If there are excess peers attached to the node, it will remove the difference. +func (api *privateAdminAPI) SetMaxPeers(maxPeers int) (bool, error) { + // Make sure the server is running, fail otherwise + server := api.node.Server() + if server == nil { + return false, ErrNodeStopped + } + server.SetMaxPeers(maxPeers) + return true, nil +} + +// This function gets the maxPeers param for the node. +func (api *privateAdminAPI) GetMaxPeers() (int, error) { + // Make sure the server is running, fail otherwise + server := api.node.Server() + if server == nil { + return 0, ErrNodeStopped + } + return server.MaxPeers, nil +} + // AddPeer requests connecting to a remote node, and also maintaining the new // connection at all times, even reconnecting if it is lost. func (api *privateAdminAPI) AddPeer(url string) (bool, error) { diff --git a/p2p/server.go b/p2p/server.go index 138975e54b..fd7a6ebcf1 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -307,6 +307,36 @@ func (srv *Server) Peers() []*Peer { return ps } +func (srv *Server) getNonTrustedPeers() []*Peer { + + allPeers := srv.Peers() + + nontrustedPeers := []*Peer{} + + for _, peer := range allPeers { + + if !peer.Info().Network.Trusted { + + nontrustedPeers = append(nontrustedPeers, peer) + } + } + + return nontrustedPeers +} + +// Peers returns all connected peers. +func (srv *Server) SetMaxPeers(maxPeers int) { + currentPeers := srv.getNonTrustedPeers() + if len(currentPeers) > maxPeers { + peersToDrop := currentPeers[maxPeers:] + for _, peer := range peersToDrop { + log.Warn("CurrentPeers more than MaxPeers", "removing", peer.ID()) + srv.RemovePeer(peer.Node()) + } + } + srv.MaxPeers = maxPeers +} + // PeerCount returns the number of connected peers. func (srv *Server) PeerCount() int { var count int @@ -368,6 +398,7 @@ func (srv *Server) RemoveTrustedPeer(node *enode.Node) { case srv.removetrusted <- node: case <-srv.quit: } + srv.SetMaxPeers(srv.MaxPeers) } // SubscribeEvents subscribes the given channel to peer events From 079536ebcfc22b65685822191a7a7913f19114a5 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Tue, 7 Feb 2023 18:52:05 +0530 Subject: [PATCH 2/3] lint : fix lint --- node/api.go | 3 +++ p2p/server.go | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/node/api.go b/node/api.go index 7f6bacf62c..d838404f7d 100644 --- a/node/api.go +++ b/node/api.go @@ -68,7 +68,9 @@ func (api *privateAdminAPI) SetMaxPeers(maxPeers int) (bool, error) { if server == nil { return false, ErrNodeStopped } + server.SetMaxPeers(maxPeers) + return true, nil } @@ -79,6 +81,7 @@ func (api *privateAdminAPI) GetMaxPeers() (int, error) { if server == nil { return 0, ErrNodeStopped } + return server.MaxPeers, nil } diff --git a/p2p/server.go b/p2p/server.go index fd7a6ebcf1..2f4453e029 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -308,15 +308,12 @@ func (srv *Server) Peers() []*Peer { } func (srv *Server) getNonTrustedPeers() []*Peer { - allPeers := srv.Peers() nontrustedPeers := []*Peer{} for _, peer := range allPeers { - if !peer.Info().Network.Trusted { - nontrustedPeers = append(nontrustedPeers, peer) } } @@ -334,6 +331,7 @@ func (srv *Server) SetMaxPeers(maxPeers int) { srv.RemovePeer(peer.Node()) } } + srv.MaxPeers = maxPeers } From db0f4baf12592213bc98d9f21c63dadafe40dcb7 Mon Sep 17 00:00:00 2001 From: Shivam Sharma Date: Wed, 8 Feb 2023 16:35:48 +0530 Subject: [PATCH 3/3] add : some comments --- p2p/server.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/p2p/server.go b/p2p/server.go index 2f4453e029..7de8504bdc 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -307,6 +307,7 @@ func (srv *Server) Peers() []*Peer { return ps } +// This function retrieves the peers that are not trusted-peers func (srv *Server) getNonTrustedPeers() []*Peer { allPeers := srv.Peers() @@ -321,7 +322,7 @@ func (srv *Server) getNonTrustedPeers() []*Peer { return nontrustedPeers } -// Peers returns all connected peers. +// SetMaxPeers sets the maximum number of peers that can be connected func (srv *Server) SetMaxPeers(maxPeers int) { currentPeers := srv.getNonTrustedPeers() if len(currentPeers) > maxPeers { @@ -396,6 +397,7 @@ func (srv *Server) RemoveTrustedPeer(node *enode.Node) { case srv.removetrusted <- node: case <-srv.quit: } + // Disconnect the peer if maxPeers is breached. srv.SetMaxPeers(srv.MaxPeers) }