From ddab82e52abc479044e792398f4f37f9ff788c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Kapka?= Date: Tue, 11 May 2021 19:11:34 +0200 Subject: [PATCH] Handle undiscovered peers when listing peers (#8882) * Handle undiscovered peers when listing peers * off by 1 fix --- beacon-chain/rpc/nodev1/node.go | 17 +++++--- beacon-chain/rpc/nodev1/node_test.go | 61 +++++++++++++++------------- 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/beacon-chain/rpc/nodev1/node.go b/beacon-chain/rpc/nodev1/node.go index 3e8f4ffbd7..b2e266b938 100644 --- a/beacon-chain/rpc/nodev1/node.go +++ b/beacon-chain/rpc/nodev1/node.go @@ -300,9 +300,12 @@ func peerInfo(peerStatus *peers.Status, id peer.ID) (*ethpb.Peer, error) { if err != nil { return nil, errors.Wrap(err, "could not obtain ENR") } - serializedEnr, err := p2p.SerializeENR(enr) - if err != nil { - return nil, errors.Wrap(err, "could not serialize ENR") + var serializedEnr string + if enr != nil { + serializedEnr, err = p2p.SerializeENR(enr) + if err != nil { + return nil, errors.Wrap(err, "could not serialize ENR") + } } address, err := peerStatus.Address(id) if err != nil { @@ -318,11 +321,15 @@ func peerInfo(peerStatus *peers.Status, id peer.ID) (*ethpb.Peer, error) { } p := ethpb.Peer{ PeerId: id.Pretty(), - Enr: "enr:" + serializedEnr, - Address: address.String(), State: ethpb.ConnectionState(connectionState), Direction: ethpb.PeerDirection(direction), } + if address != nil { + p.Address = address.String() + } + if serializedEnr != "" { + p.Enr = "enr:" + serializedEnr + } return &p, nil } diff --git a/beacon-chain/rpc/nodev1/node_test.go b/beacon-chain/rpc/nodev1/node_test.go index fc92433d5c..3f2653bab1 100644 --- a/beacon-chain/rpc/nodev1/node_test.go +++ b/beacon-chain/rpc/nodev1/node_test.go @@ -212,41 +212,46 @@ func TestGetPeer(t *testing.T) { } func TestListPeers(t *testing.T) { - ids := libp2ptest.GeneratePeerIDs(8) + ids := libp2ptest.GeneratePeerIDs(9) peerFetcher := &mockp2p.MockPeersProvider{} peerFetcher.ClearPeers() peerStatus := peerFetcher.Peers() for i, id := range ids { - enrRecord := &enr.Record{} - err := enrRecord.SetSig(dummyIdentity{1}, []byte{42}) - require.NoError(t, err) - enrRecord.Set(enr.IPv4{127, 0, 0, byte(i)}) - err = enrRecord.SetSig(dummyIdentity{}, []byte{}) - require.NoError(t, err) - var p2pAddr = "/ip4/127.0.0." + strconv.Itoa(i) + "/udp/30303/p2p/QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N" - p2pMultiAddr, err := ma.NewMultiaddr(p2pAddr) - require.NoError(t, err) - - var direction network.Direction - if i%2 == 0 { - direction = network.DirInbound + // Make last peer undiscovered + if i == len(ids)-1 { + peerStatus.Add(nil, id, nil, network.DirUnknown) } else { - direction = network.DirOutbound - } - peerStatus.Add(enrRecord, id, p2pMultiAddr, direction) + enrRecord := &enr.Record{} + err := enrRecord.SetSig(dummyIdentity{1}, []byte{42}) + require.NoError(t, err) + enrRecord.Set(enr.IPv4{127, 0, 0, byte(i)}) + err = enrRecord.SetSig(dummyIdentity{}, []byte{}) + require.NoError(t, err) + var p2pAddr = "/ip4/127.0.0." + strconv.Itoa(i) + "/udp/30303/p2p/QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N" + p2pMultiAddr, err := ma.NewMultiaddr(p2pAddr) + require.NoError(t, err) - switch i { - case 0, 1: - peerStatus.SetConnectionState(id, peers.PeerConnecting) - case 2, 3: - peerStatus.SetConnectionState(id, peers.PeerConnected) - case 4, 5: - peerStatus.SetConnectionState(id, peers.PeerDisconnecting) - case 6, 7: - peerStatus.SetConnectionState(id, peers.PeerDisconnected) - default: - t.Fatalf("Failed to set connection state for peer") + var direction network.Direction + if i%2 == 0 { + direction = network.DirInbound + } else { + direction = network.DirOutbound + } + peerStatus.Add(enrRecord, id, p2pMultiAddr, direction) + + switch i { + case 0, 1: + peerStatus.SetConnectionState(id, peers.PeerConnecting) + case 2, 3: + peerStatus.SetConnectionState(id, peers.PeerConnected) + case 4, 5: + peerStatus.SetConnectionState(id, peers.PeerDisconnecting) + case 6, 7: + peerStatus.SetConnectionState(id, peers.PeerDisconnected) + default: + t.Fatalf("Failed to set connection state for peer") + } } }