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  }