github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/sync/rpc_metadata.go (about) 1 package sync 2 3 import ( 4 "context" 5 6 libp2pcore "github.com/libp2p/go-libp2p-core" 7 "github.com/libp2p/go-libp2p-core/peer" 8 "github.com/pkg/errors" 9 "github.com/prysmaticlabs/prysm/beacon-chain/p2p" 10 pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" 11 "github.com/prysmaticlabs/prysm/shared/interfaces" 12 ) 13 14 // metaDataHandler reads the incoming metadata rpc request from the peer. 15 func (s *Service) metaDataHandler(_ context.Context, _ interface{}, stream libp2pcore.Stream) error { 16 SetRPCStreamDeadlines(stream) 17 18 if err := s.rateLimiter.validateRequest(stream, 1); err != nil { 19 return err 20 } 21 s.rateLimiter.add(stream, 1) 22 23 if _, err := stream.Write([]byte{responseCodeSuccess}); err != nil { 24 return err 25 } 26 if s.cfg.P2P.Metadata() == nil || s.cfg.P2P.Metadata().IsNil() { 27 return errors.New("nil metadata stored for host") 28 } 29 _, err := s.cfg.P2P.Encoding().EncodeWithMaxLength(stream, s.cfg.P2P.Metadata().InnerObject()) 30 if err != nil { 31 return err 32 } 33 closeStream(stream, log) 34 return nil 35 } 36 37 func (s *Service) sendMetaDataRequest(ctx context.Context, id peer.ID) (interfaces.Metadata, error) { 38 ctx, cancel := context.WithTimeout(ctx, respTimeout) 39 defer cancel() 40 41 stream, err := s.cfg.P2P.Send(ctx, new(interface{}), p2p.RPCMetaDataTopicV1, id) 42 if err != nil { 43 return nil, err 44 } 45 defer closeStream(stream, log) 46 code, errMsg, err := ReadStatusCode(stream, s.cfg.P2P.Encoding()) 47 if err != nil { 48 return nil, err 49 } 50 if code != 0 { 51 s.cfg.P2P.Peers().Scorers().BadResponsesScorer().Increment(stream.Conn().RemotePeer()) 52 return nil, errors.New(errMsg) 53 } 54 // No-op for now with the rpc context. 55 _, err = readContextFromStream(stream, s.cfg.Chain) 56 if err != nil { 57 return nil, err 58 } 59 msg := new(pb.MetaDataV0) 60 if err := s.cfg.P2P.Encoding().DecodeWithMaxLength(stream, msg); err != nil { 61 return nil, err 62 } 63 return interfaces.WrappedMetadataV0(msg), nil 64 }