github.com/ethereum/go-ethereum@v1.16.1/p2p/server.go (about)

     1  // Copyright 2014 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  // Package p2p implements the Ethereum p2p network protocols.
    18  package p2p
    19  
    20  import (
    21  	"bytes"
    22  	"cmp"
    23  	"crypto/ecdsa"
    24  	"encoding/hex"
    25  	"errors"
    26  	"fmt"
    27  	"net"
    28  	"net/netip"
    29  	"slices"
    30  	"sync"
    31  	"sync/atomic"
    32  	"time"
    33  
    34  	"github.com/ethereum/go-ethereum/common"
    35  	"github.com/ethereum/go-ethereum/common/mclock"
    36  	"github.com/ethereum/go-ethereum/crypto"
    37  	"github.com/ethereum/go-ethereum/event"
    38  	"github.com/ethereum/go-ethereum/log"
    39  	"github.com/ethereum/go-ethereum/p2p/discover"
    40  	"github.com/ethereum/go-ethereum/p2p/enode"
    41  	"github.com/ethereum/go-ethereum/p2p/enr"
    42  	"github.com/ethereum/go-ethereum/p2p/netutil"
    43  )
    44  
    45  const (
    46  	defaultDialTimeout = 15 * time.Second
    47  
    48  	// Connectivity defaults.
    49  	defaultMaxPendingPeers = 50
    50  	defaultDialRatio       = 3
    51  
    52  	// This time limits inbound connection attempts per source IP.
    53  	inboundThrottleTime = 30 * time.Second
    54  
    55  	// Maximum time allowed for reading a complete message.
    56  	// This is effectively the amount of time a connection can be idle.
    57  	frameReadTimeout = 30 * time.Second
    58  
    59  	// Maximum amount of time allowed for writing a complete message.
    60  	frameWriteTimeout = 20 * time.Second
    61  )
    62  
    63  var (
    64  	errServerStopped     = errors.New("server stopped")
    65  	errEncHandshakeError = errors.New("rlpx enc error")
    66  )
    67  
    68  type protoHandshakeError struct{ err error }
    69  
    70  func (e *protoHandshakeError) Error() string { return fmt.Sprintf("rlpx proto error: %v", e.err) }
    71  func (e *protoHandshakeError) Unwrap() error { return e.err }
    72  
    73  // Server manages all peer connections.
    74  type Server struct {
    75  	// Config fields may not be modified while the server is running.
    76  	Config
    77  
    78  	// Hooks for testing. These are useful because we can inhibit
    79  	// the whole protocol stack.
    80  	newTransport func(net.Conn, *ecdsa.PublicKey) transport
    81  	newPeerHook  func(*Peer)
    82  	listenFunc   func(network, addr string) (net.Listener, error)
    83  
    84  	lock    sync.Mutex // protects running
    85  	running bool
    86  
    87  	listener     net.Listener
    88  	ourHandshake *protoHandshake
    89  	loopWG       sync.WaitGroup // loop, listenLoop
    90  	peerFeed     event.Feed
    91  	log          log.Logger
    92  
    93  	nodedb    *enode.DB
    94  	localnode *enode.LocalNode
    95  	discv4    *discover.UDPv4
    96  	discv5    *discover.UDPv5
    97  	discmix   *enode.FairMix
    98  	dialsched *dialScheduler
    99  
   100  	// This is read by the NAT port mapping loop.
   101  	portMappingRegister chan *portMapping
   102  
   103  	// Channels into the run loop.
   104  	quit                    chan struct{}
   105  	addtrusted              chan *enode.Node
   106  	removetrusted           chan *enode.Node
   107  	peerOp                  chan peerOpFunc
   108  	peerOpDone              chan struct{}
   109  	delpeer                 chan peerDrop
   110  	checkpointPostHandshake chan *conn
   111  	checkpointAddPeer       chan *conn
   112  
   113  	// State of run loop and listenLoop.
   114  	inboundHistory expHeap
   115  }
   116  
   117  type peerOpFunc func(map[enode.ID]*Peer)
   118  
   119  type peerDrop struct {
   120  	*Peer
   121  	err       error
   122  	requested bool // true if signaled by the peer
   123  }
   124  
   125  type connFlag int32
   126  
   127  const (
   128  	dynDialedConn connFlag = 1 << iota
   129  	staticDialedConn
   130  	inboundConn
   131  	trustedConn
   132  )
   133  
   134  // conn wraps a network connection with information gathered
   135  // during the two handshakes.
   136  type conn struct {
   137  	fd net.Conn
   138  	transport
   139  	node  *enode.Node
   140  	flags connFlag
   141  	cont  chan error // The run loop uses cont to signal errors to SetupConn.
   142  	caps  []Cap      // valid after the protocol handshake
   143  	name  string     // valid after the protocol handshake
   144  }
   145  
   146  type transport interface {
   147  	// The two handshakes.
   148  	doEncHandshake(prv *ecdsa.PrivateKey) (*ecdsa.PublicKey, error)
   149  	doProtoHandshake(our *protoHandshake) (*protoHandshake, error)
   150  	// The MsgReadWriter can only be used after the encryption
   151  	// handshake has completed. The code uses conn.id to track this
   152  	// by setting it to a non-nil value after the encryption handshake.
   153  	MsgReadWriter
   154  	// transports must provide Close because we use MsgPipe in some of
   155  	// the tests. Closing the actual network connection doesn't do
   156  	// anything in those tests because MsgPipe doesn't use it.
   157  	close(err error)
   158  }
   159  
   160  func (c *conn) String() string {
   161  	s := c.flags.String()
   162  	if (c.node.ID() != enode.ID{}) {
   163  		s += " " + c.node.ID().String()
   164  	}
   165  	s += " " + c.fd.RemoteAddr().String()
   166  	return s
   167  }
   168  
   169  func (f connFlag) String() string {
   170  	s := ""
   171  	if f&trustedConn != 0 {
   172  		s += "-trusted"
   173  	}
   174  	if f&dynDialedConn != 0 {
   175  		s += "-dyndial"
   176  	}
   177  	if f&staticDialedConn != 0 {
   178  		s += "-staticdial"
   179  	}
   180  	if f&inboundConn != 0 {
   181  		s += "-inbound"
   182  	}
   183  	if s != "" {
   184  		s = s[1:]
   185  	}
   186  	return s
   187  }
   188  
   189  func (c *conn) is(f connFlag) bool {
   190  	flags := connFlag(atomic.LoadInt32((*int32)(&c.flags)))
   191  	return flags&f != 0
   192  }
   193  
   194  func (c *conn) set(f connFlag, val bool) {
   195  	for {
   196  		oldFlags := connFlag(atomic.LoadInt32((*int32)(&c.flags)))
   197  		flags := oldFlags
   198  		if val {
   199  			flags |= f
   200  		} else {
   201  			flags &= ^f
   202  		}
   203  		if atomic.CompareAndSwapInt32((*int32)(&c.flags), int32(oldFlags), int32(flags)) {
   204  			return
   205  		}
   206  	}
   207  }
   208  
   209  // LocalNode returns the local node record.
   210  func (srv *Server) LocalNode() *enode.LocalNode {
   211  	return srv.localnode
   212  }
   213  
   214  // Peers returns all connected peers.
   215  func (srv *Server) Peers() []*Peer {
   216  	var ps []*Peer
   217  	srv.doPeerOp(func(peers map[enode.ID]*Peer) {
   218  		for _, p := range peers {
   219  			ps = append(ps, p)
   220  		}
   221  	})
   222  	return ps
   223  }
   224  
   225  // PeerCount returns the number of connected peers.
   226  func (srv *Server) PeerCount() int {
   227  	var count int
   228  	srv.doPeerOp(func(ps map[enode.ID]*Peer) {
   229  		count = len(ps)
   230  	})
   231  	return count
   232  }
   233  
   234  // AddPeer adds the given node to the static node set. When there is room in the peer set,
   235  // the server will connect to the node. If the connection fails for any reason, the server
   236  // will attempt to reconnect the peer.
   237  func (srv *Server) AddPeer(node *enode.Node) {
   238  	srv.dialsched.addStatic(node)
   239  }
   240  
   241  // RemovePeer removes a node from the static node set. It also disconnects from the given
   242  // node if it is currently connected as a peer.
   243  //
   244  // This method blocks until all protocols have exited and the peer is removed. Do not use
   245  // RemovePeer in protocol implementations, call Disconnect on the Peer instead.
   246  func (srv *Server) RemovePeer(node *enode.Node) {
   247  	var (
   248  		ch  chan *PeerEvent
   249  		sub event.Subscription
   250  	)
   251  	// Disconnect the peer on the main loop.
   252  	srv.doPeerOp(func(peers map[enode.ID]*Peer) {
   253  		srv.dialsched.removeStatic(node)
   254  		if peer := peers[node.ID()]; peer != nil {
   255  			ch = make(chan *PeerEvent, 1)
   256  			sub = srv.peerFeed.Subscribe(ch)
   257  			peer.Disconnect(DiscRequested)
   258  		}
   259  	})
   260  	// Wait for the peer connection to end.
   261  	if ch != nil {
   262  		defer sub.Unsubscribe()
   263  		for ev := range ch {
   264  			if ev.Peer == node.ID() && ev.Type == PeerEventTypeDrop {
   265  				return
   266  			}
   267  		}
   268  	}
   269  }
   270  
   271  // AddTrustedPeer adds the given node to a reserved trusted list which allows the
   272  // node to always connect, even if the slot are full.
   273  func (srv *Server) AddTrustedPeer(node *enode.Node) {
   274  	select {
   275  	case srv.addtrusted <- node:
   276  	case <-srv.quit:
   277  	}
   278  }
   279  
   280  // RemoveTrustedPeer removes the given node from the trusted peer set.
   281  func (srv *Server) RemoveTrustedPeer(node *enode.Node) {
   282  	select {
   283  	case srv.removetrusted <- node:
   284  	case <-srv.quit:
   285  	}
   286  }
   287  
   288  // SubscribeEvents subscribes the given channel to peer events
   289  func (srv *Server) SubscribeEvents(ch chan *PeerEvent) event.Subscription {
   290  	return srv.peerFeed.Subscribe(ch)
   291  }
   292  
   293  // Self returns the local node's endpoint information.
   294  func (srv *Server) Self() *enode.Node {
   295  	srv.lock.Lock()
   296  	ln := srv.localnode
   297  	srv.lock.Unlock()
   298  
   299  	if ln == nil {
   300  		return enode.NewV4(&srv.PrivateKey.PublicKey, net.ParseIP("0.0.0.0"), 0, 0)
   301  	}
   302  	return ln.Node()
   303  }
   304  
   305  // DiscoveryV4 returns the discovery v4 instance, if configured.
   306  func (srv *Server) DiscoveryV4() *discover.UDPv4 {
   307  	return srv.discv4
   308  }
   309  
   310  // DiscoveryV5 returns the discovery v5 instance, if configured.
   311  func (srv *Server) DiscoveryV5() *discover.UDPv5 {
   312  	return srv.discv5
   313  }
   314  
   315  // Stop terminates the server and all active peer connections.
   316  // It blocks until all active connections have been closed.
   317  func (srv *Server) Stop() {
   318  	srv.lock.Lock()
   319  	if !srv.running {
   320  		srv.lock.Unlock()
   321  		return
   322  	}
   323  	srv.running = false
   324  	if srv.listener != nil {
   325  		// this unblocks listener Accept
   326  		srv.listener.Close()
   327  	}
   328  	close(srv.quit)
   329  	srv.lock.Unlock()
   330  	srv.loopWG.Wait()
   331  }
   332  
   333  // sharedUDPConn implements a shared connection. Write sends messages to the underlying connection while read returns
   334  // messages that were found unprocessable and sent to the unhandled channel by the primary listener.
   335  type sharedUDPConn struct {
   336  	*net.UDPConn
   337  	unhandled chan discover.ReadPacket
   338  }
   339  
   340  // ReadFromUDPAddrPort implements discover.UDPConn
   341  func (s *sharedUDPConn) ReadFromUDPAddrPort(b []byte) (n int, addr netip.AddrPort, err error) {
   342  	packet, ok := <-s.unhandled
   343  	if !ok {
   344  		return 0, netip.AddrPort{}, errors.New("connection was closed")
   345  	}
   346  	l := len(packet.Data)
   347  	if l > len(b) {
   348  		l = len(b)
   349  	}
   350  	copy(b[:l], packet.Data[:l])
   351  	return l, packet.Addr, nil
   352  }
   353  
   354  // Close implements discover.UDPConn
   355  func (s *sharedUDPConn) Close() error {
   356  	return nil
   357  }
   358  
   359  // Start starts running the server.
   360  // Servers can not be re-used after stopping.
   361  func (srv *Server) Start() (err error) {
   362  	srv.lock.Lock()
   363  	defer srv.lock.Unlock()
   364  	if srv.running {
   365  		return errors.New("server already running")
   366  	}
   367  	srv.running = true
   368  	srv.log = srv.Logger
   369  	if srv.log == nil {
   370  		srv.log = log.Root()
   371  	}
   372  	if srv.clock == nil {
   373  		srv.clock = mclock.System{}
   374  	}
   375  	if srv.NoDial && srv.ListenAddr == "" {
   376  		srv.log.Warn("P2P server will be useless, neither dialing nor listening")
   377  	}
   378  
   379  	// static fields
   380  	if srv.PrivateKey == nil {
   381  		return errors.New("Server.PrivateKey must be set to a non-nil key")
   382  	}
   383  	if srv.newTransport == nil {
   384  		srv.newTransport = newRLPX
   385  	}
   386  	if srv.listenFunc == nil {
   387  		srv.listenFunc = net.Listen
   388  	}
   389  	srv.quit = make(chan struct{})
   390  	srv.delpeer = make(chan peerDrop)
   391  	srv.checkpointPostHandshake = make(chan *conn)
   392  	srv.checkpointAddPeer = make(chan *conn)
   393  	srv.addtrusted = make(chan *enode.Node)
   394  	srv.removetrusted = make(chan *enode.Node)
   395  	srv.peerOp = make(chan peerOpFunc)
   396  	srv.peerOpDone = make(chan struct{})
   397  
   398  	if err := srv.setupLocalNode(); err != nil {
   399  		return err
   400  	}
   401  	srv.setupPortMapping()
   402  
   403  	if srv.ListenAddr != "" {
   404  		if err := srv.setupListening(); err != nil {
   405  			return err
   406  		}
   407  	}
   408  	if err := srv.setupDiscovery(); err != nil {
   409  		return err
   410  	}
   411  	srv.setupDialScheduler()
   412  
   413  	srv.loopWG.Add(1)
   414  	go srv.run()
   415  	return nil
   416  }
   417  
   418  func (srv *Server) setupLocalNode() error {
   419  	// Create the devp2p handshake.
   420  	pubkey := crypto.FromECDSAPub(&srv.PrivateKey.PublicKey)
   421  	srv.ourHandshake = &protoHandshake{Version: baseProtocolVersion, Name: srv.Name, ID: pubkey[1:]}
   422  	for _, p := range srv.Protocols {
   423  		srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap())
   424  	}
   425  	slices.SortFunc(srv.ourHandshake.Caps, Cap.Cmp)
   426  
   427  	// Create the local node.
   428  	db, err := enode.OpenDB(srv.NodeDatabase)
   429  	if err != nil {
   430  		return err
   431  	}
   432  	srv.nodedb = db
   433  	srv.localnode = enode.NewLocalNode(db, srv.PrivateKey)
   434  	srv.localnode.SetFallbackIP(net.IP{127, 0, 0, 1})
   435  	// TODO: check conflicts
   436  	for _, p := range srv.Protocols {
   437  		for _, e := range p.Attributes {
   438  			srv.localnode.Set(e)
   439  		}
   440  	}
   441  	return nil
   442  }
   443  
   444  func (srv *Server) setupDiscovery() error {
   445  	// Set up the discovery source mixer. Here, we don't care about the
   446  	// fairness of the mix, it's just for putting the
   447  	srv.discmix = enode.NewFairMix(0)
   448  
   449  	// Don't listen on UDP endpoint if DHT is disabled.
   450  	if srv.NoDiscovery {
   451  		return nil
   452  	}
   453  	conn, err := srv.setupUDPListening()
   454  	if err != nil {
   455  		return err
   456  	}
   457  
   458  	var (
   459  		sconn     discover.UDPConn = conn
   460  		unhandled chan discover.ReadPacket
   461  	)
   462  	// If both versions of discovery are running, setup a shared
   463  	// connection, so v5 can read unhandled messages from v4.
   464  	if srv.Config.DiscoveryV4 && srv.Config.DiscoveryV5 {
   465  		unhandled = make(chan discover.ReadPacket, 100)
   466  		sconn = &sharedUDPConn{conn, unhandled}
   467  	}
   468  
   469  	// Start discovery services.
   470  	if srv.Config.DiscoveryV4 {
   471  		cfg := discover.Config{
   472  			PrivateKey:  srv.PrivateKey,
   473  			NetRestrict: srv.NetRestrict,
   474  			Bootnodes:   srv.BootstrapNodes,
   475  			Unhandled:   unhandled,
   476  			Log:         srv.log,
   477  		}
   478  		ntab, err := discover.ListenV4(conn, srv.localnode, cfg)
   479  		if err != nil {
   480  			return err
   481  		}
   482  		srv.discv4 = ntab
   483  	}
   484  	if srv.Config.DiscoveryV5 {
   485  		cfg := discover.Config{
   486  			PrivateKey:  srv.PrivateKey,
   487  			NetRestrict: srv.NetRestrict,
   488  			Bootnodes:   srv.BootstrapNodesV5,
   489  			Log:         srv.log,
   490  		}
   491  		srv.discv5, err = discover.ListenV5(sconn, srv.localnode, cfg)
   492  		if err != nil {
   493  			return err
   494  		}
   495  	}
   496  
   497  	// Add protocol-specific discovery sources.
   498  	added := make(map[string]bool)
   499  	for _, proto := range srv.Protocols {
   500  		if proto.DialCandidates != nil && !added[proto.Name] {
   501  			srv.discmix.AddSource(proto.DialCandidates)
   502  			added[proto.Name] = true
   503  		}
   504  	}
   505  
   506  	// Set up default non-protocol-specific discovery feeds if no protocol
   507  	// has configured discovery.
   508  	if len(added) == 0 {
   509  		if srv.discv4 != nil {
   510  			it := srv.discv4.RandomNodes()
   511  			srv.discmix.AddSource(enode.WithSourceName("discv4-default", it))
   512  		}
   513  		if srv.discv5 != nil {
   514  			it := srv.discv5.RandomNodes()
   515  			srv.discmix.AddSource(enode.WithSourceName("discv5-default", it))
   516  		}
   517  	}
   518  	return nil
   519  }
   520  
   521  func (srv *Server) setupDialScheduler() {
   522  	config := dialConfig{
   523  		self:           srv.localnode.ID(),
   524  		maxDialPeers:   srv.MaxDialedConns(),
   525  		maxActiveDials: srv.MaxPendingPeers,
   526  		log:            srv.Logger,
   527  		netRestrict:    srv.NetRestrict,
   528  		dialer:         srv.Dialer,
   529  		clock:          srv.clock,
   530  	}
   531  	if srv.discv4 != nil {
   532  		config.resolver = srv.discv4
   533  	}
   534  	if config.dialer == nil {
   535  		config.dialer = tcpDialer{&net.Dialer{Timeout: defaultDialTimeout}}
   536  	}
   537  	srv.dialsched = newDialScheduler(config, srv.discmix, srv.SetupConn)
   538  	for _, n := range srv.StaticNodes {
   539  		srv.dialsched.addStatic(n)
   540  	}
   541  }
   542  
   543  func (srv *Server) MaxInboundConns() int {
   544  	return srv.MaxPeers - srv.MaxDialedConns()
   545  }
   546  
   547  func (srv *Server) MaxDialedConns() (limit int) {
   548  	if srv.NoDial || srv.MaxPeers == 0 {
   549  		return 0
   550  	}
   551  	if srv.DialRatio == 0 {
   552  		limit = srv.MaxPeers / defaultDialRatio
   553  	} else {
   554  		limit = srv.MaxPeers / srv.DialRatio
   555  	}
   556  	if limit == 0 {
   557  		limit = 1
   558  	}
   559  	return limit
   560  }
   561  
   562  func (srv *Server) setupListening() error {
   563  	// Launch the listener.
   564  	listener, err := srv.listenFunc("tcp", srv.ListenAddr)
   565  	if err != nil {
   566  		return err
   567  	}
   568  	srv.listener = listener
   569  	srv.ListenAddr = listener.Addr().String()
   570  
   571  	// Update the local node record and map the TCP listening port if NAT is configured.
   572  	tcp, isTCP := listener.Addr().(*net.TCPAddr)
   573  	if isTCP {
   574  		srv.localnode.Set(enr.TCP(tcp.Port))
   575  		if !tcp.IP.IsLoopback() && !tcp.IP.IsPrivate() {
   576  			srv.portMappingRegister <- &portMapping{
   577  				protocol: "TCP",
   578  				name:     "ethereum p2p",
   579  				port:     tcp.Port,
   580  			}
   581  		}
   582  	}
   583  
   584  	srv.loopWG.Add(1)
   585  	go srv.listenLoop()
   586  	return nil
   587  }
   588  
   589  func (srv *Server) setupUDPListening() (*net.UDPConn, error) {
   590  	listenAddr := srv.ListenAddr
   591  
   592  	// Use an alternate listening address for UDP if
   593  	// a custom discovery address is configured.
   594  	if srv.DiscAddr != "" {
   595  		listenAddr = srv.DiscAddr
   596  	}
   597  	addr, err := net.ResolveUDPAddr("udp", listenAddr)
   598  	if err != nil {
   599  		return nil, err
   600  	}
   601  	conn, err := net.ListenUDP("udp", addr)
   602  	if err != nil {
   603  		return nil, err
   604  	}
   605  	laddr := conn.LocalAddr().(*net.UDPAddr)
   606  	srv.localnode.SetFallbackUDP(laddr.Port)
   607  	srv.log.Debug("UDP listener up", "addr", laddr)
   608  	if !laddr.IP.IsLoopback() && !laddr.IP.IsPrivate() {
   609  		srv.portMappingRegister <- &portMapping{
   610  			protocol: "UDP",
   611  			name:     "ethereum peer discovery",
   612  			port:     laddr.Port,
   613  		}
   614  	}
   615  
   616  	return conn, nil
   617  }
   618  
   619  // doPeerOp runs fn on the main loop.
   620  func (srv *Server) doPeerOp(fn peerOpFunc) {
   621  	select {
   622  	case srv.peerOp <- fn:
   623  		<-srv.peerOpDone
   624  	case <-srv.quit:
   625  	}
   626  }
   627  
   628  // run is the main loop of the server.
   629  func (srv *Server) run() {
   630  	srv.log.Info("Started P2P networking", "self", srv.localnode.Node().URLv4())
   631  	defer srv.loopWG.Done()
   632  	defer srv.nodedb.Close()
   633  	defer srv.discmix.Close()
   634  	defer srv.dialsched.stop()
   635  
   636  	var (
   637  		peers        = make(map[enode.ID]*Peer)
   638  		inboundCount = 0
   639  		trusted      = make(map[enode.ID]bool, len(srv.TrustedNodes))
   640  	)
   641  	// Put trusted nodes into a map to speed up checks.
   642  	// Trusted peers are loaded on startup or added via AddTrustedPeer RPC.
   643  	for _, n := range srv.TrustedNodes {
   644  		trusted[n.ID()] = true
   645  	}
   646  
   647  running:
   648  	for {
   649  		select {
   650  		case <-srv.quit:
   651  			// The server was stopped. Run the cleanup logic.
   652  			break running
   653  
   654  		case n := <-srv.addtrusted:
   655  			// This channel is used by AddTrustedPeer to add a node
   656  			// to the trusted node set.
   657  			srv.log.Trace("Adding trusted node", "node", n)
   658  			trusted[n.ID()] = true
   659  			if p, ok := peers[n.ID()]; ok {
   660  				p.rw.set(trustedConn, true)
   661  			}
   662  
   663  		case n := <-srv.removetrusted:
   664  			// This channel is used by RemoveTrustedPeer to remove a node
   665  			// from the trusted node set.
   666  			srv.log.Trace("Removing trusted node", "node", n)
   667  			delete(trusted, n.ID())
   668  			if p, ok := peers[n.ID()]; ok {
   669  				p.rw.set(trustedConn, false)
   670  			}
   671  
   672  		case op := <-srv.peerOp:
   673  			// This channel is used by Peers and PeerCount.
   674  			op(peers)
   675  			srv.peerOpDone <- struct{}{}
   676  
   677  		case c := <-srv.checkpointPostHandshake:
   678  			// A connection has passed the encryption handshake so
   679  			// the remote identity is known (but hasn't been verified yet).
   680  			if trusted[c.node.ID()] {
   681  				// Ensure that the trusted flag is set before checking against MaxPeers.
   682  				c.flags |= trustedConn
   683  			}
   684  			// TODO: track in-progress inbound node IDs (pre-Peer) to avoid dialing them.
   685  			c.cont <- srv.postHandshakeChecks(peers, inboundCount, c)
   686  
   687  		case c := <-srv.checkpointAddPeer:
   688  			// At this point the connection is past the protocol handshake.
   689  			// Its capabilities are known and the remote identity is verified.
   690  			err := srv.addPeerChecks(peers, inboundCount, c)
   691  			if err == nil {
   692  				// The handshakes are done and it passed all checks.
   693  				p := srv.launchPeer(c)
   694  				peers[c.node.ID()] = p
   695  				srv.log.Debug("Adding p2p peer", "peercount", len(peers), "id", p.ID(), "conn", c.flags, "addr", p.RemoteAddr(), "name", p.Name())
   696  				srv.dialsched.peerAdded(c)
   697  				if p.Inbound() {
   698  					inboundCount++
   699  					serveSuccessMeter.Mark(1)
   700  					activeInboundPeerGauge.Inc(1)
   701  				} else {
   702  					dialSuccessMeter.Mark(1)
   703  					activeOutboundPeerGauge.Inc(1)
   704  				}
   705  				activePeerGauge.Inc(1)
   706  			}
   707  			c.cont <- err
   708  
   709  		case pd := <-srv.delpeer:
   710  			// A peer disconnected.
   711  			d := common.PrettyDuration(mclock.Now() - pd.created)
   712  			delete(peers, pd.ID())
   713  			srv.log.Debug("Removing p2p peer", "peercount", len(peers), "id", pd.ID(), "duration", d, "req", pd.requested, "err", pd.err)
   714  			srv.dialsched.peerRemoved(pd.rw)
   715  			if pd.Inbound() {
   716  				inboundCount--
   717  				activeInboundPeerGauge.Dec(1)
   718  			} else {
   719  				activeOutboundPeerGauge.Dec(1)
   720  			}
   721  			activePeerGauge.Dec(1)
   722  		}
   723  	}
   724  
   725  	srv.log.Trace("P2P networking is spinning down")
   726  
   727  	// Terminate discovery. If there is a running lookup it will terminate soon.
   728  	if srv.discv4 != nil {
   729  		srv.discv4.Close()
   730  	}
   731  	if srv.discv5 != nil {
   732  		srv.discv5.Close()
   733  	}
   734  	// Disconnect all peers.
   735  	for _, p := range peers {
   736  		p.Disconnect(DiscQuitting)
   737  	}
   738  	// Wait for peers to shut down. Pending connections and tasks are
   739  	// not handled here and will terminate soon-ish because srv.quit
   740  	// is closed.
   741  	for len(peers) > 0 {
   742  		p := <-srv.delpeer
   743  		p.log.Trace("<-delpeer (spindown)")
   744  		delete(peers, p.ID())
   745  	}
   746  }
   747  
   748  func (srv *Server) postHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error {
   749  	switch {
   750  	case !c.is(trustedConn) && len(peers) >= srv.MaxPeers:
   751  		return DiscTooManyPeers
   752  	case !c.is(trustedConn) && c.is(inboundConn) && inboundCount >= srv.MaxInboundConns():
   753  		return DiscTooManyPeers
   754  	case peers[c.node.ID()] != nil:
   755  		return DiscAlreadyConnected
   756  	case c.node.ID() == srv.localnode.ID():
   757  		return DiscSelf
   758  	default:
   759  		return nil
   760  	}
   761  }
   762  
   763  func (srv *Server) addPeerChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error {
   764  	// Drop connections with no matching protocols.
   765  	if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 {
   766  		return DiscUselessPeer
   767  	}
   768  	// Repeat the post-handshake checks because the
   769  	// peer set might have changed since those checks were performed.
   770  	return srv.postHandshakeChecks(peers, inboundCount, c)
   771  }
   772  
   773  // listenLoop runs in its own goroutine and accepts
   774  // inbound connections.
   775  func (srv *Server) listenLoop() {
   776  	srv.log.Debug("TCP listener up", "addr", srv.listener.Addr())
   777  
   778  	// The slots channel limits accepts of new connections.
   779  	tokens := defaultMaxPendingPeers
   780  	if srv.MaxPendingPeers > 0 {
   781  		tokens = srv.MaxPendingPeers
   782  	}
   783  	slots := make(chan struct{}, tokens)
   784  	for i := 0; i < tokens; i++ {
   785  		slots <- struct{}{}
   786  	}
   787  
   788  	// Wait for slots to be returned on exit. This ensures all connection goroutines
   789  	// are down before listenLoop returns.
   790  	defer srv.loopWG.Done()
   791  	defer func() {
   792  		for i := 0; i < cap(slots); i++ {
   793  			<-slots
   794  		}
   795  	}()
   796  
   797  	for {
   798  		// Wait for a free slot before accepting.
   799  		<-slots
   800  
   801  		var (
   802  			fd      net.Conn
   803  			err     error
   804  			lastLog time.Time
   805  		)
   806  		for {
   807  			fd, err = srv.listener.Accept()
   808  			if netutil.IsTemporaryError(err) {
   809  				if time.Since(lastLog) > 1*time.Second {
   810  					srv.log.Debug("Temporary read error", "err", err)
   811  					lastLog = time.Now()
   812  				}
   813  				time.Sleep(time.Millisecond * 200)
   814  				continue
   815  			} else if err != nil {
   816  				srv.log.Debug("Read error", "err", err)
   817  				slots <- struct{}{}
   818  				return
   819  			}
   820  			break
   821  		}
   822  
   823  		remoteIP := netutil.AddrAddr(fd.RemoteAddr())
   824  		if err := srv.checkInboundConn(remoteIP); err != nil {
   825  			srv.log.Debug("Rejected inbound connection", "addr", fd.RemoteAddr(), "err", err)
   826  			fd.Close()
   827  			slots <- struct{}{}
   828  			continue
   829  		}
   830  		if remoteIP.IsValid() {
   831  			fd = newMeteredConn(fd)
   832  			serveMeter.Mark(1)
   833  			srv.log.Trace("Accepted connection", "addr", fd.RemoteAddr())
   834  		}
   835  		go func() {
   836  			srv.SetupConn(fd, inboundConn, nil)
   837  			slots <- struct{}{}
   838  		}()
   839  	}
   840  }
   841  
   842  func (srv *Server) checkInboundConn(remoteIP netip.Addr) error {
   843  	if !remoteIP.IsValid() {
   844  		// This case happens for internal test connections without remote address.
   845  		return nil
   846  	}
   847  	// Reject connections that do not match NetRestrict.
   848  	if srv.NetRestrict != nil && !srv.NetRestrict.ContainsAddr(remoteIP) {
   849  		return errors.New("not in netrestrict list")
   850  	}
   851  	// Reject Internet peers that try too often.
   852  	now := srv.clock.Now()
   853  	srv.inboundHistory.expire(now, nil)
   854  	if !netutil.AddrIsLAN(remoteIP) && srv.inboundHistory.contains(remoteIP.String()) {
   855  		return errors.New("too many attempts")
   856  	}
   857  	srv.inboundHistory.add(remoteIP.String(), now.Add(inboundThrottleTime))
   858  	return nil
   859  }
   860  
   861  // SetupConn runs the handshakes and attempts to add the connection
   862  // as a peer. It returns when the connection has been added as a peer
   863  // or the handshakes have failed.
   864  func (srv *Server) SetupConn(fd net.Conn, flags connFlag, dialDest *enode.Node) error {
   865  	c := &conn{fd: fd, flags: flags, cont: make(chan error)}
   866  	if dialDest == nil {
   867  		c.transport = srv.newTransport(fd, nil)
   868  	} else {
   869  		c.transport = srv.newTransport(fd, dialDest.Pubkey())
   870  	}
   871  
   872  	err := srv.setupConn(c, dialDest)
   873  	if err != nil {
   874  		if !c.is(inboundConn) {
   875  			markDialError(err)
   876  		} else {
   877  			markServeError(err)
   878  		}
   879  		c.close(err)
   880  	}
   881  	return err
   882  }
   883  
   884  func (srv *Server) setupConn(c *conn, dialDest *enode.Node) error {
   885  	// Prevent leftover pending conns from entering the handshake.
   886  	srv.lock.Lock()
   887  	running := srv.running
   888  	srv.lock.Unlock()
   889  	if !running {
   890  		return errServerStopped
   891  	}
   892  
   893  	// If dialing, figure out the remote public key.
   894  	if dialDest != nil {
   895  		dialPubkey := new(ecdsa.PublicKey)
   896  		if err := dialDest.Load((*enode.Secp256k1)(dialPubkey)); err != nil {
   897  			err = fmt.Errorf("%w: dial destination doesn't have a secp256k1 public key", errEncHandshakeError)
   898  			srv.log.Trace("Setting up connection failed", "addr", c.fd.RemoteAddr(), "conn", c.flags, "err", err)
   899  			return err
   900  		}
   901  	}
   902  
   903  	// Run the RLPx handshake.
   904  	remotePubkey, err := c.doEncHandshake(srv.PrivateKey)
   905  	if err != nil {
   906  		srv.log.Trace("Failed RLPx handshake", "addr", c.fd.RemoteAddr(), "conn", c.flags, "err", err)
   907  		return fmt.Errorf("%w: %v", errEncHandshakeError, err)
   908  	}
   909  	if dialDest != nil {
   910  		c.node = dialDest
   911  	} else {
   912  		c.node = nodeFromConn(remotePubkey, c.fd)
   913  	}
   914  	clog := srv.log.New("id", c.node.ID(), "addr", c.fd.RemoteAddr(), "conn", c.flags)
   915  	err = srv.checkpoint(c, srv.checkpointPostHandshake)
   916  	if err != nil {
   917  		clog.Trace("Rejected peer", "err", err)
   918  		return err
   919  	}
   920  
   921  	// Run the capability negotiation handshake.
   922  	phs, err := c.doProtoHandshake(srv.ourHandshake)
   923  	if err != nil {
   924  		clog.Trace("Failed p2p handshake", "err", err)
   925  		return &protoHandshakeError{err: err}
   926  	}
   927  	if id := c.node.ID(); !bytes.Equal(crypto.Keccak256(phs.ID), id[:]) {
   928  		clog.Trace("Wrong devp2p handshake identity", "phsid", hex.EncodeToString(phs.ID))
   929  		return DiscUnexpectedIdentity
   930  	}
   931  	c.caps, c.name = phs.Caps, phs.Name
   932  	err = srv.checkpoint(c, srv.checkpointAddPeer)
   933  	if err != nil {
   934  		clog.Trace("Rejected peer", "err", err)
   935  		return err
   936  	}
   937  
   938  	return nil
   939  }
   940  
   941  func nodeFromConn(pubkey *ecdsa.PublicKey, conn net.Conn) *enode.Node {
   942  	var ip net.IP
   943  	var port int
   944  	if tcp, ok := conn.RemoteAddr().(*net.TCPAddr); ok {
   945  		ip = tcp.IP
   946  		port = tcp.Port
   947  	}
   948  	return enode.NewV4(pubkey, ip, port, port)
   949  }
   950  
   951  // checkpoint sends the conn to run, which performs the
   952  // post-handshake checks for the stage (posthandshake, addpeer).
   953  func (srv *Server) checkpoint(c *conn, stage chan<- *conn) error {
   954  	select {
   955  	case stage <- c:
   956  	case <-srv.quit:
   957  		return errServerStopped
   958  	}
   959  	return <-c.cont
   960  }
   961  
   962  func (srv *Server) launchPeer(c *conn) *Peer {
   963  	p := newPeer(srv.log, c, srv.Protocols)
   964  	if srv.EnableMsgEvents {
   965  		// If message events are enabled, pass the peerFeed
   966  		// to the peer.
   967  		p.events = &srv.peerFeed
   968  	}
   969  	go srv.runPeer(p)
   970  	return p
   971  }
   972  
   973  // runPeer runs in its own goroutine for each peer.
   974  func (srv *Server) runPeer(p *Peer) {
   975  	if srv.newPeerHook != nil {
   976  		srv.newPeerHook(p)
   977  	}
   978  	srv.peerFeed.Send(&PeerEvent{
   979  		Type:          PeerEventTypeAdd,
   980  		Peer:          p.ID(),
   981  		RemoteAddress: p.RemoteAddr().String(),
   982  		LocalAddress:  p.LocalAddr().String(),
   983  	})
   984  
   985  	// Run the per-peer main loop.
   986  	remoteRequested, err := p.run()
   987  
   988  	// Announce disconnect on the main loop to update the peer set.
   989  	// The main loop waits for existing peers to be sent on srv.delpeer
   990  	// before returning, so this send should not select on srv.quit.
   991  	srv.delpeer <- peerDrop{p, err, remoteRequested}
   992  
   993  	// Broadcast peer drop to external subscribers. This needs to be
   994  	// after the send to delpeer so subscribers have a consistent view of
   995  	// the peer set (i.e. Server.Peers() doesn't include the peer when the
   996  	// event is received).
   997  	srv.peerFeed.Send(&PeerEvent{
   998  		Type:          PeerEventTypeDrop,
   999  		Peer:          p.ID(),
  1000  		Error:         err.Error(),
  1001  		RemoteAddress: p.RemoteAddr().String(),
  1002  		LocalAddress:  p.LocalAddr().String(),
  1003  	})
  1004  }
  1005  
  1006  // NodeInfo represents a short summary of the information known about the host.
  1007  type NodeInfo struct {
  1008  	ID    string `json:"id"`    // Unique node identifier (also the encryption key)
  1009  	Name  string `json:"name"`  // Name of the node, including client type, version, OS, custom data
  1010  	Enode string `json:"enode"` // Enode URL for adding this peer from remote peers
  1011  	ENR   string `json:"enr"`   // Ethereum Node Record
  1012  	IP    string `json:"ip"`    // IP address of the node
  1013  	Ports struct {
  1014  		Discovery int `json:"discovery"` // UDP listening port for discovery protocol
  1015  		Listener  int `json:"listener"`  // TCP listening port for RLPx
  1016  	} `json:"ports"`
  1017  	ListenAddr string                 `json:"listenAddr"`
  1018  	Protocols  map[string]interface{} `json:"protocols"`
  1019  }
  1020  
  1021  // NodeInfo gathers and returns a collection of metadata known about the host.
  1022  func (srv *Server) NodeInfo() *NodeInfo {
  1023  	// Gather and assemble the generic node infos
  1024  	node := srv.Self()
  1025  	info := &NodeInfo{
  1026  		Name:       srv.Name,
  1027  		Enode:      node.URLv4(),
  1028  		ID:         node.ID().String(),
  1029  		IP:         node.IPAddr().String(),
  1030  		ListenAddr: srv.ListenAddr,
  1031  		Protocols:  make(map[string]interface{}),
  1032  	}
  1033  	info.Ports.Discovery = node.UDP()
  1034  	info.Ports.Listener = node.TCP()
  1035  	info.ENR = node.String()
  1036  
  1037  	// Gather all the running protocol infos (only once per protocol type)
  1038  	for _, proto := range srv.Protocols {
  1039  		if _, ok := info.Protocols[proto.Name]; !ok {
  1040  			nodeInfo := interface{}("unknown")
  1041  			if query := proto.NodeInfo; query != nil {
  1042  				nodeInfo = proto.NodeInfo()
  1043  			}
  1044  			info.Protocols[proto.Name] = nodeInfo
  1045  		}
  1046  	}
  1047  	return info
  1048  }
  1049  
  1050  // PeersInfo returns an array of metadata objects describing connected peers.
  1051  func (srv *Server) PeersInfo() []*PeerInfo {
  1052  	// Gather all the generic and sub-protocol specific infos
  1053  	infos := make([]*PeerInfo, 0, srv.PeerCount())
  1054  	for _, peer := range srv.Peers() {
  1055  		if peer != nil {
  1056  			infos = append(infos, peer.Info())
  1057  		}
  1058  	}
  1059  	// Sort the result array alphabetically by node identifier
  1060  	slices.SortFunc(infos, func(a, b *PeerInfo) int {
  1061  		return cmp.Compare(a.ID, b.ID)
  1062  	})
  1063  
  1064  	return infos
  1065  }