code: func (p *statePrefetcher) Prefetch(block *types.Block, statedb *state.StateDB, cfg vm.Config, interrupt *uint32) {
  	var (
  		header  = block.Header()
  		gaspool = new(GasPool).AddGas(block.GasLimit())
  	)
  	// Iterate over and process the individual transactions
  	for i, tx := range block.Transactions() {
  		// If block precaching was interrupted, abort
  		if interrupt != nil && atomic.LoadUint32(interrupt) == 1 {
  			return
  		}
  		// Block precaching permitted to continue, execute the transaction
  		statedb.Prepare(tx.Hash(), block.Hash(), i)
  		if err := precacheTransaction(p.config, p.bc, nil, gaspool, statedb, header, tx, cfg); err != nil {
  			return // Ugh, something went horribly wrong, bail out
  		}
  	}
  }
docs: // Prefetch processes the state changes according to the Ethereum rules by running
  // the transaction messages using the statedb, but any changes are discarded. The
  // only goal is to pre-cache transaction signatures and state trie nodes.