github.com/mrwater98/go-ethereum@v1.9.7/core/vm/jump_table.go (about)

     1  // Copyright 2015 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package vm
    18  
    19  import (
    20  	"errors"
    21  
    22  	"github.com/ethereum/go-ethereum/params"
    23  )
    24  
    25  type (
    26  	executionFunc func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error)
    27  	gasFunc       func(*EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64
    28  	// memorySizeFunc returns the required size, and whether the operation overflowed a uint64
    29  	memorySizeFunc func(*Stack) (size uint64, overflow bool)
    30  )
    31  
    32  var errGasUintOverflow = errors.New("gas uint64 overflow")
    33  
    34  type operation struct {
    35  	// execute is the operation function
    36  	execute     executionFunc
    37  	constantGas uint64
    38  	dynamicGas  gasFunc
    39  	// minStack tells how many stack items are required
    40  	minStack int
    41  	// maxStack specifies the max length the stack can have for this operation
    42  	// to not overflow the stack.
    43  	maxStack int
    44  
    45  	// memorySize returns the memory size required for the operation
    46  	memorySize memorySizeFunc
    47  
    48  	halts   bool // indicates whether the operation should halt further execution
    49  	jumps   bool // indicates whether the program counter should not increment
    50  	writes  bool // determines whether this a state modifying operation
    51  	valid   bool // indication whether the retrieved operation is valid and known
    52  	reverts bool // determines whether the operation reverts state (implicitly halts)
    53  	returns bool // determines whether the operations sets the return data content
    54  }
    55  
    56  var (
    57  	frontierInstructionSet         = newFrontierInstructionSet()
    58  	homesteadInstructionSet        = newHomesteadInstructionSet()
    59  	tangerineWhistleInstructionSet = newTangerineWhistleInstructionSet()
    60  	spuriousDragonInstructionSet   = newSpuriousDragonInstructionSet()
    61  	byzantiumInstructionSet        = newByzantiumInstructionSet()
    62  	constantinopleInstructionSet   = newConstantinopleInstructionSet()
    63  	istanbulInstructionSet         = newIstanbulInstructionSet()
    64  )
    65  
    66  // JumpTable contains the EVM opcodes supported at a given fork.
    67  type JumpTable [256]operation
    68  
    69  // newIstanbulInstructionSet returns the frontier, homestead
    70  // byzantium, contantinople and petersburg instructions.
    71  func newIstanbulInstructionSet() JumpTable {
    72  	instructionSet := newConstantinopleInstructionSet()
    73  
    74  	enable1344(&instructionSet) // ChainID opcode - https://eips.ethereum.org/EIPS/eip-1344
    75  	enable1884(&instructionSet) // Reprice reader opcodes - https://eips.ethereum.org/EIPS/eip-1884
    76  	enable2200(&instructionSet) // Net metered SSTORE - https://eips.ethereum.org/EIPS/eip-2200
    77  
    78  	return instructionSet
    79  }
    80  
    81  // newConstantinopleInstructionSet returns the frontier, homestead
    82  // byzantium and contantinople instructions.
    83  func newConstantinopleInstructionSet() JumpTable {
    84  	instructionSet := newByzantiumInstructionSet()
    85  	instructionSet[SHL] = operation{
    86  		execute:     opSHL,
    87  		constantGas: GasFastestStep,
    88  		minStack:    minStack(2, 1),
    89  		maxStack:    maxStack(2, 1),
    90  		valid:       true,
    91  	}
    92  	instructionSet[SHR] = operation{
    93  		execute:     opSHR,
    94  		constantGas: GasFastestStep,
    95  		minStack:    minStack(2, 1),
    96  		maxStack:    maxStack(2, 1),
    97  		valid:       true,
    98  	}
    99  	instructionSet[SAR] = operation{
   100  		execute:     opSAR,
   101  		constantGas: GasFastestStep,
   102  		minStack:    minStack(2, 1),
   103  		maxStack:    maxStack(2, 1),
   104  		valid:       true,
   105  	}
   106  	instructionSet[EXTCODEHASH] = operation{
   107  		execute:     opExtCodeHash,
   108  		constantGas: params.ExtcodeHashGasConstantinople,
   109  		minStack:    minStack(1, 1),
   110  		maxStack:    maxStack(1, 1),
   111  		valid:       true,
   112  	}
   113  	instructionSet[CREATE2] = operation{
   114  		execute:     opCreate2,
   115  		constantGas: params.Create2Gas,
   116  		dynamicGas:  gasCreate2,
   117  		minStack:    minStack(4, 1),
   118  		maxStack:    maxStack(4, 1),
   119  		memorySize:  memoryCreate2,
   120  		valid:       true,
   121  		writes:      true,
   122  		returns:     true,
   123  	}
   124  	return instructionSet
   125  }
   126  
   127  // newByzantiumInstructionSet returns the frontier, homestead and
   128  // byzantium instructions.
   129  func newByzantiumInstructionSet() JumpTable {
   130  	instructionSet := newSpuriousDragonInstructionSet()
   131  	instructionSet[STATICCALL] = operation{
   132  		execute:     opStaticCall,
   133  		constantGas: params.CallGasEIP150,
   134  		dynamicGas:  gasStaticCall,
   135  		minStack:    minStack(6, 1),
   136  		maxStack:    maxStack(6, 1),
   137  		memorySize:  memoryStaticCall,
   138  		valid:       true,
   139  		returns:     true,
   140  	}
   141  	instructionSet[RETURNDATASIZE] = operation{
   142  		execute:     opReturnDataSize,
   143  		constantGas: GasQuickStep,
   144  		minStack:    minStack(0, 1),
   145  		maxStack:    maxStack(0, 1),
   146  		valid:       true,
   147  	}
   148  	instructionSet[RETURNDATACOPY] = operation{
   149  		execute:     opReturnDataCopy,
   150  		constantGas: GasFastestStep,
   151  		dynamicGas:  gasReturnDataCopy,
   152  		minStack:    minStack(3, 0),
   153  		maxStack:    maxStack(3, 0),
   154  		memorySize:  memoryReturnDataCopy,
   155  		valid:       true,
   156  	}
   157  	instructionSet[REVERT] = operation{
   158  		execute:    opRevert,
   159  		dynamicGas: gasRevert,
   160  		minStack:   minStack(2, 0),
   161  		maxStack:   maxStack(2, 0),
   162  		memorySize: memoryRevert,
   163  		valid:      true,
   164  		reverts:    true,
   165  		returns:    true,
   166  	}
   167  	return instructionSet
   168  }
   169  
   170  // EIP 158 a.k.a Spurious Dragon
   171  func newSpuriousDragonInstructionSet() JumpTable {
   172  	instructionSet := newTangerineWhistleInstructionSet()
   173  	instructionSet[EXP].dynamicGas = gasExpEIP158
   174  	return instructionSet
   175  
   176  }
   177  
   178  // EIP 150 a.k.a Tangerine Whistle
   179  func newTangerineWhistleInstructionSet() JumpTable {
   180  	instructionSet := newHomesteadInstructionSet()
   181  	instructionSet[BALANCE].constantGas = params.BalanceGasEIP150
   182  	instructionSet[EXTCODESIZE].constantGas = params.ExtcodeSizeGasEIP150
   183  	instructionSet[SLOAD].constantGas = params.SloadGasEIP150
   184  	instructionSet[EXTCODECOPY].constantGas = params.ExtcodeCopyBaseEIP150
   185  	instructionSet[CALL].constantGas = params.CallGasEIP150
   186  	instructionSet[CALLCODE].constantGas = params.CallGasEIP150
   187  	instructionSet[DELEGATECALL].constantGas = params.CallGasEIP150
   188  	return instructionSet
   189  }
   190  
   191  // newHomesteadInstructionSet returns the frontier and homestead
   192  // instructions that can be executed during the homestead phase.
   193  func newHomesteadInstructionSet() JumpTable {
   194  	instructionSet := newFrontierInstructionSet()
   195  	instructionSet[DELEGATECALL] = operation{
   196  		execute:     opDelegateCall,
   197  		dynamicGas:  gasDelegateCall,
   198  		constantGas: params.CallGasFrontier,
   199  		minStack:    minStack(6, 1),
   200  		maxStack:    maxStack(6, 1),
   201  		memorySize:  memoryDelegateCall,
   202  		valid:       true,
   203  		returns:     true,
   204  	}
   205  	return instructionSet
   206  }
   207  
   208  // newFrontierInstructionSet returns the frontier instructions
   209  // that can be executed during the frontier phase.
   210  func newFrontierInstructionSet() JumpTable {
   211  	return JumpTable{
   212  		STOP: {
   213  			execute:     opStop,
   214  			constantGas: 0,
   215  			minStack:    minStack(0, 0),
   216  			maxStack:    maxStack(0, 0),
   217  			halts:       true,
   218  			valid:       true,
   219  		},
   220  		ADD: {
   221  			execute:     opAdd,
   222  			constantGas: GasFastestStep,
   223  			minStack:    minStack(2, 1),
   224  			maxStack:    maxStack(2, 1),
   225  			valid:       true,
   226  		},
   227  		MUL: {
   228  			execute:     opMul,
   229  			constantGas: GasFastStep,
   230  			minStack:    minStack(2, 1),
   231  			maxStack:    maxStack(2, 1),
   232  			valid:       true,
   233  		},
   234  		SUB: {
   235  			execute:     opSub,
   236  			constantGas: GasFastestStep,
   237  			minStack:    minStack(2, 1),
   238  			maxStack:    maxStack(2, 1),
   239  			valid:       true,
   240  		},
   241  		DIV: {
   242  			execute:     opDiv,
   243  			constantGas: GasFastStep,
   244  			minStack:    minStack(2, 1),
   245  			maxStack:    maxStack(2, 1),
   246  			valid:       true,
   247  		},
   248  		SDIV: {
   249  			execute:     opSdiv,
   250  			constantGas: GasFastStep,
   251  			minStack:    minStack(2, 1),
   252  			maxStack:    maxStack(2, 1),
   253  			valid:       true,
   254  		},
   255  		MOD: {
   256  			execute:     opMod,
   257  			constantGas: GasFastStep,
   258  			minStack:    minStack(2, 1),
   259  			maxStack:    maxStack(2, 1),
   260  			valid:       true,
   261  		},
   262  		SMOD: {
   263  			execute:     opSmod,
   264  			constantGas: GasFastStep,
   265  			minStack:    minStack(2, 1),
   266  			maxStack:    maxStack(2, 1),
   267  			valid:       true,
   268  		},
   269  		ADDMOD: {
   270  			execute:     opAddmod,
   271  			constantGas: GasMidStep,
   272  			minStack:    minStack(3, 1),
   273  			maxStack:    maxStack(3, 1),
   274  			valid:       true,
   275  		},
   276  		MULMOD: {
   277  			execute:     opMulmod,
   278  			constantGas: GasMidStep,
   279  			minStack:    minStack(3, 1),
   280  			maxStack:    maxStack(3, 1),
   281  			valid:       true,
   282  		},
   283  		EXP: {
   284  			execute:    opExp,
   285  			dynamicGas: gasExpFrontier,
   286  			minStack:   minStack(2, 1),
   287  			maxStack:   maxStack(2, 1),
   288  			valid:      true,
   289  		},
   290  		SIGNEXTEND: {
   291  			execute:     opSignExtend,
   292  			constantGas: GasFastStep,
   293  			minStack:    minStack(2, 1),
   294  			maxStack:    maxStack(2, 1),
   295  			valid:       true,
   296  		},
   297  		LT: {
   298  			execute:     opLt,
   299  			constantGas: GasFastestStep,
   300  			minStack:    minStack(2, 1),
   301  			maxStack:    maxStack(2, 1),
   302  			valid:       true,
   303  		},
   304  		GT: {
   305  			execute:     opGt,
   306  			constantGas: GasFastestStep,
   307  			minStack:    minStack(2, 1),
   308  			maxStack:    maxStack(2, 1),
   309  			valid:       true,
   310  		},
   311  		SLT: {
   312  			execute:     opSlt,
   313  			constantGas: GasFastestStep,
   314  			minStack:    minStack(2, 1),
   315  			maxStack:    maxStack(2, 1),
   316  			valid:       true,
   317  		},
   318  		SGT: {
   319  			execute:     opSgt,
   320  			constantGas: GasFastestStep,
   321  			minStack:    minStack(2, 1),
   322  			maxStack:    maxStack(2, 1),
   323  			valid:       true,
   324  		},
   325  		EQ: {
   326  			execute:     opEq,
   327  			constantGas: GasFastestStep,
   328  			minStack:    minStack(2, 1),
   329  			maxStack:    maxStack(2, 1),
   330  			valid:       true,
   331  		},
   332  		ISZERO: {
   333  			execute:     opIszero,
   334  			constantGas: GasFastestStep,
   335  			minStack:    minStack(1, 1),
   336  			maxStack:    maxStack(1, 1),
   337  			valid:       true,
   338  		},
   339  		AND: {
   340  			execute:     opAnd,
   341  			constantGas: GasFastestStep,
   342  			minStack:    minStack(2, 1),
   343  			maxStack:    maxStack(2, 1),
   344  			valid:       true,
   345  		},
   346  		XOR: {
   347  			execute:     opXor,
   348  			constantGas: GasFastestStep,
   349  			minStack:    minStack(2, 1),
   350  			maxStack:    maxStack(2, 1),
   351  			valid:       true,
   352  		},
   353  		OR: {
   354  			execute:     opOr,
   355  			constantGas: GasFastestStep,
   356  			minStack:    minStack(2, 1),
   357  			maxStack:    maxStack(2, 1),
   358  			valid:       true,
   359  		},
   360  		NOT: {
   361  			execute:     opNot,
   362  			constantGas: GasFastestStep,
   363  			minStack:    minStack(1, 1),
   364  			maxStack:    maxStack(1, 1),
   365  			valid:       true,
   366  		},
   367  		BYTE: {
   368  			execute:     opByte,
   369  			constantGas: GasFastestStep,
   370  			minStack:    minStack(2, 1),
   371  			maxStack:    maxStack(2, 1),
   372  			valid:       true,
   373  		},
   374  		SHA3: {
   375  			execute:     opSha3,
   376  			constantGas: params.Sha3Gas,
   377  			dynamicGas:  gasSha3,
   378  			minStack:    minStack(2, 1),
   379  			maxStack:    maxStack(2, 1),
   380  			memorySize:  memorySha3,
   381  			valid:       true,
   382  		},
   383  		ADDRESS: {
   384  			execute:     opAddress,
   385  			constantGas: GasQuickStep,
   386  			minStack:    minStack(0, 1),
   387  			maxStack:    maxStack(0, 1),
   388  			valid:       true,
   389  		},
   390  		BALANCE: {
   391  			execute:     opBalance,
   392  			constantGas: params.BalanceGasFrontier,
   393  			minStack:    minStack(1, 1),
   394  			maxStack:    maxStack(1, 1),
   395  			valid:       true,
   396  		},
   397  		ORIGIN: {
   398  			execute:     opOrigin,
   399  			constantGas: GasQuickStep,
   400  			minStack:    minStack(0, 1),
   401  			maxStack:    maxStack(0, 1),
   402  			valid:       true,
   403  		},
   404  		CALLER: {
   405  			execute:     opCaller,
   406  			constantGas: GasQuickStep,
   407  			minStack:    minStack(0, 1),
   408  			maxStack:    maxStack(0, 1),
   409  			valid:       true,
   410  		},
   411  		CALLVALUE: {
   412  			execute:     opCallValue,
   413  			constantGas: GasQuickStep,
   414  			minStack:    minStack(0, 1),
   415  			maxStack:    maxStack(0, 1),
   416  			valid:       true,
   417  		},
   418  		CALLDATALOAD: {
   419  			execute:     opCallDataLoad,
   420  			constantGas: GasFastestStep,
   421  			minStack:    minStack(1, 1),
   422  			maxStack:    maxStack(1, 1),
   423  			valid:       true,
   424  		},
   425  		CALLDATASIZE: {
   426  			execute:     opCallDataSize,
   427  			constantGas: GasQuickStep,
   428  			minStack:    minStack(0, 1),
   429  			maxStack:    maxStack(0, 1),
   430  			valid:       true,
   431  		},
   432  		CALLDATACOPY: {
   433  			execute:     opCallDataCopy,
   434  			constantGas: GasFastestStep,
   435  			dynamicGas:  gasCallDataCopy,
   436  			minStack:    minStack(3, 0),
   437  			maxStack:    maxStack(3, 0),
   438  			memorySize:  memoryCallDataCopy,
   439  			valid:       true,
   440  		},
   441  		CODESIZE: {
   442  			execute:     opCodeSize,
   443  			constantGas: GasQuickStep,
   444  			minStack:    minStack(0, 1),
   445  			maxStack:    maxStack(0, 1),
   446  			valid:       true,
   447  		},
   448  		CODECOPY: {
   449  			execute:     opCodeCopy,
   450  			constantGas: GasFastestStep,
   451  			dynamicGas:  gasCodeCopy,
   452  			minStack:    minStack(3, 0),
   453  			maxStack:    maxStack(3, 0),
   454  			memorySize:  memoryCodeCopy,
   455  			valid:       true,
   456  		},
   457  		GASPRICE: {
   458  			execute:     opGasprice,
   459  			constantGas: GasQuickStep,
   460  			minStack:    minStack(0, 1),
   461  			maxStack:    maxStack(0, 1),
   462  			valid:       true,
   463  		},
   464  		EXTCODESIZE: {
   465  			execute:     opExtCodeSize,
   466  			constantGas: params.ExtcodeSizeGasFrontier,
   467  			minStack:    minStack(1, 1),
   468  			maxStack:    maxStack(1, 1),
   469  			valid:       true,
   470  		},
   471  		EXTCODECOPY: {
   472  			execute:     opExtCodeCopy,
   473  			constantGas: params.ExtcodeCopyBaseFrontier,
   474  			dynamicGas:  gasExtCodeCopy,
   475  			minStack:    minStack(4, 0),
   476  			maxStack:    maxStack(4, 0),
   477  			memorySize:  memoryExtCodeCopy,
   478  			valid:       true,
   479  		},
   480  		BLOCKHASH: {
   481  			execute:     opBlockhash,
   482  			constantGas: GasExtStep,
   483  			minStack:    minStack(1, 1),
   484  			maxStack:    maxStack(1, 1),
   485  			valid:       true,
   486  		},
   487  		COINBASE: {
   488  			execute:     opCoinbase,
   489  			constantGas: GasQuickStep,
   490  			minStack:    minStack(0, 1),
   491  			maxStack:    maxStack(0, 1),
   492  			valid:       true,
   493  		},
   494  		TIMESTAMP: {
   495  			execute:     opTimestamp,
   496  			constantGas: GasQuickStep,
   497  			minStack:    minStack(0, 1),
   498  			maxStack:    maxStack(0, 1),
   499  			valid:       true,
   500  		},
   501  		NUMBER: {
   502  			execute:     opNumber,
   503  			constantGas: GasQuickStep,
   504  			minStack:    minStack(0, 1),
   505  			maxStack:    maxStack(0, 1),
   506  			valid:       true,
   507  		},
   508  		DIFFICULTY: {
   509  			execute:     opDifficulty,
   510  			constantGas: GasQuickStep,
   511  			minStack:    minStack(0, 1),
   512  			maxStack:    maxStack(0, 1),
   513  			valid:       true,
   514  		},
   515  		GASLIMIT: {
   516  			execute:     opGasLimit,
   517  			constantGas: GasQuickStep,
   518  			minStack:    minStack(0, 1),
   519  			maxStack:    maxStack(0, 1),
   520  			valid:       true,
   521  		},
   522  		POP: {
   523  			execute:     opPop,
   524  			constantGas: GasQuickStep,
   525  			minStack:    minStack(1, 0),
   526  			maxStack:    maxStack(1, 0),
   527  			valid:       true,
   528  		},
   529  		MLOAD: {
   530  			execute:     opMload,
   531  			constantGas: GasFastestStep,
   532  			dynamicGas:  gasMLoad,
   533  			minStack:    minStack(1, 1),
   534  			maxStack:    maxStack(1, 1),
   535  			memorySize:  memoryMLoad,
   536  			valid:       true,
   537  		},
   538  		MSTORE: {
   539  			execute:     opMstore,
   540  			constantGas: GasFastestStep,
   541  			dynamicGas:  gasMStore,
   542  			minStack:    minStack(2, 0),
   543  			maxStack:    maxStack(2, 0),
   544  			memorySize:  memoryMStore,
   545  			valid:       true,
   546  		},
   547  		MSTORE8: {
   548  			execute:     opMstore8,
   549  			constantGas: GasFastestStep,
   550  			dynamicGas:  gasMStore8,
   551  			memorySize:  memoryMStore8,
   552  			minStack:    minStack(2, 0),
   553  			maxStack:    maxStack(2, 0),
   554  
   555  			valid: true,
   556  		},
   557  		SLOAD: {
   558  			execute:     opSload,
   559  			constantGas: params.SloadGasFrontier,
   560  			minStack:    minStack(1, 1),
   561  			maxStack:    maxStack(1, 1),
   562  			valid:       true,
   563  		},
   564  		SSTORE: {
   565  			execute:    opSstore,
   566  			dynamicGas: gasSStore,
   567  			minStack:   minStack(2, 0),
   568  			maxStack:   maxStack(2, 0),
   569  			valid:      true,
   570  			writes:     true,
   571  		},
   572  		JUMP: {
   573  			execute:     opJump,
   574  			constantGas: GasMidStep,
   575  			minStack:    minStack(1, 0),
   576  			maxStack:    maxStack(1, 0),
   577  			jumps:       true,
   578  			valid:       true,
   579  		},
   580  		JUMPI: {
   581  			execute:     opJumpi,
   582  			constantGas: GasSlowStep,
   583  			minStack:    minStack(2, 0),
   584  			maxStack:    maxStack(2, 0),
   585  			jumps:       true,
   586  			valid:       true,
   587  		},
   588  		PC: {
   589  			execute:     opPc,
   590  			constantGas: GasQuickStep,
   591  			minStack:    minStack(0, 1),
   592  			maxStack:    maxStack(0, 1),
   593  			valid:       true,
   594  		},
   595  		MSIZE: {
   596  			execute:     opMsize,
   597  			constantGas: GasQuickStep,
   598  			minStack:    minStack(0, 1),
   599  			maxStack:    maxStack(0, 1),
   600  			valid:       true,
   601  		},
   602  		GAS: {
   603  			execute:     opGas,
   604  			constantGas: GasQuickStep,
   605  			minStack:    minStack(0, 1),
   606  			maxStack:    maxStack(0, 1),
   607  			valid:       true,
   608  		},
   609  		JUMPDEST: {
   610  			execute:     opJumpdest,
   611  			constantGas: params.JumpdestGas,
   612  			minStack:    minStack(0, 0),
   613  			maxStack:    maxStack(0, 0),
   614  			valid:       true,
   615  		},
   616  		PUSH1: {
   617  			execute:     opPush1,
   618  			constantGas: GasFastestStep,
   619  			minStack:    minStack(0, 1),
   620  			maxStack:    maxStack(0, 1),
   621  			valid:       true,
   622  		},
   623  		PUSH2: {
   624  			execute:     makePush(2, 2),
   625  			constantGas: GasFastestStep,
   626  			minStack:    minStack(0, 1),
   627  			maxStack:    maxStack(0, 1),
   628  			valid:       true,
   629  		},
   630  		PUSH3: {
   631  			execute:     makePush(3, 3),
   632  			constantGas: GasFastestStep,
   633  			minStack:    minStack(0, 1),
   634  			maxStack:    maxStack(0, 1),
   635  			valid:       true,
   636  		},
   637  		PUSH4: {
   638  			execute:     makePush(4, 4),
   639  			constantGas: GasFastestStep,
   640  			minStack:    minStack(0, 1),
   641  			maxStack:    maxStack(0, 1),
   642  			valid:       true,
   643  		},
   644  		PUSH5: {
   645  			execute:     makePush(5, 5),
   646  			constantGas: GasFastestStep,
   647  			minStack:    minStack(0, 1),
   648  			maxStack:    maxStack(0, 1),
   649  			valid:       true,
   650  		},
   651  		PUSH6: {
   652  			execute:     makePush(6, 6),
   653  			constantGas: GasFastestStep,
   654  			minStack:    minStack(0, 1),
   655  			maxStack:    maxStack(0, 1),
   656  			valid:       true,
   657  		},
   658  		PUSH7: {
   659  			execute:     makePush(7, 7),
   660  			constantGas: GasFastestStep,
   661  			minStack:    minStack(0, 1),
   662  			maxStack:    maxStack(0, 1),
   663  			valid:       true,
   664  		},
   665  		PUSH8: {
   666  			execute:     makePush(8, 8),
   667  			constantGas: GasFastestStep,
   668  			minStack:    minStack(0, 1),
   669  			maxStack:    maxStack(0, 1),
   670  			valid:       true,
   671  		},
   672  		PUSH9: {
   673  			execute:     makePush(9, 9),
   674  			constantGas: GasFastestStep,
   675  			minStack:    minStack(0, 1),
   676  			maxStack:    maxStack(0, 1),
   677  			valid:       true,
   678  		},
   679  		PUSH10: {
   680  			execute:     makePush(10, 10),
   681  			constantGas: GasFastestStep,
   682  			minStack:    minStack(0, 1),
   683  			maxStack:    maxStack(0, 1),
   684  			valid:       true,
   685  		},
   686  		PUSH11: {
   687  			execute:     makePush(11, 11),
   688  			constantGas: GasFastestStep,
   689  			minStack:    minStack(0, 1),
   690  			maxStack:    maxStack(0, 1),
   691  			valid:       true,
   692  		},
   693  		PUSH12: {
   694  			execute:     makePush(12, 12),
   695  			constantGas: GasFastestStep,
   696  			minStack:    minStack(0, 1),
   697  			maxStack:    maxStack(0, 1),
   698  			valid:       true,
   699  		},
   700  		PUSH13: {
   701  			execute:     makePush(13, 13),
   702  			constantGas: GasFastestStep,
   703  			minStack:    minStack(0, 1),
   704  			maxStack:    maxStack(0, 1),
   705  			valid:       true,
   706  		},
   707  		PUSH14: {
   708  			execute:     makePush(14, 14),
   709  			constantGas: GasFastestStep,
   710  			minStack:    minStack(0, 1),
   711  			maxStack:    maxStack(0, 1),
   712  			valid:       true,
   713  		},
   714  		PUSH15: {
   715  			execute:     makePush(15, 15),
   716  			constantGas: GasFastestStep,
   717  			minStack:    minStack(0, 1),
   718  			maxStack:    maxStack(0, 1),
   719  			valid:       true,
   720  		},
   721  		PUSH16: {
   722  			execute:     makePush(16, 16),
   723  			constantGas: GasFastestStep,
   724  			minStack:    minStack(0, 1),
   725  			maxStack:    maxStack(0, 1),
   726  			valid:       true,
   727  		},
   728  		PUSH17: {
   729  			execute:     makePush(17, 17),
   730  			constantGas: GasFastestStep,
   731  			minStack:    minStack(0, 1),
   732  			maxStack:    maxStack(0, 1),
   733  			valid:       true,
   734  		},
   735  		PUSH18: {
   736  			execute:     makePush(18, 18),
   737  			constantGas: GasFastestStep,
   738  			minStack:    minStack(0, 1),
   739  			maxStack:    maxStack(0, 1),
   740  			valid:       true,
   741  		},
   742  		PUSH19: {
   743  			execute:     makePush(19, 19),
   744  			constantGas: GasFastestStep,
   745  			minStack:    minStack(0, 1),
   746  			maxStack:    maxStack(0, 1),
   747  			valid:       true,
   748  		},
   749  		PUSH20: {
   750  			execute:     makePush(20, 20),
   751  			constantGas: GasFastestStep,
   752  			minStack:    minStack(0, 1),
   753  			maxStack:    maxStack(0, 1),
   754  			valid:       true,
   755  		},
   756  		PUSH21: {
   757  			execute:     makePush(21, 21),
   758  			constantGas: GasFastestStep,
   759  			minStack:    minStack(0, 1),
   760  			maxStack:    maxStack(0, 1),
   761  			valid:       true,
   762  		},
   763  		PUSH22: {
   764  			execute:     makePush(22, 22),
   765  			constantGas: GasFastestStep,
   766  			minStack:    minStack(0, 1),
   767  			maxStack:    maxStack(0, 1),
   768  			valid:       true,
   769  		},
   770  		PUSH23: {
   771  			execute:     makePush(23, 23),
   772  			constantGas: GasFastestStep,
   773  			minStack:    minStack(0, 1),
   774  			maxStack:    maxStack(0, 1),
   775  			valid:       true,
   776  		},
   777  		PUSH24: {
   778  			execute:     makePush(24, 24),
   779  			constantGas: GasFastestStep,
   780  			minStack:    minStack(0, 1),
   781  			maxStack:    maxStack(0, 1),
   782  			valid:       true,
   783  		},
   784  		PUSH25: {
   785  			execute:     makePush(25, 25),
   786  			constantGas: GasFastestStep,
   787  			minStack:    minStack(0, 1),
   788  			maxStack:    maxStack(0, 1),
   789  			valid:       true,
   790  		},
   791  		PUSH26: {
   792  			execute:     makePush(26, 26),
   793  			constantGas: GasFastestStep,
   794  			minStack:    minStack(0, 1),
   795  			maxStack:    maxStack(0, 1),
   796  			valid:       true,
   797  		},
   798  		PUSH27: {
   799  			execute:     makePush(27, 27),
   800  			constantGas: GasFastestStep,
   801  			minStack:    minStack(0, 1),
   802  			maxStack:    maxStack(0, 1),
   803  			valid:       true,
   804  		},
   805  		PUSH28: {
   806  			execute:     makePush(28, 28),
   807  			constantGas: GasFastestStep,
   808  			minStack:    minStack(0, 1),
   809  			maxStack:    maxStack(0, 1),
   810  			valid:       true,
   811  		},
   812  		PUSH29: {
   813  			execute:     makePush(29, 29),
   814  			constantGas: GasFastestStep,
   815  			minStack:    minStack(0, 1),
   816  			maxStack:    maxStack(0, 1),
   817  			valid:       true,
   818  		},
   819  		PUSH30: {
   820  			execute:     makePush(30, 30),
   821  			constantGas: GasFastestStep,
   822  			minStack:    minStack(0, 1),
   823  			maxStack:    maxStack(0, 1),
   824  			valid:       true,
   825  		},
   826  		PUSH31: {
   827  			execute:     makePush(31, 31),
   828  			constantGas: GasFastestStep,
   829  			minStack:    minStack(0, 1),
   830  			maxStack:    maxStack(0, 1),
   831  			valid:       true,
   832  		},
   833  		PUSH32: {
   834  			execute:     makePush(32, 32),
   835  			constantGas: GasFastestStep,
   836  			minStack:    minStack(0, 1),
   837  			maxStack:    maxStack(0, 1),
   838  			valid:       true,
   839  		},
   840  		DUP1: {
   841  			execute:     makeDup(1),
   842  			constantGas: GasFastestStep,
   843  			minStack:    minDupStack(1),
   844  			maxStack:    maxDupStack(1),
   845  			valid:       true,
   846  		},
   847  		DUP2: {
   848  			execute:     makeDup(2),
   849  			constantGas: GasFastestStep,
   850  			minStack:    minDupStack(2),
   851  			maxStack:    maxDupStack(2),
   852  			valid:       true,
   853  		},
   854  		DUP3: {
   855  			execute:     makeDup(3),
   856  			constantGas: GasFastestStep,
   857  			minStack:    minDupStack(3),
   858  			maxStack:    maxDupStack(3),
   859  			valid:       true,
   860  		},
   861  		DUP4: {
   862  			execute:     makeDup(4),
   863  			constantGas: GasFastestStep,
   864  			minStack:    minDupStack(4),
   865  			maxStack:    maxDupStack(4),
   866  			valid:       true,
   867  		},
   868  		DUP5: {
   869  			execute:     makeDup(5),
   870  			constantGas: GasFastestStep,
   871  			minStack:    minDupStack(5),
   872  			maxStack:    maxDupStack(5),
   873  			valid:       true,
   874  		},
   875  		DUP6: {
   876  			execute:     makeDup(6),
   877  			constantGas: GasFastestStep,
   878  			minStack:    minDupStack(6),
   879  			maxStack:    maxDupStack(6),
   880  			valid:       true,
   881  		},
   882  		DUP7: {
   883  			execute:     makeDup(7),
   884  			constantGas: GasFastestStep,
   885  			minStack:    minDupStack(7),
   886  			maxStack:    maxDupStack(7),
   887  			valid:       true,
   888  		},
   889  		DUP8: {
   890  			execute:     makeDup(8),
   891  			constantGas: GasFastestStep,
   892  			minStack:    minDupStack(8),
   893  			maxStack:    maxDupStack(8),
   894  			valid:       true,
   895  		},
   896  		DUP9: {
   897  			execute:     makeDup(9),
   898  			constantGas: GasFastestStep,
   899  			minStack:    minDupStack(9),
   900  			maxStack:    maxDupStack(9),
   901  			valid:       true,
   902  		},
   903  		DUP10: {
   904  			execute:     makeDup(10),
   905  			constantGas: GasFastestStep,
   906  			minStack:    minDupStack(10),
   907  			maxStack:    maxDupStack(10),
   908  			valid:       true,
   909  		},
   910  		DUP11: {
   911  			execute:     makeDup(11),
   912  			constantGas: GasFastestStep,
   913  			minStack:    minDupStack(11),
   914  			maxStack:    maxDupStack(11),
   915  			valid:       true,
   916  		},
   917  		DUP12: {
   918  			execute:     makeDup(12),
   919  			constantGas: GasFastestStep,
   920  			minStack:    minDupStack(12),
   921  			maxStack:    maxDupStack(12),
   922  			valid:       true,
   923  		},
   924  		DUP13: {
   925  			execute:     makeDup(13),
   926  			constantGas: GasFastestStep,
   927  			minStack:    minDupStack(13),
   928  			maxStack:    maxDupStack(13),
   929  			valid:       true,
   930  		},
   931  		DUP14: {
   932  			execute:     makeDup(14),
   933  			constantGas: GasFastestStep,
   934  			minStack:    minDupStack(14),
   935  			maxStack:    maxDupStack(14),
   936  			valid:       true,
   937  		},
   938  		DUP15: {
   939  			execute:     makeDup(15),
   940  			constantGas: GasFastestStep,
   941  			minStack:    minDupStack(15),
   942  			maxStack:    maxDupStack(15),
   943  			valid:       true,
   944  		},
   945  		DUP16: {
   946  			execute:     makeDup(16),
   947  			constantGas: GasFastestStep,
   948  			minStack:    minDupStack(16),
   949  			maxStack:    maxDupStack(16),
   950  			valid:       true,
   951  		},
   952  		SWAP1: {
   953  			execute:     makeSwap(1),
   954  			constantGas: GasFastestStep,
   955  			minStack:    minSwapStack(2),
   956  			maxStack:    maxSwapStack(2),
   957  			valid:       true,
   958  		},
   959  		SWAP2: {
   960  			execute:     makeSwap(2),
   961  			constantGas: GasFastestStep,
   962  			minStack:    minSwapStack(3),
   963  			maxStack:    maxSwapStack(3),
   964  			valid:       true,
   965  		},
   966  		SWAP3: {
   967  			execute:     makeSwap(3),
   968  			constantGas: GasFastestStep,
   969  			minStack:    minSwapStack(4),
   970  			maxStack:    maxSwapStack(4),
   971  			valid:       true,
   972  		},
   973  		SWAP4: {
   974  			execute:     makeSwap(4),
   975  			constantGas: GasFastestStep,
   976  			minStack:    minSwapStack(5),
   977  			maxStack:    maxSwapStack(5),
   978  			valid:       true,
   979  		},
   980  		SWAP5: {
   981  			execute:     makeSwap(5),
   982  			constantGas: GasFastestStep,
   983  			minStack:    minSwapStack(6),
   984  			maxStack:    maxSwapStack(6),
   985  			valid:       true,
   986  		},
   987  		SWAP6: {
   988  			execute:     makeSwap(6),
   989  			constantGas: GasFastestStep,
   990  			minStack:    minSwapStack(7),
   991  			maxStack:    maxSwapStack(7),
   992  			valid:       true,
   993  		},
   994  		SWAP7: {
   995  			execute:     makeSwap(7),
   996  			constantGas: GasFastestStep,
   997  			minStack:    minSwapStack(8),
   998  			maxStack:    maxSwapStack(8),
   999  			valid:       true,
  1000  		},
  1001  		SWAP8: {
  1002  			execute:     makeSwap(8),
  1003  			constantGas: GasFastestStep,
  1004  			minStack:    minSwapStack(9),
  1005  			maxStack:    maxSwapStack(9),
  1006  			valid:       true,
  1007  		},
  1008  		SWAP9: {
  1009  			execute:     makeSwap(9),
  1010  			constantGas: GasFastestStep,
  1011  			minStack:    minSwapStack(10),
  1012  			maxStack:    maxSwapStack(10),
  1013  			valid:       true,
  1014  		},
  1015  		SWAP10: {
  1016  			execute:     makeSwap(10),
  1017  			constantGas: GasFastestStep,
  1018  			minStack:    minSwapStack(11),
  1019  			maxStack:    maxSwapStack(11),
  1020  			valid:       true,
  1021  		},
  1022  		SWAP11: {
  1023  			execute:     makeSwap(11),
  1024  			constantGas: GasFastestStep,
  1025  			minStack:    minSwapStack(12),
  1026  			maxStack:    maxSwapStack(12),
  1027  			valid:       true,
  1028  		},
  1029  		SWAP12: {
  1030  			execute:     makeSwap(12),
  1031  			constantGas: GasFastestStep,
  1032  			minStack:    minSwapStack(13),
  1033  			maxStack:    maxSwapStack(13),
  1034  			valid:       true,
  1035  		},
  1036  		SWAP13: {
  1037  			execute:     makeSwap(13),
  1038  			constantGas: GasFastestStep,
  1039  			minStack:    minSwapStack(14),
  1040  			maxStack:    maxSwapStack(14),
  1041  			valid:       true,
  1042  		},
  1043  		SWAP14: {
  1044  			execute:     makeSwap(14),
  1045  			constantGas: GasFastestStep,
  1046  			minStack:    minSwapStack(15),
  1047  			maxStack:    maxSwapStack(15),
  1048  			valid:       true,
  1049  		},
  1050  		SWAP15: {
  1051  			execute:     makeSwap(15),
  1052  			constantGas: GasFastestStep,
  1053  			minStack:    minSwapStack(16),
  1054  			maxStack:    maxSwapStack(16),
  1055  			valid:       true,
  1056  		},
  1057  		SWAP16: {
  1058  			execute:     makeSwap(16),
  1059  			constantGas: GasFastestStep,
  1060  			minStack:    minSwapStack(17),
  1061  			maxStack:    maxSwapStack(17),
  1062  			valid:       true,
  1063  		},
  1064  		LOG0: {
  1065  			execute:    makeLog(0),
  1066  			dynamicGas: makeGasLog(0),
  1067  			minStack:   minStack(2, 0),
  1068  			maxStack:   maxStack(2, 0),
  1069  			memorySize: memoryLog,
  1070  			valid:      true,
  1071  			writes:     true,
  1072  		},
  1073  		LOG1: {
  1074  			execute:    makeLog(1),
  1075  			dynamicGas: makeGasLog(1),
  1076  			minStack:   minStack(3, 0),
  1077  			maxStack:   maxStack(3, 0),
  1078  			memorySize: memoryLog,
  1079  			valid:      true,
  1080  			writes:     true,
  1081  		},
  1082  		LOG2: {
  1083  			execute:    makeLog(2),
  1084  			dynamicGas: makeGasLog(2),
  1085  			minStack:   minStack(4, 0),
  1086  			maxStack:   maxStack(4, 0),
  1087  			memorySize: memoryLog,
  1088  			valid:      true,
  1089  			writes:     true,
  1090  		},
  1091  		LOG3: {
  1092  			execute:    makeLog(3),
  1093  			dynamicGas: makeGasLog(3),
  1094  			minStack:   minStack(5, 0),
  1095  			maxStack:   maxStack(5, 0),
  1096  			memorySize: memoryLog,
  1097  			valid:      true,
  1098  			writes:     true,
  1099  		},
  1100  		LOG4: {
  1101  			execute:    makeLog(4),
  1102  			dynamicGas: makeGasLog(4),
  1103  			minStack:   minStack(6, 0),
  1104  			maxStack:   maxStack(6, 0),
  1105  			memorySize: memoryLog,
  1106  			valid:      true,
  1107  			writes:     true,
  1108  		},
  1109  		CREATE: {
  1110  			execute:     opCreate,
  1111  			constantGas: params.CreateGas,
  1112  			dynamicGas:  gasCreate,
  1113  			minStack:    minStack(3, 1),
  1114  			maxStack:    maxStack(3, 1),
  1115  			memorySize:  memoryCreate,
  1116  			valid:       true,
  1117  			writes:      true,
  1118  			returns:     true,
  1119  		},
  1120  		CALL: {
  1121  			execute:     opCall,
  1122  			constantGas: params.CallGasFrontier,
  1123  			dynamicGas:  gasCall,
  1124  			minStack:    minStack(7, 1),
  1125  			maxStack:    maxStack(7, 1),
  1126  			memorySize:  memoryCall,
  1127  			valid:       true,
  1128  			returns:     true,
  1129  		},
  1130  		CALLCODE: {
  1131  			execute:     opCallCode,
  1132  			constantGas: params.CallGasFrontier,
  1133  			dynamicGas:  gasCallCode,
  1134  			minStack:    minStack(7, 1),
  1135  			maxStack:    maxStack(7, 1),
  1136  			memorySize:  memoryCall,
  1137  			valid:       true,
  1138  			returns:     true,
  1139  		},
  1140  		RETURN: {
  1141  			execute:    opReturn,
  1142  			dynamicGas: gasReturn,
  1143  			minStack:   minStack(2, 0),
  1144  			maxStack:   maxStack(2, 0),
  1145  			memorySize: memoryReturn,
  1146  			halts:      true,
  1147  			valid:      true,
  1148  		},
  1149  		SELFDESTRUCT: {
  1150  			execute:    opSuicide,
  1151  			dynamicGas: gasSelfdestruct,
  1152  			minStack:   minStack(1, 0),
  1153  			maxStack:   maxStack(1, 0),
  1154  			halts:      true,
  1155  			valid:      true,
  1156  			writes:     true,
  1157  		},
  1158  	}
  1159  }