code: func (r *BlockRequest) Validate(db ethdb.Database, msg *Msg) error {
  	log.Debug("Validating block body", "hash", r.Hash)
  
  	// Ensure we have a correct message with a single block body
  	if msg.MsgType != MsgBlockBodies {
  		return errInvalidMessageType
  	}
  	bodies := msg.Obj.([]*types.Body)
  	if len(bodies) != 1 {
  		return errInvalidEntryCount
  	}
  	body := bodies[0]
  
  	// Retrieve our stored header and validate block content against it
  	header := rawdb.ReadHeader(db, r.Hash, r.Number)
  	if header == nil {
  		return errHeaderUnavailable
  	}
  	if header.TxHash != types.DeriveSha(types.Transactions(body.Transactions)) {
  		return errTxHashMismatch
  	}
  	if header.UncleHash != types.CalcUncleHash(body.Uncles) {
  		return errUncleHashMismatch
  	}
  	// Validations passed, encode and store RLP
  	data, err := rlp.EncodeToBytes(body)
  	if err != nil {
  		return err
  	}
  	r.Rlp = data
  	return nil
  }
docs: // Valid processes an ODR request reply message from the LES network
  // returns true and stores results in memory if the message was a valid reply
  // to the request (implementation of LesOdrRequest)