code: func precacheTransaction(config *params.ChainConfig, bc ChainContext, author *common.Address, gaspool *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, cfg vm.Config) error {
  	// Convert the transaction into an executable message and pre-cache its sender
  	msg, err := tx.AsMessage(types.MakeSigner(config, header.Number))
  	if err != nil {
  		return err
  	}
  	// Create the EVM and execute the transaction
  	context := NewEVMContext(msg, header, bc, author)
  	vm := vm.NewEVM(context, statedb, config, cfg)
  
  	_, _, _, err = ApplyMessage(vm, msg, gaspool)
  	return err
  }
docs: // precacheTransaction attempts to apply a transaction to the given state database
  // and uses the input parameters for its environment. The goal is not to execute
  // the transaction successfully, rather to warm up touched data slots.