server_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  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. package p2p
  17. import (
  18. "crypto/ecdsa"
  19. "errors"
  20. "io"
  21. "math/rand"
  22. "net"
  23. "reflect"
  24. "testing"
  25. "time"
  26. "github.com/ethereum/go-ethereum/crypto"
  27. "github.com/ethereum/go-ethereum/internal/testlog"
  28. "github.com/ethereum/go-ethereum/log"
  29. "github.com/ethereum/go-ethereum/p2p/enode"
  30. "github.com/ethereum/go-ethereum/p2p/enr"
  31. "golang.org/x/crypto/sha3"
  32. )
  33. type testTransport struct {
  34. rpub *ecdsa.PublicKey
  35. *rlpx
  36. closeErr error
  37. }
  38. func newTestTransport(rpub *ecdsa.PublicKey, fd net.Conn) transport {
  39. wrapped := newRLPX(fd).(*rlpx)
  40. wrapped.rw = newRLPXFrameRW(fd, secrets{
  41. MAC: zero16,
  42. AES: zero16,
  43. IngressMAC: sha3.NewLegacyKeccak256(),
  44. EgressMAC: sha3.NewLegacyKeccak256(),
  45. })
  46. return &testTransport{rpub: rpub, rlpx: wrapped}
  47. }
  48. func (c *testTransport) doEncHandshake(prv *ecdsa.PrivateKey, dialDest *ecdsa.PublicKey) (*ecdsa.PublicKey, error) {
  49. return c.rpub, nil
  50. }
  51. func (c *testTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) {
  52. pubkey := crypto.FromECDSAPub(c.rpub)[1:]
  53. return &protoHandshake{ID: pubkey, Name: "test"}, nil
  54. }
  55. func (c *testTransport) close(err error) {
  56. c.rlpx.fd.Close()
  57. c.closeErr = err
  58. }
  59. func startTestServer(t *testing.T, remoteKey *ecdsa.PublicKey, pf func(*Peer)) *Server {
  60. config := Config{
  61. Name: "test",
  62. MaxPeers: 10,
  63. ListenAddr: "127.0.0.1:0",
  64. NoDiscovery: true,
  65. PrivateKey: newkey(),
  66. Logger: testlog.Logger(t, log.LvlTrace),
  67. }
  68. server := &Server{
  69. Config: config,
  70. newPeerHook: pf,
  71. newTransport: func(fd net.Conn) transport { return newTestTransport(remoteKey, fd) },
  72. }
  73. if err := server.Start(); err != nil {
  74. t.Fatalf("Could not start server: %v", err)
  75. }
  76. return server
  77. }
  78. func TestServerListen(t *testing.T) {
  79. // start the test server
  80. connected := make(chan *Peer)
  81. remid := &newkey().PublicKey
  82. srv := startTestServer(t, remid, func(p *Peer) {
  83. if p.ID() != enode.PubkeyToIDV4(remid) {
  84. t.Error("peer func called with wrong node id")
  85. }
  86. connected <- p
  87. })
  88. defer close(connected)
  89. defer srv.Stop()
  90. // dial the test server
  91. conn, err := net.DialTimeout("tcp", srv.ListenAddr, 5*time.Second)
  92. if err != nil {
  93. t.Fatalf("could not dial: %v", err)
  94. }
  95. defer conn.Close()
  96. select {
  97. case peer := <-connected:
  98. if peer.LocalAddr().String() != conn.RemoteAddr().String() {
  99. t.Errorf("peer started with wrong conn: got %v, want %v",
  100. peer.LocalAddr(), conn.RemoteAddr())
  101. }
  102. peers := srv.Peers()
  103. if !reflect.DeepEqual(peers, []*Peer{peer}) {
  104. t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer})
  105. }
  106. case <-time.After(1 * time.Second):
  107. t.Error("server did not accept within one second")
  108. }
  109. }
  110. func TestServerDial(t *testing.T) {
  111. // run a one-shot TCP server to handle the connection.
  112. listener, err := net.Listen("tcp", "127.0.0.1:0")
  113. if err != nil {
  114. t.Fatalf("could not setup listener: %v", err)
  115. }
  116. defer listener.Close()
  117. accepted := make(chan net.Conn, 1)
  118. go func() {
  119. conn, err := listener.Accept()
  120. if err != nil {
  121. return
  122. }
  123. accepted <- conn
  124. }()
  125. // start the server
  126. connected := make(chan *Peer)
  127. remid := &newkey().PublicKey
  128. srv := startTestServer(t, remid, func(p *Peer) { connected <- p })
  129. defer close(connected)
  130. defer srv.Stop()
  131. // tell the server to connect
  132. tcpAddr := listener.Addr().(*net.TCPAddr)
  133. node := enode.NewV4(remid, tcpAddr.IP, tcpAddr.Port, 0)
  134. srv.AddPeer(node)
  135. select {
  136. case conn := <-accepted:
  137. defer conn.Close()
  138. select {
  139. case peer := <-connected:
  140. if peer.ID() != enode.PubkeyToIDV4(remid) {
  141. t.Errorf("peer has wrong id")
  142. }
  143. if peer.Name() != "test" {
  144. t.Errorf("peer has wrong name")
  145. }
  146. if peer.RemoteAddr().String() != conn.LocalAddr().String() {
  147. t.Errorf("peer started with wrong conn: got %v, want %v",
  148. peer.RemoteAddr(), conn.LocalAddr())
  149. }
  150. peers := srv.Peers()
  151. if !reflect.DeepEqual(peers, []*Peer{peer}) {
  152. t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer})
  153. }
  154. // Test AddTrustedPeer/RemoveTrustedPeer and changing Trusted flags
  155. // Particularly for race conditions on changing the flag state.
  156. if peer := srv.Peers()[0]; peer.Info().Network.Trusted {
  157. t.Errorf("peer is trusted prematurely: %v", peer)
  158. }
  159. done := make(chan bool)
  160. go func() {
  161. srv.AddTrustedPeer(node)
  162. if peer := srv.Peers()[0]; !peer.Info().Network.Trusted {
  163. t.Errorf("peer is not trusted after AddTrustedPeer: %v", peer)
  164. }
  165. srv.RemoveTrustedPeer(node)
  166. if peer := srv.Peers()[0]; peer.Info().Network.Trusted {
  167. t.Errorf("peer is trusted after RemoveTrustedPeer: %v", peer)
  168. }
  169. done <- true
  170. }()
  171. // Trigger potential race conditions
  172. peer = srv.Peers()[0]
  173. _ = peer.Inbound()
  174. _ = peer.Info()
  175. <-done
  176. case <-time.After(1 * time.Second):
  177. t.Error("server did not launch peer within one second")
  178. }
  179. case <-time.After(1 * time.Second):
  180. t.Error("server did not connect within one second")
  181. }
  182. }
  183. // This test checks that RemovePeer disconnects the peer if it is connected.
  184. func TestServerRemovePeerDisconnect(t *testing.T) {
  185. srv1 := &Server{Config: Config{
  186. PrivateKey: newkey(),
  187. MaxPeers: 1,
  188. NoDiscovery: true,
  189. Logger: testlog.Logger(t, log.LvlTrace).New("server", "1"),
  190. }}
  191. srv2 := &Server{Config: Config{
  192. PrivateKey: newkey(),
  193. MaxPeers: 1,
  194. NoDiscovery: true,
  195. NoDial: true,
  196. ListenAddr: "127.0.0.1:0",
  197. Logger: testlog.Logger(t, log.LvlTrace).New("server", "2"),
  198. }}
  199. srv1.Start()
  200. defer srv1.Stop()
  201. srv2.Start()
  202. defer srv2.Stop()
  203. if !syncAddPeer(srv1, srv2.Self()) {
  204. t.Fatal("peer not connected")
  205. }
  206. srv1.RemovePeer(srv2.Self())
  207. if srv1.PeerCount() > 0 {
  208. t.Fatal("removed peer still connected")
  209. }
  210. }
  211. // This test checks that connections are disconnected just after the encryption handshake
  212. // when the server is at capacity. Trusted connections should still be accepted.
  213. func TestServerAtCap(t *testing.T) {
  214. trustedNode := newkey()
  215. trustedID := enode.PubkeyToIDV4(&trustedNode.PublicKey)
  216. srv := &Server{
  217. Config: Config{
  218. PrivateKey: newkey(),
  219. MaxPeers: 10,
  220. NoDial: true,
  221. NoDiscovery: true,
  222. TrustedNodes: []*enode.Node{newNode(trustedID, "")},
  223. Logger: testlog.Logger(t, log.LvlTrace),
  224. },
  225. }
  226. if err := srv.Start(); err != nil {
  227. t.Fatalf("could not start: %v", err)
  228. }
  229. defer srv.Stop()
  230. newconn := func(id enode.ID) *conn {
  231. fd, _ := net.Pipe()
  232. tx := newTestTransport(&trustedNode.PublicKey, fd)
  233. node := enode.SignNull(new(enr.Record), id)
  234. return &conn{fd: fd, transport: tx, flags: inboundConn, node: node, cont: make(chan error)}
  235. }
  236. // Inject a few connections to fill up the peer set.
  237. for i := 0; i < 10; i++ {
  238. c := newconn(randomID())
  239. if err := srv.checkpoint(c, srv.checkpointAddPeer); err != nil {
  240. t.Fatalf("could not add conn %d: %v", i, err)
  241. }
  242. }
  243. // Try inserting a non-trusted connection.
  244. anotherID := randomID()
  245. c := newconn(anotherID)
  246. if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers {
  247. t.Error("wrong error for insert:", err)
  248. }
  249. // Try inserting a trusted connection.
  250. c = newconn(trustedID)
  251. if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil {
  252. t.Error("unexpected error for trusted conn @posthandshake:", err)
  253. }
  254. if !c.is(trustedConn) {
  255. t.Error("Server did not set trusted flag")
  256. }
  257. // Remove from trusted set and try again
  258. srv.RemoveTrustedPeer(newNode(trustedID, ""))
  259. c = newconn(trustedID)
  260. if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers {
  261. t.Error("wrong error for insert:", err)
  262. }
  263. // Add anotherID to trusted set and try again
  264. srv.AddTrustedPeer(newNode(anotherID, ""))
  265. c = newconn(anotherID)
  266. if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil {
  267. t.Error("unexpected error for trusted conn @posthandshake:", err)
  268. }
  269. if !c.is(trustedConn) {
  270. t.Error("Server did not set trusted flag")
  271. }
  272. }
  273. func TestServerPeerLimits(t *testing.T) {
  274. srvkey := newkey()
  275. clientkey := newkey()
  276. clientnode := enode.NewV4(&clientkey.PublicKey, nil, 0, 0)
  277. var tp = &setupTransport{
  278. pubkey: &clientkey.PublicKey,
  279. phs: protoHandshake{
  280. ID: crypto.FromECDSAPub(&clientkey.PublicKey)[1:],
  281. // Force "DiscUselessPeer" due to unmatching caps
  282. // Caps: []Cap{discard.cap()},
  283. },
  284. }
  285. srv := &Server{
  286. Config: Config{
  287. PrivateKey: srvkey,
  288. MaxPeers: 0,
  289. NoDial: true,
  290. NoDiscovery: true,
  291. Protocols: []Protocol{discard},
  292. Logger: testlog.Logger(t, log.LvlTrace),
  293. },
  294. newTransport: func(fd net.Conn) transport { return tp },
  295. }
  296. if err := srv.Start(); err != nil {
  297. t.Fatalf("couldn't start server: %v", err)
  298. }
  299. defer srv.Stop()
  300. // Check that server is full (MaxPeers=0)
  301. flags := dynDialedConn
  302. dialDest := clientnode
  303. conn, _ := net.Pipe()
  304. srv.SetupConn(conn, flags, dialDest)
  305. if tp.closeErr != DiscTooManyPeers {
  306. t.Errorf("unexpected close error: %q", tp.closeErr)
  307. }
  308. conn.Close()
  309. srv.AddTrustedPeer(clientnode)
  310. // Check that server allows a trusted peer despite being full.
  311. conn, _ = net.Pipe()
  312. srv.SetupConn(conn, flags, dialDest)
  313. if tp.closeErr == DiscTooManyPeers {
  314. t.Errorf("failed to bypass MaxPeers with trusted node: %q", tp.closeErr)
  315. }
  316. if tp.closeErr != DiscUselessPeer {
  317. t.Errorf("unexpected close error: %q", tp.closeErr)
  318. }
  319. conn.Close()
  320. srv.RemoveTrustedPeer(clientnode)
  321. // Check that server is full again.
  322. conn, _ = net.Pipe()
  323. srv.SetupConn(conn, flags, dialDest)
  324. if tp.closeErr != DiscTooManyPeers {
  325. t.Errorf("unexpected close error: %q", tp.closeErr)
  326. }
  327. conn.Close()
  328. }
  329. func TestServerSetupConn(t *testing.T) {
  330. var (
  331. clientkey, srvkey = newkey(), newkey()
  332. clientpub = &clientkey.PublicKey
  333. srvpub = &srvkey.PublicKey
  334. )
  335. tests := []struct {
  336. dontstart bool
  337. tt *setupTransport
  338. flags connFlag
  339. dialDest *enode.Node
  340. wantCloseErr error
  341. wantCalls string
  342. }{
  343. {
  344. dontstart: true,
  345. tt: &setupTransport{pubkey: clientpub},
  346. wantCalls: "close,",
  347. wantCloseErr: errServerStopped,
  348. },
  349. {
  350. tt: &setupTransport{pubkey: clientpub, encHandshakeErr: errors.New("read error")},
  351. flags: inboundConn,
  352. wantCalls: "doEncHandshake,close,",
  353. wantCloseErr: errors.New("read error"),
  354. },
  355. {
  356. tt: &setupTransport{pubkey: clientpub},
  357. dialDest: enode.NewV4(&newkey().PublicKey, nil, 0, 0),
  358. flags: dynDialedConn,
  359. wantCalls: "doEncHandshake,close,",
  360. wantCloseErr: DiscUnexpectedIdentity,
  361. },
  362. {
  363. tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: randomID().Bytes()}},
  364. dialDest: enode.NewV4(clientpub, nil, 0, 0),
  365. flags: dynDialedConn,
  366. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  367. wantCloseErr: DiscUnexpectedIdentity,
  368. },
  369. {
  370. tt: &setupTransport{pubkey: clientpub, protoHandshakeErr: errors.New("foo")},
  371. dialDest: enode.NewV4(clientpub, nil, 0, 0),
  372. flags: dynDialedConn,
  373. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  374. wantCloseErr: errors.New("foo"),
  375. },
  376. {
  377. tt: &setupTransport{pubkey: srvpub, phs: protoHandshake{ID: crypto.FromECDSAPub(srvpub)[1:]}},
  378. flags: inboundConn,
  379. wantCalls: "doEncHandshake,close,",
  380. wantCloseErr: DiscSelf,
  381. },
  382. {
  383. tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: crypto.FromECDSAPub(clientpub)[1:]}},
  384. flags: inboundConn,
  385. wantCalls: "doEncHandshake,doProtoHandshake,close,",
  386. wantCloseErr: DiscUselessPeer,
  387. },
  388. }
  389. for i, test := range tests {
  390. t.Run(test.wantCalls, func(t *testing.T) {
  391. cfg := Config{
  392. PrivateKey: srvkey,
  393. MaxPeers: 10,
  394. NoDial: true,
  395. NoDiscovery: true,
  396. Protocols: []Protocol{discard},
  397. Logger: testlog.Logger(t, log.LvlTrace),
  398. }
  399. srv := &Server{
  400. Config: cfg,
  401. newTransport: func(fd net.Conn) transport { return test.tt },
  402. log: cfg.Logger,
  403. }
  404. if !test.dontstart {
  405. if err := srv.Start(); err != nil {
  406. t.Fatalf("couldn't start server: %v", err)
  407. }
  408. defer srv.Stop()
  409. }
  410. p1, _ := net.Pipe()
  411. srv.SetupConn(p1, test.flags, test.dialDest)
  412. if !reflect.DeepEqual(test.tt.closeErr, test.wantCloseErr) {
  413. t.Errorf("test %d: close error mismatch: got %q, want %q", i, test.tt.closeErr, test.wantCloseErr)
  414. }
  415. if test.tt.calls != test.wantCalls {
  416. t.Errorf("test %d: calls mismatch: got %q, want %q", i, test.tt.calls, test.wantCalls)
  417. }
  418. })
  419. }
  420. }
  421. type setupTransport struct {
  422. pubkey *ecdsa.PublicKey
  423. encHandshakeErr error
  424. phs protoHandshake
  425. protoHandshakeErr error
  426. calls string
  427. closeErr error
  428. }
  429. func (c *setupTransport) doEncHandshake(prv *ecdsa.PrivateKey, dialDest *ecdsa.PublicKey) (*ecdsa.PublicKey, error) {
  430. c.calls += "doEncHandshake,"
  431. return c.pubkey, c.encHandshakeErr
  432. }
  433. func (c *setupTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) {
  434. c.calls += "doProtoHandshake,"
  435. if c.protoHandshakeErr != nil {
  436. return nil, c.protoHandshakeErr
  437. }
  438. return &c.phs, nil
  439. }
  440. func (c *setupTransport) close(err error) {
  441. c.calls += "close,"
  442. c.closeErr = err
  443. }
  444. // setupConn shouldn't write to/read from the connection.
  445. func (c *setupTransport) WriteMsg(Msg) error {
  446. panic("WriteMsg called on setupTransport")
  447. }
  448. func (c *setupTransport) ReadMsg() (Msg, error) {
  449. panic("ReadMsg called on setupTransport")
  450. }
  451. func newkey() *ecdsa.PrivateKey {
  452. key, err := crypto.GenerateKey()
  453. if err != nil {
  454. panic("couldn't generate key: " + err.Error())
  455. }
  456. return key
  457. }
  458. func randomID() (id enode.ID) {
  459. for i := range id {
  460. id[i] = byte(rand.Intn(255))
  461. }
  462. return id
  463. }
  464. // This test checks that inbound connections are throttled by IP.
  465. func TestServerInboundThrottle(t *testing.T) {
  466. const timeout = 5 * time.Second
  467. newTransportCalled := make(chan struct{})
  468. srv := &Server{
  469. Config: Config{
  470. PrivateKey: newkey(),
  471. ListenAddr: "127.0.0.1:0",
  472. MaxPeers: 10,
  473. NoDial: true,
  474. NoDiscovery: true,
  475. Protocols: []Protocol{discard},
  476. Logger: testlog.Logger(t, log.LvlTrace),
  477. },
  478. newTransport: func(fd net.Conn) transport {
  479. newTransportCalled <- struct{}{}
  480. return newRLPX(fd)
  481. },
  482. listenFunc: func(network, laddr string) (net.Listener, error) {
  483. fakeAddr := &net.TCPAddr{IP: net.IP{95, 33, 21, 2}, Port: 4444}
  484. return listenFakeAddr(network, laddr, fakeAddr)
  485. },
  486. }
  487. if err := srv.Start(); err != nil {
  488. t.Fatal("can't start: ", err)
  489. }
  490. defer srv.Stop()
  491. // Dial the test server.
  492. conn, err := net.DialTimeout("tcp", srv.ListenAddr, timeout)
  493. if err != nil {
  494. t.Fatalf("could not dial: %v", err)
  495. }
  496. select {
  497. case <-newTransportCalled:
  498. // OK
  499. case <-time.After(timeout):
  500. t.Error("newTransport not called")
  501. }
  502. conn.Close()
  503. // Dial again. This time the server should close the connection immediately.
  504. connClosed := make(chan struct{})
  505. conn, err = net.DialTimeout("tcp", srv.ListenAddr, timeout)
  506. if err != nil {
  507. t.Fatalf("could not dial: %v", err)
  508. }
  509. defer conn.Close()
  510. go func() {
  511. conn.SetDeadline(time.Now().Add(timeout))
  512. buf := make([]byte, 10)
  513. if n, err := conn.Read(buf); err != io.EOF || n != 0 {
  514. t.Errorf("expected io.EOF and n == 0, got error %q and n == %d", err, n)
  515. }
  516. connClosed <- struct{}{}
  517. }()
  518. select {
  519. case <-connClosed:
  520. // OK
  521. case <-newTransportCalled:
  522. t.Error("newTransport called for second attempt")
  523. case <-time.After(timeout):
  524. t.Error("connection not closed within timeout")
  525. }
  526. }
  527. func listenFakeAddr(network, laddr string, remoteAddr net.Addr) (net.Listener, error) {
  528. l, err := net.Listen(network, laddr)
  529. if err == nil {
  530. l = &fakeAddrListener{l, remoteAddr}
  531. }
  532. return l, err
  533. }
  534. // fakeAddrListener is a listener that creates connections with a mocked remote address.
  535. type fakeAddrListener struct {
  536. net.Listener
  537. remoteAddr net.Addr
  538. }
  539. type fakeAddrConn struct {
  540. net.Conn
  541. remoteAddr net.Addr
  542. }
  543. func (l *fakeAddrListener) Accept() (net.Conn, error) {
  544. c, err := l.Listener.Accept()
  545. if err != nil {
  546. return nil, err
  547. }
  548. return &fakeAddrConn{c, l.remoteAddr}, nil
  549. }
  550. func (c *fakeAddrConn) RemoteAddr() net.Addr {
  551. return c.remoteAddr
  552. }
  553. func syncAddPeer(srv *Server, node *enode.Node) bool {
  554. var (
  555. ch = make(chan *PeerEvent)
  556. sub = srv.SubscribeEvents(ch)
  557. timeout = time.After(2 * time.Second)
  558. )
  559. defer sub.Unsubscribe()
  560. srv.AddPeer(node)
  561. for {
  562. select {
  563. case ev := <-ch:
  564. if ev.Type == PeerEventTypeAdd && ev.Peer == node.ID() {
  565. return true
  566. }
  567. case <-timeout:
  568. return false
  569. }
  570. }
  571. }