code: func (h *blockHeaderStore) readHeaderRange(startHeight uint32,
  	endHeight uint32) ([]wire.BlockHeader, error) {
  
  	// Based on the defined header type, we'll determine the number of
  	// bytes that we need to read from the file.
  	headerReader, err := readHeadersFromFile(
  		h.file, BlockHeaderSize, startHeight, endHeight,
  	)
  	if err != nil {
  		return nil, err
  	}
  
  	// We'll now incrementally parse out the set of individual headers from
  	// our set of serialized contiguous raw headers.
  	numHeaders := endHeight - startHeight + 1
  	headers := make([]wire.BlockHeader, 0, numHeaders)
  	for headerReader.Len() != 0 {
  		var nextHeader wire.BlockHeader
  		if err := nextHeader.Deserialize(headerReader); err != nil {
  			return nil, err
  		}
  
  		headers = append(headers, nextHeader)
  	}
  
  	return headers, nil
  }
docs: // readHeaderRange will attempt to fetch a series of block headers within the
  // target height range. This method batches a set of reads into a single system
  // call thereby increasing performance when reading a set of contiguous
  // headers.
  //
  // NOTE: The end height is _inclusive_ so we'll fetch all headers from the
  // startHeight up to the end height, including the final header.