github.com/codysnider/go-ethereum@v1.10.18-0.20220420071915-14f4ae99222a/core/vm/opcodes.go (about)

     1  // Copyright 2014 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  	"fmt"
    21  )
    22  
    23  // OpCode is an EVM opcode
    24  type OpCode byte
    25  
    26  // IsPush specifies if an opcode is a PUSH opcode.
    27  func (op OpCode) IsPush() bool {
    28  	switch op {
    29  	case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
    30  		return true
    31  	}
    32  	return false
    33  }
    34  
    35  // 0x0 range - arithmetic ops.
    36  const (
    37  	STOP       OpCode = 0x0
    38  	ADD        OpCode = 0x1
    39  	MUL        OpCode = 0x2
    40  	SUB        OpCode = 0x3
    41  	DIV        OpCode = 0x4
    42  	SDIV       OpCode = 0x5
    43  	MOD        OpCode = 0x6
    44  	SMOD       OpCode = 0x7
    45  	ADDMOD     OpCode = 0x8
    46  	MULMOD     OpCode = 0x9
    47  	EXP        OpCode = 0xa
    48  	SIGNEXTEND OpCode = 0xb
    49  )
    50  
    51  // 0x10 range - comparison ops.
    52  const (
    53  	LT     OpCode = 0x10
    54  	GT     OpCode = 0x11
    55  	SLT    OpCode = 0x12
    56  	SGT    OpCode = 0x13
    57  	EQ     OpCode = 0x14
    58  	ISZERO OpCode = 0x15
    59  	AND    OpCode = 0x16
    60  	OR     OpCode = 0x17
    61  	XOR    OpCode = 0x18
    62  	NOT    OpCode = 0x19
    63  	BYTE   OpCode = 0x1a
    64  	SHL    OpCode = 0x1b
    65  	SHR    OpCode = 0x1c
    66  	SAR    OpCode = 0x1d
    67  
    68  	KECCAK256 OpCode = 0x20
    69  )
    70  
    71  // 0x30 range - closure state.
    72  const (
    73  	ADDRESS        OpCode = 0x30
    74  	BALANCE        OpCode = 0x31
    75  	ORIGIN         OpCode = 0x32
    76  	CALLER         OpCode = 0x33
    77  	CALLVALUE      OpCode = 0x34
    78  	CALLDATALOAD   OpCode = 0x35
    79  	CALLDATASIZE   OpCode = 0x36
    80  	CALLDATACOPY   OpCode = 0x37
    81  	CODESIZE       OpCode = 0x38
    82  	CODECOPY       OpCode = 0x39
    83  	GASPRICE       OpCode = 0x3a
    84  	EXTCODESIZE    OpCode = 0x3b
    85  	EXTCODECOPY    OpCode = 0x3c
    86  	RETURNDATASIZE OpCode = 0x3d
    87  	RETURNDATACOPY OpCode = 0x3e
    88  	EXTCODEHASH    OpCode = 0x3f
    89  )
    90  
    91  // 0x40 range - block operations.
    92  const (
    93  	BLOCKHASH   OpCode = 0x40
    94  	COINBASE    OpCode = 0x41
    95  	TIMESTAMP   OpCode = 0x42
    96  	NUMBER      OpCode = 0x43
    97  	DIFFICULTY  OpCode = 0x44
    98  	RANDOM      OpCode = 0x44 // Same as DIFFICULTY
    99  	GASLIMIT    OpCode = 0x45
   100  	CHAINID     OpCode = 0x46
   101  	SELFBALANCE OpCode = 0x47
   102  	BASEFEE     OpCode = 0x48
   103  )
   104  
   105  // 0x50 range - 'storage' and execution.
   106  const (
   107  	POP      OpCode = 0x50
   108  	MLOAD    OpCode = 0x51
   109  	MSTORE   OpCode = 0x52
   110  	MSTORE8  OpCode = 0x53
   111  	SLOAD    OpCode = 0x54
   112  	SSTORE   OpCode = 0x55
   113  	JUMP     OpCode = 0x56
   114  	JUMPI    OpCode = 0x57
   115  	PC       OpCode = 0x58
   116  	MSIZE    OpCode = 0x59
   117  	GAS      OpCode = 0x5a
   118  	JUMPDEST OpCode = 0x5b
   119  )
   120  
   121  // 0x60 range - pushes.
   122  const (
   123  	PUSH1 OpCode = 0x60 + iota
   124  	PUSH2
   125  	PUSH3
   126  	PUSH4
   127  	PUSH5
   128  	PUSH6
   129  	PUSH7
   130  	PUSH8
   131  	PUSH9
   132  	PUSH10
   133  	PUSH11
   134  	PUSH12
   135  	PUSH13
   136  	PUSH14
   137  	PUSH15
   138  	PUSH16
   139  	PUSH17
   140  	PUSH18
   141  	PUSH19
   142  	PUSH20
   143  	PUSH21
   144  	PUSH22
   145  	PUSH23
   146  	PUSH24
   147  	PUSH25
   148  	PUSH26
   149  	PUSH27
   150  	PUSH28
   151  	PUSH29
   152  	PUSH30
   153  	PUSH31
   154  	PUSH32
   155  )
   156  
   157  // 0x80 range - dups.
   158  const (
   159  	DUP1 = 0x80 + iota
   160  	DUP2
   161  	DUP3
   162  	DUP4
   163  	DUP5
   164  	DUP6
   165  	DUP7
   166  	DUP8
   167  	DUP9
   168  	DUP10
   169  	DUP11
   170  	DUP12
   171  	DUP13
   172  	DUP14
   173  	DUP15
   174  	DUP16
   175  )
   176  
   177  // 0x90 range - swaps.
   178  const (
   179  	SWAP1 = 0x90 + iota
   180  	SWAP2
   181  	SWAP3
   182  	SWAP4
   183  	SWAP5
   184  	SWAP6
   185  	SWAP7
   186  	SWAP8
   187  	SWAP9
   188  	SWAP10
   189  	SWAP11
   190  	SWAP12
   191  	SWAP13
   192  	SWAP14
   193  	SWAP15
   194  	SWAP16
   195  )
   196  
   197  // 0xa0 range - logging ops.
   198  const (
   199  	LOG0 OpCode = 0xa0 + iota
   200  	LOG1
   201  	LOG2
   202  	LOG3
   203  	LOG4
   204  )
   205  
   206  // 0xf0 range - closures.
   207  const (
   208  	CREATE       OpCode = 0xf0
   209  	CALL         OpCode = 0xf1
   210  	CALLCODE     OpCode = 0xf2
   211  	RETURN       OpCode = 0xf3
   212  	DELEGATECALL OpCode = 0xf4
   213  	CREATE2      OpCode = 0xf5
   214  
   215  	STATICCALL   OpCode = 0xfa
   216  	REVERT       OpCode = 0xfd
   217  	INVALID      OpCode = 0xfe
   218  	SELFDESTRUCT OpCode = 0xff
   219  )
   220  
   221  // Since the opcodes aren't all in order we can't use a regular slice.
   222  var opCodeToString = map[OpCode]string{
   223  	// 0x0 range - arithmetic ops.
   224  	STOP:       "STOP",
   225  	ADD:        "ADD",
   226  	MUL:        "MUL",
   227  	SUB:        "SUB",
   228  	DIV:        "DIV",
   229  	SDIV:       "SDIV",
   230  	MOD:        "MOD",
   231  	SMOD:       "SMOD",
   232  	EXP:        "EXP",
   233  	NOT:        "NOT",
   234  	LT:         "LT",
   235  	GT:         "GT",
   236  	SLT:        "SLT",
   237  	SGT:        "SGT",
   238  	EQ:         "EQ",
   239  	ISZERO:     "ISZERO",
   240  	SIGNEXTEND: "SIGNEXTEND",
   241  
   242  	// 0x10 range - bit ops.
   243  	AND:    "AND",
   244  	OR:     "OR",
   245  	XOR:    "XOR",
   246  	BYTE:   "BYTE",
   247  	SHL:    "SHL",
   248  	SHR:    "SHR",
   249  	SAR:    "SAR",
   250  	ADDMOD: "ADDMOD",
   251  	MULMOD: "MULMOD",
   252  
   253  	// 0x20 range - crypto.
   254  	KECCAK256: "KECCAK256",
   255  
   256  	// 0x30 range - closure state.
   257  	ADDRESS:        "ADDRESS",
   258  	BALANCE:        "BALANCE",
   259  	ORIGIN:         "ORIGIN",
   260  	CALLER:         "CALLER",
   261  	CALLVALUE:      "CALLVALUE",
   262  	CALLDATALOAD:   "CALLDATALOAD",
   263  	CALLDATASIZE:   "CALLDATASIZE",
   264  	CALLDATACOPY:   "CALLDATACOPY",
   265  	CODESIZE:       "CODESIZE",
   266  	CODECOPY:       "CODECOPY",
   267  	GASPRICE:       "GASPRICE",
   268  	EXTCODESIZE:    "EXTCODESIZE",
   269  	EXTCODECOPY:    "EXTCODECOPY",
   270  	RETURNDATASIZE: "RETURNDATASIZE",
   271  	RETURNDATACOPY: "RETURNDATACOPY",
   272  	EXTCODEHASH:    "EXTCODEHASH",
   273  
   274  	// 0x40 range - block operations.
   275  	BLOCKHASH:   "BLOCKHASH",
   276  	COINBASE:    "COINBASE",
   277  	TIMESTAMP:   "TIMESTAMP",
   278  	NUMBER:      "NUMBER",
   279  	DIFFICULTY:  "DIFFICULTY", // TODO (MariusVanDerWijden) rename to RANDOM post merge
   280  	GASLIMIT:    "GASLIMIT",
   281  	CHAINID:     "CHAINID",
   282  	SELFBALANCE: "SELFBALANCE",
   283  	BASEFEE:     "BASEFEE",
   284  
   285  	// 0x50 range - 'storage' and execution.
   286  	POP: "POP",
   287  	//DUP:     "DUP",
   288  	//SWAP:    "SWAP",
   289  	MLOAD:    "MLOAD",
   290  	MSTORE:   "MSTORE",
   291  	MSTORE8:  "MSTORE8",
   292  	SLOAD:    "SLOAD",
   293  	SSTORE:   "SSTORE",
   294  	JUMP:     "JUMP",
   295  	JUMPI:    "JUMPI",
   296  	PC:       "PC",
   297  	MSIZE:    "MSIZE",
   298  	GAS:      "GAS",
   299  	JUMPDEST: "JUMPDEST",
   300  
   301  	// 0x60 range - push.
   302  	PUSH1:  "PUSH1",
   303  	PUSH2:  "PUSH2",
   304  	PUSH3:  "PUSH3",
   305  	PUSH4:  "PUSH4",
   306  	PUSH5:  "PUSH5",
   307  	PUSH6:  "PUSH6",
   308  	PUSH7:  "PUSH7",
   309  	PUSH8:  "PUSH8",
   310  	PUSH9:  "PUSH9",
   311  	PUSH10: "PUSH10",
   312  	PUSH11: "PUSH11",
   313  	PUSH12: "PUSH12",
   314  	PUSH13: "PUSH13",
   315  	PUSH14: "PUSH14",
   316  	PUSH15: "PUSH15",
   317  	PUSH16: "PUSH16",
   318  	PUSH17: "PUSH17",
   319  	PUSH18: "PUSH18",
   320  	PUSH19: "PUSH19",
   321  	PUSH20: "PUSH20",
   322  	PUSH21: "PUSH21",
   323  	PUSH22: "PUSH22",
   324  	PUSH23: "PUSH23",
   325  	PUSH24: "PUSH24",
   326  	PUSH25: "PUSH25",
   327  	PUSH26: "PUSH26",
   328  	PUSH27: "PUSH27",
   329  	PUSH28: "PUSH28",
   330  	PUSH29: "PUSH29",
   331  	PUSH30: "PUSH30",
   332  	PUSH31: "PUSH31",
   333  	PUSH32: "PUSH32",
   334  
   335  	DUP1:  "DUP1",
   336  	DUP2:  "DUP2",
   337  	DUP3:  "DUP3",
   338  	DUP4:  "DUP4",
   339  	DUP5:  "DUP5",
   340  	DUP6:  "DUP6",
   341  	DUP7:  "DUP7",
   342  	DUP8:  "DUP8",
   343  	DUP9:  "DUP9",
   344  	DUP10: "DUP10",
   345  	DUP11: "DUP11",
   346  	DUP12: "DUP12",
   347  	DUP13: "DUP13",
   348  	DUP14: "DUP14",
   349  	DUP15: "DUP15",
   350  	DUP16: "DUP16",
   351  
   352  	SWAP1:  "SWAP1",
   353  	SWAP2:  "SWAP2",
   354  	SWAP3:  "SWAP3",
   355  	SWAP4:  "SWAP4",
   356  	SWAP5:  "SWAP5",
   357  	SWAP6:  "SWAP6",
   358  	SWAP7:  "SWAP7",
   359  	SWAP8:  "SWAP8",
   360  	SWAP9:  "SWAP9",
   361  	SWAP10: "SWAP10",
   362  	SWAP11: "SWAP11",
   363  	SWAP12: "SWAP12",
   364  	SWAP13: "SWAP13",
   365  	SWAP14: "SWAP14",
   366  	SWAP15: "SWAP15",
   367  	SWAP16: "SWAP16",
   368  	LOG0:   "LOG0",
   369  	LOG1:   "LOG1",
   370  	LOG2:   "LOG2",
   371  	LOG3:   "LOG3",
   372  	LOG4:   "LOG4",
   373  
   374  	// 0xf0 range.
   375  	CREATE:       "CREATE",
   376  	CALL:         "CALL",
   377  	RETURN:       "RETURN",
   378  	CALLCODE:     "CALLCODE",
   379  	DELEGATECALL: "DELEGATECALL",
   380  	CREATE2:      "CREATE2",
   381  	STATICCALL:   "STATICCALL",
   382  	REVERT:       "REVERT",
   383  	INVALID:      "INVALID",
   384  	SELFDESTRUCT: "SELFDESTRUCT",
   385  }
   386  
   387  func (op OpCode) String() string {
   388  	str := opCodeToString[op]
   389  	if len(str) == 0 {
   390  		return fmt.Sprintf("opcode 0x%x not defined", int(op))
   391  	}
   392  
   393  	return str
   394  }
   395  
   396  var stringToOp = map[string]OpCode{
   397  	"STOP":           STOP,
   398  	"ADD":            ADD,
   399  	"MUL":            MUL,
   400  	"SUB":            SUB,
   401  	"DIV":            DIV,
   402  	"SDIV":           SDIV,
   403  	"MOD":            MOD,
   404  	"SMOD":           SMOD,
   405  	"EXP":            EXP,
   406  	"NOT":            NOT,
   407  	"LT":             LT,
   408  	"GT":             GT,
   409  	"SLT":            SLT,
   410  	"SGT":            SGT,
   411  	"EQ":             EQ,
   412  	"ISZERO":         ISZERO,
   413  	"SIGNEXTEND":     SIGNEXTEND,
   414  	"AND":            AND,
   415  	"OR":             OR,
   416  	"XOR":            XOR,
   417  	"BYTE":           BYTE,
   418  	"SHL":            SHL,
   419  	"SHR":            SHR,
   420  	"SAR":            SAR,
   421  	"ADDMOD":         ADDMOD,
   422  	"MULMOD":         MULMOD,
   423  	"KECCAK256":      KECCAK256,
   424  	"ADDRESS":        ADDRESS,
   425  	"BALANCE":        BALANCE,
   426  	"ORIGIN":         ORIGIN,
   427  	"CALLER":         CALLER,
   428  	"CALLVALUE":      CALLVALUE,
   429  	"CALLDATALOAD":   CALLDATALOAD,
   430  	"CALLDATASIZE":   CALLDATASIZE,
   431  	"CALLDATACOPY":   CALLDATACOPY,
   432  	"CHAINID":        CHAINID,
   433  	"BASEFEE":        BASEFEE,
   434  	"DELEGATECALL":   DELEGATECALL,
   435  	"STATICCALL":     STATICCALL,
   436  	"CODESIZE":       CODESIZE,
   437  	"CODECOPY":       CODECOPY,
   438  	"GASPRICE":       GASPRICE,
   439  	"EXTCODESIZE":    EXTCODESIZE,
   440  	"EXTCODECOPY":    EXTCODECOPY,
   441  	"RETURNDATASIZE": RETURNDATASIZE,
   442  	"RETURNDATACOPY": RETURNDATACOPY,
   443  	"EXTCODEHASH":    EXTCODEHASH,
   444  	"BLOCKHASH":      BLOCKHASH,
   445  	"COINBASE":       COINBASE,
   446  	"TIMESTAMP":      TIMESTAMP,
   447  	"NUMBER":         NUMBER,
   448  	"DIFFICULTY":     DIFFICULTY,
   449  	"GASLIMIT":       GASLIMIT,
   450  	"SELFBALANCE":    SELFBALANCE,
   451  	"POP":            POP,
   452  	"MLOAD":          MLOAD,
   453  	"MSTORE":         MSTORE,
   454  	"MSTORE8":        MSTORE8,
   455  	"SLOAD":          SLOAD,
   456  	"SSTORE":         SSTORE,
   457  	"JUMP":           JUMP,
   458  	"JUMPI":          JUMPI,
   459  	"PC":             PC,
   460  	"MSIZE":          MSIZE,
   461  	"GAS":            GAS,
   462  	"JUMPDEST":       JUMPDEST,
   463  	"PUSH1":          PUSH1,
   464  	"PUSH2":          PUSH2,
   465  	"PUSH3":          PUSH3,
   466  	"PUSH4":          PUSH4,
   467  	"PUSH5":          PUSH5,
   468  	"PUSH6":          PUSH6,
   469  	"PUSH7":          PUSH7,
   470  	"PUSH8":          PUSH8,
   471  	"PUSH9":          PUSH9,
   472  	"PUSH10":         PUSH10,
   473  	"PUSH11":         PUSH11,
   474  	"PUSH12":         PUSH12,
   475  	"PUSH13":         PUSH13,
   476  	"PUSH14":         PUSH14,
   477  	"PUSH15":         PUSH15,
   478  	"PUSH16":         PUSH16,
   479  	"PUSH17":         PUSH17,
   480  	"PUSH18":         PUSH18,
   481  	"PUSH19":         PUSH19,
   482  	"PUSH20":         PUSH20,
   483  	"PUSH21":         PUSH21,
   484  	"PUSH22":         PUSH22,
   485  	"PUSH23":         PUSH23,
   486  	"PUSH24":         PUSH24,
   487  	"PUSH25":         PUSH25,
   488  	"PUSH26":         PUSH26,
   489  	"PUSH27":         PUSH27,
   490  	"PUSH28":         PUSH28,
   491  	"PUSH29":         PUSH29,
   492  	"PUSH30":         PUSH30,
   493  	"PUSH31":         PUSH31,
   494  	"PUSH32":         PUSH32,
   495  	"DUP1":           DUP1,
   496  	"DUP2":           DUP2,
   497  	"DUP3":           DUP3,
   498  	"DUP4":           DUP4,
   499  	"DUP5":           DUP5,
   500  	"DUP6":           DUP6,
   501  	"DUP7":           DUP7,
   502  	"DUP8":           DUP8,
   503  	"DUP9":           DUP9,
   504  	"DUP10":          DUP10,
   505  	"DUP11":          DUP11,
   506  	"DUP12":          DUP12,
   507  	"DUP13":          DUP13,
   508  	"DUP14":          DUP14,
   509  	"DUP15":          DUP15,
   510  	"DUP16":          DUP16,
   511  	"SWAP1":          SWAP1,
   512  	"SWAP2":          SWAP2,
   513  	"SWAP3":          SWAP3,
   514  	"SWAP4":          SWAP4,
   515  	"SWAP5":          SWAP5,
   516  	"SWAP6":          SWAP6,
   517  	"SWAP7":          SWAP7,
   518  	"SWAP8":          SWAP8,
   519  	"SWAP9":          SWAP9,
   520  	"SWAP10":         SWAP10,
   521  	"SWAP11":         SWAP11,
   522  	"SWAP12":         SWAP12,
   523  	"SWAP13":         SWAP13,
   524  	"SWAP14":         SWAP14,
   525  	"SWAP15":         SWAP15,
   526  	"SWAP16":         SWAP16,
   527  	"LOG0":           LOG0,
   528  	"LOG1":           LOG1,
   529  	"LOG2":           LOG2,
   530  	"LOG3":           LOG3,
   531  	"LOG4":           LOG4,
   532  	"CREATE":         CREATE,
   533  	"CREATE2":        CREATE2,
   534  	"CALL":           CALL,
   535  	"RETURN":         RETURN,
   536  	"CALLCODE":       CALLCODE,
   537  	"REVERT":         REVERT,
   538  	"INVALID":        INVALID,
   539  	"SELFDESTRUCT":   SELFDESTRUCT,
   540  }
   541  
   542  // StringToOp finds the opcode whose name is stored in `str`.
   543  func StringToOp(str string) OpCode {
   544  	return stringToOp[str]
   545  }