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