github.com/ebakus/go-ebakus@v1.0.5-0.20200520105415-dbccef9ec421/p2p/server.go (about) 1 // Copyright 2019 The ebakus/go-ebakus Authors 2 // This file is part of the ebakus/go-ebakus library. 3 // 4 // The ebakus/go-ebakus 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 ebakus/go-ebakus 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 ebakus/go-ebakus library. If not, see <http://www.gnu.org/licenses/>. 16 17 // Package p2p implements the Ebakus p2p network protocols. 18 package p2p 19 20 import ( 21 "bytes" 22 "crypto/ecdsa" 23 "encoding/hex" 24 "errors" 25 "fmt" 26 "net" 27 "sort" 28 "sync" 29 "sync/atomic" 30 "time" 31 32 "github.com/ebakus/go-ebakus/common" 33 "github.com/ebakus/go-ebakus/common/mclock" 34 "github.com/ebakus/go-ebakus/crypto" 35 "github.com/ebakus/go-ebakus/event" 36 "github.com/ebakus/go-ebakus/log" 37 "github.com/ebakus/go-ebakus/p2p/discover" 38 "github.com/ebakus/go-ebakus/p2p/discv5" 39 "github.com/ebakus/go-ebakus/p2p/enode" 40 "github.com/ebakus/go-ebakus/p2p/enr" 41 "github.com/ebakus/go-ebakus/p2p/nat" 42 "github.com/ebakus/go-ebakus/p2p/netutil" 43 ) 44 45 const ( 46 defaultDialTimeout = 15 * time.Second 47 48 // This is the fairness knob for the discovery mixer. When looking for peers, we'll 49 // wait this long for a single source of candidates before moving on and trying other 50 // sources. 51 discmixTimeout = 5 * time.Second 52 53 // Connectivity defaults. 54 maxActiveDialTasks = 16 55 defaultMaxPendingPeers = 50 56 defaultDialRatio = 3 57 58 // This time limits inbound connection attempts per source IP. 59 inboundThrottleTime = 30 * time.Second 60 61 // Maximum time allowed for reading a complete message. 62 // This is effectively the amount of time a connection can be idle. 63 frameReadTimeout = 30 * time.Second 64 65 // Maximum amount of time allowed for writing a complete message. 66 frameWriteTimeout = 20 * time.Second 67 ) 68 69 var errServerStopped = errors.New("server stopped") 70 71 // Config holds Server options. 72 type Config struct { 73 // This field must be set to a valid secp256k1 private key. 74 PrivateKey *ecdsa.PrivateKey `toml:"-"` 75 76 // MaxPeers is the maximum number of peers that can be 77 // connected. It must be greater than zero. 78 MaxPeers int 79 80 // MaxPendingPeers is the maximum number of peers that can be pending in the 81 // handshake phase, counted separately for inbound and outbound connections. 82 // Zero defaults to preset values. 83 MaxPendingPeers int `toml:",omitempty"` 84 85 // DialRatio controls the ratio of inbound to dialed connections. 86 // Example: a DialRatio of 2 allows 1/2 of connections to be dialed. 87 // Setting DialRatio to zero defaults it to 3. 88 DialRatio int `toml:",omitempty"` 89 90 // NoDiscovery can be used to disable the peer discovery mechanism. 91 // Disabling is useful for protocol debugging (manual topology). 92 NoDiscovery bool 93 94 // DiscoveryV5 specifies whether the new topic-discovery based V5 discovery 95 // protocol should be started or not. 96 DiscoveryV5 bool `toml:",omitempty"` 97 98 // Name sets the node name of this server. 99 // Use common.MakeName to create a name that follows existing conventions. 100 Name string `toml:"-"` 101 102 // BootstrapNodes are used to establish connectivity 103 // with the rest of the network. 104 BootstrapNodes []*enode.Node 105 106 // BootstrapNodesV5 are used to establish connectivity 107 // with the rest of the network using the V5 discovery 108 // protocol. 109 BootstrapNodesV5 []*discv5.Node `toml:",omitempty"` 110 111 // Static nodes are used as pre-configured connections which are always 112 // maintained and re-connected on disconnects. 113 StaticNodes []*enode.Node 114 115 // Trusted nodes are used as pre-configured connections which are always 116 // allowed to connect, even above the peer limit. 117 TrustedNodes []*enode.Node 118 119 // Connectivity can be restricted to certain IP networks. 120 // If this option is set to a non-nil value, only hosts which match one of the 121 // IP networks contained in the list are considered. 122 NetRestrict *netutil.Netlist `toml:",omitempty"` 123 124 // NodeDatabase is the path to the database containing the previously seen 125 // live nodes in the network. 126 NodeDatabase string `toml:",omitempty"` 127 128 // Protocols should contain the protocols supported 129 // by the server. Matching protocols are launched for 130 // each peer. 131 Protocols []Protocol `toml:"-"` 132 133 // If ListenAddr is set to a non-nil address, the server 134 // will listen for incoming connections. 135 // 136 // If the port is zero, the operating system will pick a port. The 137 // ListenAddr field will be updated with the actual address when 138 // the server is started. 139 ListenAddr string 140 141 // If set to a non-nil value, the given NAT port mapper 142 // is used to make the listening port available to the 143 // Internet. 144 NAT nat.Interface `toml:",omitempty"` 145 146 // If Dialer is set to a non-nil value, the given Dialer 147 // is used to dial outbound peer connections. 148 Dialer NodeDialer `toml:"-"` 149 150 // If NoDial is true, the server will not dial any peers. 151 NoDial bool `toml:",omitempty"` 152 153 // If EnableMsgEvents is set then the server will emit PeerEvents 154 // whenever a message is sent to or received from a peer 155 EnableMsgEvents bool 156 157 // Logger is a custom logger to use with the p2p.Server. 158 Logger log.Logger `toml:",omitempty"` 159 } 160 161 // Server manages all peer connections. 162 type Server struct { 163 // Config fields may not be modified while the server is running. 164 Config 165 166 // Hooks for testing. These are useful because we can inhibit 167 // the whole protocol stack. 168 newTransport func(net.Conn) transport 169 newPeerHook func(*Peer) 170 listenFunc func(network, addr string) (net.Listener, error) 171 172 lock sync.Mutex // protects running 173 running bool 174 175 listener net.Listener 176 ourHandshake *protoHandshake 177 loopWG sync.WaitGroup // loop, listenLoop 178 peerFeed event.Feed 179 log log.Logger 180 181 nodedb *enode.DB 182 localnode *enode.LocalNode 183 ntab *discover.UDPv4 184 DiscV5 *discv5.Network 185 discmix *enode.FairMix 186 187 staticNodeResolver nodeResolver 188 189 // Channels into the run loop. 190 quit chan struct{} 191 addstatic chan *enode.Node 192 removestatic chan *enode.Node 193 addtrusted chan *enode.Node 194 removetrusted chan *enode.Node 195 peerOp chan peerOpFunc 196 peerOpDone chan struct{} 197 delpeer chan peerDrop 198 checkpointPostHandshake chan *conn 199 checkpointAddPeer chan *conn 200 201 // State of run loop and listenLoop. 202 inboundHistory expHeap 203 } 204 205 type peerOpFunc func(map[enode.ID]*Peer) 206 207 type peerDrop struct { 208 *Peer 209 err error 210 requested bool // true if signaled by the peer 211 } 212 213 type connFlag int32 214 215 const ( 216 dynDialedConn connFlag = 1 << iota 217 staticDialedConn 218 inboundConn 219 trustedConn 220 ) 221 222 // conn wraps a network connection with information gathered 223 // during the two handshakes. 224 type conn struct { 225 fd net.Conn 226 transport 227 node *enode.Node 228 flags connFlag 229 cont chan error // The run loop uses cont to signal errors to SetupConn. 230 caps []Cap // valid after the protocol handshake 231 name string // valid after the protocol handshake 232 } 233 234 type transport interface { 235 // The two handshakes. 236 doEncHandshake(prv *ecdsa.PrivateKey, dialDest *ecdsa.PublicKey) (*ecdsa.PublicKey, error) 237 doProtoHandshake(our *protoHandshake) (*protoHandshake, error) 238 // The MsgReadWriter can only be used after the encryption 239 // handshake has completed. The code uses conn.id to track this 240 // by setting it to a non-nil value after the encryption handshake. 241 MsgReadWriter 242 // transports must provide Close because we use MsgPipe in some of 243 // the tests. Closing the actual network connection doesn't do 244 // anything in those tests because MsgPipe doesn't use it. 245 close(err error) 246 } 247 248 func (c *conn) String() string { 249 s := c.flags.String() 250 if (c.node.ID() != enode.ID{}) { 251 s += " " + c.node.ID().String() 252 } 253 s += " " + c.fd.RemoteAddr().String() 254 return s 255 } 256 257 func (f connFlag) String() string { 258 s := "" 259 if f&trustedConn != 0 { 260 s += "-trusted" 261 } 262 if f&dynDialedConn != 0 { 263 s += "-dyndial" 264 } 265 if f&staticDialedConn != 0 { 266 s += "-staticdial" 267 } 268 if f&inboundConn != 0 { 269 s += "-inbound" 270 } 271 if s != "" { 272 s = s[1:] 273 } 274 return s 275 } 276 277 func (c *conn) is(f connFlag) bool { 278 flags := connFlag(atomic.LoadInt32((*int32)(&c.flags))) 279 return flags&f != 0 280 } 281 282 func (c *conn) set(f connFlag, val bool) { 283 for { 284 oldFlags := connFlag(atomic.LoadInt32((*int32)(&c.flags))) 285 flags := oldFlags 286 if val { 287 flags |= f 288 } else { 289 flags &= ^f 290 } 291 if atomic.CompareAndSwapInt32((*int32)(&c.flags), int32(oldFlags), int32(flags)) { 292 return 293 } 294 } 295 } 296 297 // LocalNode returns the local node record. 298 func (srv *Server) LocalNode() *enode.LocalNode { 299 return srv.localnode 300 } 301 302 // Peers returns all connected peers. 303 func (srv *Server) Peers() []*Peer { 304 var ps []*Peer 305 select { 306 // Note: We'd love to put this function into a variable but 307 // that seems to cause a weird compiler error in some 308 // environments. 309 case srv.peerOp <- func(peers map[enode.ID]*Peer) { 310 for _, p := range peers { 311 ps = append(ps, p) 312 } 313 }: 314 <-srv.peerOpDone 315 case <-srv.quit: 316 } 317 return ps 318 } 319 320 // PeerCount returns the number of connected peers. 321 func (srv *Server) PeerCount() int { 322 var count int 323 select { 324 case srv.peerOp <- func(ps map[enode.ID]*Peer) { count = len(ps) }: 325 <-srv.peerOpDone 326 case <-srv.quit: 327 } 328 return count 329 } 330 331 // AddPeer connects to the given node and maintains the connection until the 332 // server is shut down. If the connection fails for any reason, the server will 333 // attempt to reconnect the peer. 334 func (srv *Server) AddPeer(node *enode.Node) { 335 select { 336 case srv.addstatic <- node: 337 case <-srv.quit: 338 } 339 } 340 341 // RemovePeer disconnects from the given node 342 func (srv *Server) RemovePeer(node *enode.Node) { 343 select { 344 case srv.removestatic <- node: 345 case <-srv.quit: 346 } 347 } 348 349 // AddTrustedPeer adds the given node to a reserved whitelist which allows the 350 // node to always connect, even if the slot are full. 351 func (srv *Server) AddTrustedPeer(node *enode.Node) { 352 select { 353 case srv.addtrusted <- node: 354 case <-srv.quit: 355 } 356 } 357 358 // RemoveTrustedPeer removes the given node from the trusted peer set. 359 func (srv *Server) RemoveTrustedPeer(node *enode.Node) { 360 select { 361 case srv.removetrusted <- node: 362 case <-srv.quit: 363 } 364 } 365 366 // SubscribePeers subscribes the given channel to peer events 367 func (srv *Server) SubscribeEvents(ch chan *PeerEvent) event.Subscription { 368 return srv.peerFeed.Subscribe(ch) 369 } 370 371 // Self returns the local node's endpoint information. 372 func (srv *Server) Self() *enode.Node { 373 srv.lock.Lock() 374 ln := srv.localnode 375 srv.lock.Unlock() 376 377 if ln == nil { 378 return enode.NewV4(&srv.PrivateKey.PublicKey, net.ParseIP("0.0.0.0"), 0, 0) 379 } 380 return ln.Node() 381 } 382 383 // Stop terminates the server and all active peer connections. 384 // It blocks until all active connections have been closed. 385 func (srv *Server) Stop() { 386 srv.lock.Lock() 387 if !srv.running { 388 srv.lock.Unlock() 389 return 390 } 391 srv.running = false 392 if srv.listener != nil { 393 // this unblocks listener Accept 394 srv.listener.Close() 395 } 396 close(srv.quit) 397 srv.lock.Unlock() 398 srv.loopWG.Wait() 399 } 400 401 // sharedUDPConn implements a shared connection. Write sends messages to the underlying connection while read returns 402 // messages that were found unprocessable and sent to the unhandled channel by the primary listener. 403 type sharedUDPConn struct { 404 *net.UDPConn 405 unhandled chan discover.ReadPacket 406 } 407 408 // ReadFromUDP implements discv5.conn 409 func (s *sharedUDPConn) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { 410 packet, ok := <-s.unhandled 411 if !ok { 412 return 0, nil, errors.New("Connection was closed") 413 } 414 l := len(packet.Data) 415 if l > len(b) { 416 l = len(b) 417 } 418 copy(b[:l], packet.Data[:l]) 419 return l, packet.Addr, nil 420 } 421 422 // Close implements discv5.conn 423 func (s *sharedUDPConn) Close() error { 424 return nil 425 } 426 427 // Start starts running the server. 428 // Servers can not be re-used after stopping. 429 func (srv *Server) Start() (err error) { 430 srv.lock.Lock() 431 defer srv.lock.Unlock() 432 if srv.running { 433 return errors.New("server already running") 434 } 435 srv.running = true 436 srv.log = srv.Config.Logger 437 if srv.log == nil { 438 srv.log = log.Root() 439 } 440 if srv.NoDial && srv.ListenAddr == "" { 441 srv.log.Warn("P2P server will be useless, neither dialing nor listening") 442 } 443 444 // static fields 445 if srv.PrivateKey == nil { 446 return errors.New("Server.PrivateKey must be set to a non-nil key") 447 } 448 if srv.newTransport == nil { 449 srv.newTransport = newRLPX 450 } 451 if srv.listenFunc == nil { 452 srv.listenFunc = net.Listen 453 } 454 if srv.Dialer == nil { 455 srv.Dialer = TCPDialer{&net.Dialer{Timeout: defaultDialTimeout}} 456 } 457 srv.quit = make(chan struct{}) 458 srv.delpeer = make(chan peerDrop) 459 srv.checkpointPostHandshake = make(chan *conn) 460 srv.checkpointAddPeer = make(chan *conn) 461 srv.addstatic = make(chan *enode.Node) 462 srv.removestatic = make(chan *enode.Node) 463 srv.addtrusted = make(chan *enode.Node) 464 srv.removetrusted = make(chan *enode.Node) 465 srv.peerOp = make(chan peerOpFunc) 466 srv.peerOpDone = make(chan struct{}) 467 468 if err := srv.setupLocalNode(); err != nil { 469 return err 470 } 471 if srv.ListenAddr != "" { 472 if err := srv.setupListening(); err != nil { 473 return err 474 } 475 } 476 if err := srv.setupDiscovery(); err != nil { 477 return err 478 } 479 480 dynPeers := srv.maxDialedConns() 481 dialer := newDialState(srv.localnode.ID(), dynPeers, &srv.Config) 482 srv.loopWG.Add(1) 483 go srv.run(dialer) 484 return nil 485 } 486 487 func (srv *Server) setupLocalNode() error { 488 // Create the devp2p handshake. 489 pubkey := crypto.FromECDSAPub(&srv.PrivateKey.PublicKey) 490 srv.ourHandshake = &protoHandshake{Version: baseProtocolVersion, Name: srv.Name, ID: pubkey[1:]} 491 for _, p := range srv.Protocols { 492 srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap()) 493 } 494 sort.Sort(capsByNameAndVersion(srv.ourHandshake.Caps)) 495 496 // Create the local node. 497 db, err := enode.OpenDB(srv.Config.NodeDatabase) 498 if err != nil { 499 return err 500 } 501 srv.nodedb = db 502 srv.localnode = enode.NewLocalNode(db, srv.PrivateKey) 503 srv.localnode.SetFallbackIP(net.IP{127, 0, 0, 1}) 504 // TODO: check conflicts 505 for _, p := range srv.Protocols { 506 for _, e := range p.Attributes { 507 srv.localnode.Set(e) 508 } 509 } 510 switch srv.NAT.(type) { 511 case nil: 512 // No NAT interface, do nothing. 513 case nat.ExtIP: 514 // ExtIP doesn't block, set the IP right away. 515 ip, _ := srv.NAT.ExternalIP() 516 srv.localnode.SetStaticIP(ip) 517 default: 518 // Ask the router about the IP. This takes a while and blocks startup, 519 // do it in the background. 520 srv.loopWG.Add(1) 521 go func() { 522 defer srv.loopWG.Done() 523 if ip, err := srv.NAT.ExternalIP(); err == nil { 524 srv.localnode.SetStaticIP(ip) 525 } 526 }() 527 } 528 return nil 529 } 530 531 func (srv *Server) setupDiscovery() error { 532 srv.discmix = enode.NewFairMix(discmixTimeout) 533 534 // Add protocol-specific discovery sources. 535 added := make(map[string]bool) 536 for _, proto := range srv.Protocols { 537 if proto.DialCandidates != nil && !added[proto.Name] { 538 srv.discmix.AddSource(proto.DialCandidates) 539 added[proto.Name] = true 540 } 541 } 542 543 // Don't listen on UDP endpoint if DHT is disabled. 544 if srv.NoDiscovery && !srv.DiscoveryV5 { 545 return nil 546 } 547 548 addr, err := net.ResolveUDPAddr("udp", srv.ListenAddr) 549 if err != nil { 550 return err 551 } 552 conn, err := net.ListenUDP("udp", addr) 553 if err != nil { 554 return err 555 } 556 realaddr := conn.LocalAddr().(*net.UDPAddr) 557 srv.log.Debug("UDP listener up", "addr", realaddr) 558 if srv.NAT != nil { 559 if !realaddr.IP.IsLoopback() { 560 go nat.Map(srv.NAT, srv.quit, "udp", realaddr.Port, realaddr.Port, "ebakus discovery") 561 } 562 } 563 srv.localnode.SetFallbackUDP(realaddr.Port) 564 565 // Discovery V4 566 var unhandled chan discover.ReadPacket 567 var sconn *sharedUDPConn 568 if !srv.NoDiscovery { 569 if srv.DiscoveryV5 { 570 unhandled = make(chan discover.ReadPacket, 100) 571 sconn = &sharedUDPConn{conn, unhandled} 572 } 573 cfg := discover.Config{ 574 PrivateKey: srv.PrivateKey, 575 NetRestrict: srv.NetRestrict, 576 Bootnodes: srv.BootstrapNodes, 577 Unhandled: unhandled, 578 Log: srv.log, 579 } 580 ntab, err := discover.ListenUDP(conn, srv.localnode, cfg) 581 if err != nil { 582 return err 583 } 584 srv.ntab = ntab 585 srv.discmix.AddSource(ntab.RandomNodes()) 586 srv.staticNodeResolver = ntab 587 } 588 589 // Discovery V5 590 if srv.DiscoveryV5 { 591 var ntab *discv5.Network 592 var err error 593 if sconn != nil { 594 ntab, err = discv5.ListenUDP(srv.PrivateKey, sconn, "", srv.NetRestrict) 595 } else { 596 ntab, err = discv5.ListenUDP(srv.PrivateKey, conn, "", srv.NetRestrict) 597 } 598 if err != nil { 599 return err 600 } 601 if err := ntab.SetFallbackNodes(srv.BootstrapNodesV5); err != nil { 602 return err 603 } 604 srv.DiscV5 = ntab 605 } 606 return nil 607 } 608 609 func (srv *Server) setupListening() error { 610 // Launch the listener. 611 listener, err := srv.listenFunc("tcp", srv.ListenAddr) 612 if err != nil { 613 return err 614 } 615 srv.listener = listener 616 srv.ListenAddr = listener.Addr().String() 617 618 // Update the local node record and map the TCP listening port if NAT is configured. 619 if tcp, ok := listener.Addr().(*net.TCPAddr); ok { 620 srv.localnode.Set(enr.TCP(tcp.Port)) 621 if !tcp.IP.IsLoopback() && srv.NAT != nil { 622 srv.loopWG.Add(1) 623 go func() { 624 nat.Map(srv.NAT, srv.quit, "tcp", tcp.Port, tcp.Port, "ebakus p2p") 625 srv.loopWG.Done() 626 }() 627 } 628 } 629 630 srv.loopWG.Add(1) 631 go srv.listenLoop() 632 return nil 633 } 634 635 type dialer interface { 636 newTasks(running int, peers map[enode.ID]*Peer, now time.Time) []task 637 taskDone(task, time.Time) 638 addStatic(*enode.Node) 639 removeStatic(*enode.Node) 640 } 641 642 func (srv *Server) run(dialstate dialer) { 643 srv.log.Info("Started P2P networking", "self", srv.localnode.Node().URLv4()) 644 defer srv.loopWG.Done() 645 defer srv.nodedb.Close() 646 defer srv.discmix.Close() 647 648 var ( 649 peers = make(map[enode.ID]*Peer) 650 inboundCount = 0 651 trusted = make(map[enode.ID]bool, len(srv.TrustedNodes)) 652 taskdone = make(chan task, maxActiveDialTasks) 653 tick = time.NewTicker(30 * time.Second) 654 runningTasks []task 655 queuedTasks []task // tasks that can't run yet 656 ) 657 defer tick.Stop() 658 659 // Put trusted nodes into a map to speed up checks. 660 // Trusted peers are loaded on startup or added via AddTrustedPeer RPC. 661 for _, n := range srv.TrustedNodes { 662 trusted[n.ID()] = true 663 } 664 665 // removes t from runningTasks 666 delTask := func(t task) { 667 for i := range runningTasks { 668 if runningTasks[i] == t { 669 runningTasks = append(runningTasks[:i], runningTasks[i+1:]...) 670 break 671 } 672 } 673 } 674 // starts until max number of active tasks is satisfied 675 startTasks := func(ts []task) (rest []task) { 676 i := 0 677 for ; len(runningTasks) < maxActiveDialTasks && i < len(ts); i++ { 678 t := ts[i] 679 srv.log.Trace("New dial task", "task", t) 680 go func() { t.Do(srv); taskdone <- t }() 681 runningTasks = append(runningTasks, t) 682 } 683 return ts[i:] 684 } 685 scheduleTasks := func() { 686 // Start from queue first. 687 queuedTasks = append(queuedTasks[:0], startTasks(queuedTasks)...) 688 // Query dialer for new tasks and start as many as possible now. 689 if len(runningTasks) < maxActiveDialTasks { 690 nt := dialstate.newTasks(len(runningTasks)+len(queuedTasks), peers, time.Now()) 691 queuedTasks = append(queuedTasks, startTasks(nt)...) 692 } 693 } 694 695 running: 696 for { 697 scheduleTasks() 698 699 select { 700 case <-tick.C: 701 // This is just here to ensure the dial scheduler runs occasionally. 702 703 case <-srv.quit: 704 // The server was stopped. Run the cleanup logic. 705 break running 706 707 case n := <-srv.addstatic: 708 // This channel is used by AddPeer to add to the 709 // ephemeral static peer list. Add it to the dialer, 710 // it will keep the node connected. 711 srv.log.Trace("Adding static node", "node", n) 712 dialstate.addStatic(n) 713 714 case n := <-srv.removestatic: 715 // This channel is used by RemovePeer to send a 716 // disconnect request to a peer and begin the 717 // stop keeping the node connected. 718 srv.log.Trace("Removing static node", "node", n) 719 dialstate.removeStatic(n) 720 if p, ok := peers[n.ID()]; ok { 721 p.Disconnect(DiscRequested) 722 } 723 724 case n := <-srv.addtrusted: 725 // This channel is used by AddTrustedPeer to add an enode 726 // to the trusted node set. 727 srv.log.Trace("Adding trusted node", "node", n) 728 trusted[n.ID()] = true 729 // Mark any already-connected peer as trusted 730 if p, ok := peers[n.ID()]; ok { 731 p.rw.set(trustedConn, true) 732 } 733 734 case n := <-srv.removetrusted: 735 // This channel is used by RemoveTrustedPeer to remove an enode 736 // from the trusted node set. 737 srv.log.Trace("Removing trusted node", "node", n) 738 delete(trusted, n.ID()) 739 740 // Unmark any already-connected peer as trusted 741 if p, ok := peers[n.ID()]; ok { 742 p.rw.set(trustedConn, false) 743 } 744 745 case op := <-srv.peerOp: 746 // This channel is used by Peers and PeerCount. 747 op(peers) 748 srv.peerOpDone <- struct{}{} 749 750 case t := <-taskdone: 751 // A task got done. Tell dialstate about it so it 752 // can update its state and remove it from the active 753 // tasks list. 754 srv.log.Trace("Dial task done", "task", t) 755 dialstate.taskDone(t, time.Now()) 756 delTask(t) 757 758 case c := <-srv.checkpointPostHandshake: 759 // A connection has passed the encryption handshake so 760 // the remote identity is known (but hasn't been verified yet). 761 if trusted[c.node.ID()] { 762 // Ensure that the trusted flag is set before checking against MaxPeers. 763 c.flags |= trustedConn 764 } 765 // TODO: track in-progress inbound node IDs (pre-Peer) to avoid dialing them. 766 c.cont <- srv.postHandshakeChecks(peers, inboundCount, c) 767 768 case c := <-srv.checkpointAddPeer: 769 // At this point the connection is past the protocol handshake. 770 // Its capabilities are known and the remote identity is verified. 771 err := srv.addPeerChecks(peers, inboundCount, c) 772 if err == nil { 773 // The handshakes are done and it passed all checks. 774 p := newPeer(srv.log, c, srv.Protocols) 775 // If message events are enabled, pass the peerFeed 776 // to the peer 777 if srv.EnableMsgEvents { 778 p.events = &srv.peerFeed 779 } 780 name := truncateName(c.name) 781 p.log.Debug("Adding p2p peer", "addr", p.RemoteAddr(), "peers", len(peers)+1, "name", name) 782 go srv.runPeer(p) 783 peers[c.node.ID()] = p 784 if p.Inbound() { 785 inboundCount++ 786 } 787 if conn, ok := c.fd.(*meteredConn); ok { 788 conn.handshakeDone(p) 789 } 790 } 791 // The dialer logic relies on the assumption that 792 // dial tasks complete after the peer has been added or 793 // discarded. Unblock the task last. 794 c.cont <- err 795 796 case pd := <-srv.delpeer: 797 // A peer disconnected. 798 d := common.PrettyDuration(mclock.Now() - pd.created) 799 pd.log.Debug("Removing p2p peer", "addr", pd.RemoteAddr(), "peers", len(peers)-1, "duration", d, "req", pd.requested, "err", pd.err) 800 delete(peers, pd.ID()) 801 if pd.Inbound() { 802 inboundCount-- 803 } 804 } 805 } 806 807 srv.log.Trace("P2P networking is spinning down") 808 809 // Terminate discovery. If there is a running lookup it will terminate soon. 810 if srv.ntab != nil { 811 srv.ntab.Close() 812 } 813 if srv.DiscV5 != nil { 814 srv.DiscV5.Close() 815 } 816 // Disconnect all peers. 817 for _, p := range peers { 818 p.Disconnect(DiscQuitting) 819 } 820 // Wait for peers to shut down. Pending connections and tasks are 821 // not handled here and will terminate soon-ish because srv.quit 822 // is closed. 823 for len(peers) > 0 { 824 p := <-srv.delpeer 825 p.log.Trace("<-delpeer (spindown)", "remainingTasks", len(runningTasks)) 826 delete(peers, p.ID()) 827 } 828 } 829 830 func (srv *Server) postHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { 831 switch { 832 case !c.is(trustedConn|staticDialedConn) && len(peers) >= srv.MaxPeers: 833 return DiscTooManyPeers 834 case !c.is(trustedConn) && c.is(inboundConn) && inboundCount >= srv.maxInboundConns(): 835 return DiscTooManyPeers 836 case peers[c.node.ID()] != nil: 837 return DiscAlreadyConnected 838 case c.node.ID() == srv.localnode.ID(): 839 return DiscSelf 840 default: 841 return nil 842 } 843 } 844 845 func (srv *Server) addPeerChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { 846 // Drop connections with no matching protocols. 847 if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 { 848 return DiscUselessPeer 849 } 850 // Repeat the post-handshake checks because the 851 // peer set might have changed since those checks were performed. 852 return srv.postHandshakeChecks(peers, inboundCount, c) 853 } 854 855 func (srv *Server) maxInboundConns() int { 856 return srv.MaxPeers - srv.maxDialedConns() 857 } 858 859 func (srv *Server) maxDialedConns() int { 860 if srv.NoDiscovery || srv.NoDial { 861 return 0 862 } 863 r := srv.DialRatio 864 if r == 0 { 865 r = defaultDialRatio 866 } 867 return srv.MaxPeers / r 868 } 869 870 // listenLoop runs in its own goroutine and accepts 871 // inbound connections. 872 func (srv *Server) listenLoop() { 873 srv.log.Debug("TCP listener up", "addr", srv.listener.Addr()) 874 875 // The slots channel limits accepts of new connections. 876 tokens := defaultMaxPendingPeers 877 if srv.MaxPendingPeers > 0 { 878 tokens = srv.MaxPendingPeers 879 } 880 slots := make(chan struct{}, tokens) 881 for i := 0; i < tokens; i++ { 882 slots <- struct{}{} 883 } 884 885 // Wait for slots to be returned on exit. This ensures all connection goroutines 886 // are down before listenLoop returns. 887 defer srv.loopWG.Done() 888 defer func() { 889 for i := 0; i < cap(slots); i++ { 890 <-slots 891 } 892 }() 893 894 for { 895 // Wait for a free slot before accepting. 896 <-slots 897 898 var ( 899 fd net.Conn 900 err error 901 ) 902 for { 903 fd, err = srv.listener.Accept() 904 if netutil.IsTemporaryError(err) { 905 srv.log.Debug("Temporary read error", "err", err) 906 continue 907 } else if err != nil { 908 srv.log.Debug("Read error", "err", err) 909 slots <- struct{}{} 910 return 911 } 912 break 913 } 914 915 remoteIP := netutil.AddrIP(fd.RemoteAddr()) 916 if err := srv.checkInboundConn(fd, remoteIP); err != nil { 917 srv.log.Debug("Rejected inbound connnection", "addr", fd.RemoteAddr(), "err", err) 918 fd.Close() 919 slots <- struct{}{} 920 continue 921 } 922 if remoteIP != nil { 923 var addr *net.TCPAddr 924 if tcp, ok := fd.RemoteAddr().(*net.TCPAddr); ok { 925 addr = tcp 926 } 927 fd = newMeteredConn(fd, true, addr) 928 srv.log.Trace("Accepted connection", "addr", fd.RemoteAddr()) 929 } 930 go func() { 931 srv.SetupConn(fd, inboundConn, nil) 932 slots <- struct{}{} 933 }() 934 } 935 } 936 937 func (srv *Server) checkInboundConn(fd net.Conn, remoteIP net.IP) error { 938 if remoteIP != nil { 939 // Reject connections that do not match NetRestrict. 940 if srv.NetRestrict != nil && !srv.NetRestrict.Contains(remoteIP) { 941 return fmt.Errorf("not whitelisted in NetRestrict") 942 } 943 // Reject Internet peers that try too often. 944 srv.inboundHistory.expire(time.Now()) 945 if !netutil.IsLAN(remoteIP) && srv.inboundHistory.contains(remoteIP.String()) { 946 return fmt.Errorf("too many attempts") 947 } 948 srv.inboundHistory.add(remoteIP.String(), time.Now().Add(inboundThrottleTime)) 949 } 950 return nil 951 } 952 953 // SetupConn runs the handshakes and attempts to add the connection 954 // as a peer. It returns when the connection has been added as a peer 955 // or the handshakes have failed. 956 func (srv *Server) SetupConn(fd net.Conn, flags connFlag, dialDest *enode.Node) error { 957 c := &conn{fd: fd, transport: srv.newTransport(fd), flags: flags, cont: make(chan error)} 958 err := srv.setupConn(c, flags, dialDest) 959 if err != nil { 960 c.close(err) 961 srv.log.Trace("Setting up connection failed", "addr", fd.RemoteAddr(), "err", err) 962 } 963 return err 964 } 965 966 func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) error { 967 // Prevent leftover pending conns from entering the handshake. 968 srv.lock.Lock() 969 running := srv.running 970 srv.lock.Unlock() 971 if !running { 972 return errServerStopped 973 } 974 975 // If dialing, figure out the remote public key. 976 var dialPubkey *ecdsa.PublicKey 977 if dialDest != nil { 978 dialPubkey = new(ecdsa.PublicKey) 979 if err := dialDest.Load((*enode.Secp256k1)(dialPubkey)); err != nil { 980 return errors.New("dial destination doesn't have a secp256k1 public key") 981 } 982 } 983 984 // Run the RLPx handshake. 985 remotePubkey, err := c.doEncHandshake(srv.PrivateKey, dialPubkey) 986 if err != nil { 987 srv.log.Trace("Failed RLPx handshake", "addr", c.fd.RemoteAddr(), "conn", c.flags, "err", err) 988 return err 989 } 990 if dialDest != nil { 991 // For dialed connections, check that the remote public key matches. 992 if dialPubkey.X.Cmp(remotePubkey.X) != 0 || dialPubkey.Y.Cmp(remotePubkey.Y) != 0 { 993 return DiscUnexpectedIdentity 994 } 995 c.node = dialDest 996 } else { 997 c.node = nodeFromConn(remotePubkey, c.fd) 998 } 999 clog := srv.log.New("id", c.node.ID(), "addr", c.fd.RemoteAddr(), "conn", c.flags) 1000 err = srv.checkpoint(c, srv.checkpointPostHandshake) 1001 if err != nil { 1002 clog.Trace("Rejected peer", "err", err) 1003 return err 1004 } 1005 1006 // Run the capability negotiation handshake. 1007 phs, err := c.doProtoHandshake(srv.ourHandshake) 1008 if err != nil { 1009 clog.Trace("Failed proto handshake", "err", err) 1010 return err 1011 } 1012 if id := c.node.ID(); !bytes.Equal(crypto.Keccak256(phs.ID), id[:]) { 1013 clog.Trace("Wrong devp2p handshake identity", "phsid", hex.EncodeToString(phs.ID)) 1014 return DiscUnexpectedIdentity 1015 } 1016 c.caps, c.name = phs.Caps, phs.Name 1017 err = srv.checkpoint(c, srv.checkpointAddPeer) 1018 if err != nil { 1019 clog.Trace("Rejected peer", "err", err) 1020 return err 1021 } 1022 1023 // If the checks completed successfully, the connection has been added as a peer and 1024 // runPeer has been launched. 1025 clog.Trace("Connection set up", "inbound", dialDest == nil) 1026 return nil 1027 } 1028 1029 func nodeFromConn(pubkey *ecdsa.PublicKey, conn net.Conn) *enode.Node { 1030 var ip net.IP 1031 var port int 1032 if tcp, ok := conn.RemoteAddr().(*net.TCPAddr); ok { 1033 ip = tcp.IP 1034 port = tcp.Port 1035 } 1036 return enode.NewV4(pubkey, ip, port, port) 1037 } 1038 1039 func truncateName(s string) string { 1040 if len(s) > 20 { 1041 return s[:20] + "..." 1042 } 1043 return s 1044 } 1045 1046 // checkpoint sends the conn to run, which performs the 1047 // post-handshake checks for the stage (posthandshake, addpeer). 1048 func (srv *Server) checkpoint(c *conn, stage chan<- *conn) error { 1049 select { 1050 case stage <- c: 1051 case <-srv.quit: 1052 return errServerStopped 1053 } 1054 return <-c.cont 1055 } 1056 1057 // runPeer runs in its own goroutine for each peer. 1058 // it waits until the Peer logic returns and removes 1059 // the peer. 1060 func (srv *Server) runPeer(p *Peer) { 1061 if srv.newPeerHook != nil { 1062 srv.newPeerHook(p) 1063 } 1064 1065 // broadcast peer add 1066 srv.peerFeed.Send(&PeerEvent{ 1067 Type: PeerEventTypeAdd, 1068 Peer: p.ID(), 1069 RemoteAddress: p.RemoteAddr().String(), 1070 LocalAddress: p.LocalAddr().String(), 1071 }) 1072 1073 // run the protocol 1074 remoteRequested, err := p.run() 1075 1076 // broadcast peer drop 1077 srv.peerFeed.Send(&PeerEvent{ 1078 Type: PeerEventTypeDrop, 1079 Peer: p.ID(), 1080 Error: err.Error(), 1081 RemoteAddress: p.RemoteAddr().String(), 1082 LocalAddress: p.LocalAddr().String(), 1083 }) 1084 1085 // Note: run waits for existing peers to be sent on srv.delpeer 1086 // before returning, so this send should not select on srv.quit. 1087 srv.delpeer <- peerDrop{p, err, remoteRequested} 1088 } 1089 1090 // NodeInfo represents a short summary of the information known about the host. 1091 type NodeInfo struct { 1092 ID string `json:"id"` // Unique node identifier (also the encryption key) 1093 Name string `json:"name"` // Name of the node, including client type, version, OS, custom data 1094 Enode string `json:"enode"` // Enode URL for adding this peer from remote peers 1095 ENR string `json:"enr"` // Ebakus Node Record 1096 IP string `json:"ip"` // IP address of the node 1097 Ports struct { 1098 Discovery int `json:"discovery"` // UDP listening port for discovery protocol 1099 Listener int `json:"listener"` // TCP listening port for RLPx 1100 } `json:"ports"` 1101 ListenAddr string `json:"listenAddr"` 1102 Protocols map[string]interface{} `json:"protocols"` 1103 } 1104 1105 // NodeInfo gathers and returns a collection of metadata known about the host. 1106 func (srv *Server) NodeInfo() *NodeInfo { 1107 // Gather and assemble the generic node infos 1108 node := srv.Self() 1109 info := &NodeInfo{ 1110 Name: srv.Name, 1111 Enode: node.URLv4(), 1112 ID: node.ID().String(), 1113 IP: node.IP().String(), 1114 ListenAddr: srv.ListenAddr, 1115 Protocols: make(map[string]interface{}), 1116 } 1117 info.Ports.Discovery = node.UDP() 1118 info.Ports.Listener = node.TCP() 1119 info.ENR = node.String() 1120 1121 // Gather all the running protocol infos (only once per protocol type) 1122 for _, proto := range srv.Protocols { 1123 if _, ok := info.Protocols[proto.Name]; !ok { 1124 nodeInfo := interface{}("unknown") 1125 if query := proto.NodeInfo; query != nil { 1126 nodeInfo = proto.NodeInfo() 1127 } 1128 info.Protocols[proto.Name] = nodeInfo 1129 } 1130 } 1131 return info 1132 } 1133 1134 // PeersInfo returns an array of metadata objects describing connected peers. 1135 func (srv *Server) PeersInfo() []*PeerInfo { 1136 // Gather all the generic and sub-protocol specific infos 1137 infos := make([]*PeerInfo, 0, srv.PeerCount()) 1138 for _, peer := range srv.Peers() { 1139 if peer != nil { 1140 infos = append(infos, peer.Info()) 1141 } 1142 } 1143 // Sort the result array alphabetically by node identifier 1144 for i := 0; i < len(infos); i++ { 1145 for j := i + 1; j < len(infos); j++ { 1146 if infos[i].ID > infos[j].ID { 1147 infos[i], infos[j] = infos[j], infos[i] 1148 } 1149 } 1150 } 1151 return infos 1152 }