code: func (s *blockStore) readBlockRegion(loc blockLocation, offset, numBytes uint32) ([]byte, error) {
  	// Get the referenced block file handle opening the file as needed.  The
  	// function also handles closing files as needed to avoid going over the
  	// max allowed open files.
  	blockFile, err := s.blockFile(loc.blockFileNum)
  	if err != nil {
  		return nil, err
  	}
  
  	// Regions are offsets into the actual block, however the serialized
  	// data for a block includes an initial 4 bytes for network + 4 bytes
  	// for block length.  Thus, add 8 bytes to adjust.
  	readOffset := loc.fileOffset + 8 + offset
  	serializedData := make([]byte, numBytes)
  	_, err = blockFile.file.ReadAt(serializedData, int64(readOffset))
  	blockFile.RUnlock()
  	if err != nil {
  		str := fmt.Sprintf("failed to read region from block file %d, "+
  			"offset %d, len %d: %v", loc.blockFileNum, readOffset,
  			numBytes, err)
  		return nil, makeDbErr(database.ErrDriverSpecific, str, err)
  	}
  
  	return serializedData, nil
  }
docs: // readBlockRegion reads the specified amount of data at the provided offset for
  // a given block location.  The offset is relative to the start of the
  // serialized block (as opposed to the beginning of the block record).  This
  // function automatically handles all file management such as opening and
  // closing files as necessary to stay within the maximum allowed open files
  // limit.
  //
  // Returns ErrDriverSpecific if the data fails to read for any reason.