code: func IntrinsicGas(data []byte, contractCreation, homestead bool) (uint64, error) {
  	// Set the starting gas for the raw transaction
  	var gas uint64
  	if contractCreation && homestead {
  		gas = params.TxGasContractCreation
  	} else {
  		gas = params.TxGas
  	}
  	// Bump the required gas by the amount of transactional data
  	if len(data) > 0 {
  		// Zero and non-zero bytes are priced differently
  		var nz uint64
  		for _, byt := range data {
  			if byt != 0 {
  				nz++
  			}
  		}
  		// Make sure we don't exceed uint64 for all data combinations
  		if (math.MaxUint64-gas)/params.TxDataNonZeroGas < nz {
  			return 0, vm.ErrOutOfGas
  		}
  		gas += nz * params.TxDataNonZeroGas
  
  		z := uint64(len(data)) - nz
  		if (math.MaxUint64-gas)/params.TxDataZeroGas < z {
  			return 0, vm.ErrOutOfGas
  		}
  		gas += z * params.TxDataZeroGas
  	}
  	return gas, nil
  }
docs: // IntrinsicGas computes the 'intrinsic gas' for a message with the given data.