code: func (tx *transaction) FetchBlockHeaders(hashes []chainhash.Hash) ([][]byte, error) {
  	regions := make([]database.BlockRegion, len(hashes))
  	for i := range hashes {
  		regions[i].Hash = &hashes[i]
  		regions[i].Offset = 0
  		regions[i].Len = blockHdrSize
  	}
  	return tx.FetchBlockRegions(regions)
  }
docs: // FetchBlockHeaders returns the raw serialized bytes for the block headers
  // identified by the given hashes.  The raw bytes are in the format returned by
  // Serialize on a wire.BlockHeader.
  //
  // Returns the following errors as required by the interface contract:
  //   - ErrBlockNotFound if the any of the requested block hashes do not exist
  //   - ErrTxClosed if the transaction has already been closed
  //   - ErrCorruption if the database has somehow become corrupted
  //
  // NOTE: The data returned by this function is only valid during a database
  // transaction.  Attempting to access it after a transaction has ended results
  // in undefined behavior.  This constraint prevents additional data copies and
  // allows support for memory-mapped database implementations.
  //
  // This function is part of the database.Tx interface implementation.