github.com/ethereum/go-ethereum@v1.14.4-0.20240516095835-473ee8fc07a3/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 PUSH0 <= 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  	BLOBHASH    OpCode = 0x49
   104  	BLOBBASEFEE OpCode = 0x4a
   105  )
   106  
   107  // 0x50 range - 'storage' and execution.
   108  const (
   109  	POP      OpCode = 0x50
   110  	MLOAD    OpCode = 0x51
   111  	MSTORE   OpCode = 0x52
   112  	MSTORE8  OpCode = 0x53
   113  	SLOAD    OpCode = 0x54
   114  	SSTORE   OpCode = 0x55
   115  	JUMP     OpCode = 0x56
   116  	JUMPI    OpCode = 0x57
   117  	PC       OpCode = 0x58
   118  	MSIZE    OpCode = 0x59
   119  	GAS      OpCode = 0x5a
   120  	JUMPDEST OpCode = 0x5b
   121  	TLOAD    OpCode = 0x5c
   122  	TSTORE   OpCode = 0x5d
   123  	MCOPY    OpCode = 0x5e
   124  	PUSH0    OpCode = 0x5f
   125  )
   126  
   127  // 0x60 range - pushes.
   128  const (
   129  	PUSH1 OpCode = 0x60 + iota
   130  	PUSH2
   131  	PUSH3
   132  	PUSH4
   133  	PUSH5
   134  	PUSH6
   135  	PUSH7
   136  	PUSH8
   137  	PUSH9
   138  	PUSH10
   139  	PUSH11
   140  	PUSH12
   141  	PUSH13
   142  	PUSH14
   143  	PUSH15
   144  	PUSH16
   145  	PUSH17
   146  	PUSH18
   147  	PUSH19
   148  	PUSH20
   149  	PUSH21
   150  	PUSH22
   151  	PUSH23
   152  	PUSH24
   153  	PUSH25
   154  	PUSH26
   155  	PUSH27
   156  	PUSH28
   157  	PUSH29
   158  	PUSH30
   159  	PUSH31
   160  	PUSH32
   161  )
   162  
   163  // 0x80 range - dups.
   164  const (
   165  	DUP1 = 0x80 + iota
   166  	DUP2
   167  	DUP3
   168  	DUP4
   169  	DUP5
   170  	DUP6
   171  	DUP7
   172  	DUP8
   173  	DUP9
   174  	DUP10
   175  	DUP11
   176  	DUP12
   177  	DUP13
   178  	DUP14
   179  	DUP15
   180  	DUP16
   181  )
   182  
   183  // 0x90 range - swaps.
   184  const (
   185  	SWAP1 = 0x90 + iota
   186  	SWAP2
   187  	SWAP3
   188  	SWAP4
   189  	SWAP5
   190  	SWAP6
   191  	SWAP7
   192  	SWAP8
   193  	SWAP9
   194  	SWAP10
   195  	SWAP11
   196  	SWAP12
   197  	SWAP13
   198  	SWAP14
   199  	SWAP15
   200  	SWAP16
   201  )
   202  
   203  // 0xa0 range - logging ops.
   204  const (
   205  	LOG0 OpCode = 0xa0 + iota
   206  	LOG1
   207  	LOG2
   208  	LOG3
   209  	LOG4
   210  )
   211  
   212  // 0xf0 range - closures.
   213  const (
   214  	CREATE       OpCode = 0xf0
   215  	CALL         OpCode = 0xf1
   216  	CALLCODE     OpCode = 0xf2
   217  	RETURN       OpCode = 0xf3
   218  	DELEGATECALL OpCode = 0xf4
   219  	CREATE2      OpCode = 0xf5
   220  
   221  	STATICCALL   OpCode = 0xfa
   222  	REVERT       OpCode = 0xfd
   223  	INVALID      OpCode = 0xfe
   224  	SELFDESTRUCT OpCode = 0xff
   225  )
   226  
   227  var opCodeToString = [256]string{
   228  	// 0x0 range - arithmetic ops.
   229  	STOP:       "STOP",
   230  	ADD:        "ADD",
   231  	MUL:        "MUL",
   232  	SUB:        "SUB",
   233  	DIV:        "DIV",
   234  	SDIV:       "SDIV",
   235  	MOD:        "MOD",
   236  	SMOD:       "SMOD",
   237  	EXP:        "EXP",
   238  	NOT:        "NOT",
   239  	LT:         "LT",
   240  	GT:         "GT",
   241  	SLT:        "SLT",
   242  	SGT:        "SGT",
   243  	EQ:         "EQ",
   244  	ISZERO:     "ISZERO",
   245  	SIGNEXTEND: "SIGNEXTEND",
   246  
   247  	// 0x10 range - bit ops.
   248  	AND:    "AND",
   249  	OR:     "OR",
   250  	XOR:    "XOR",
   251  	BYTE:   "BYTE",
   252  	SHL:    "SHL",
   253  	SHR:    "SHR",
   254  	SAR:    "SAR",
   255  	ADDMOD: "ADDMOD",
   256  	MULMOD: "MULMOD",
   257  
   258  	// 0x20 range - crypto.
   259  	KECCAK256: "KECCAK256",
   260  
   261  	// 0x30 range - closure state.
   262  	ADDRESS:        "ADDRESS",
   263  	BALANCE:        "BALANCE",
   264  	ORIGIN:         "ORIGIN",
   265  	CALLER:         "CALLER",
   266  	CALLVALUE:      "CALLVALUE",
   267  	CALLDATALOAD:   "CALLDATALOAD",
   268  	CALLDATASIZE:   "CALLDATASIZE",
   269  	CALLDATACOPY:   "CALLDATACOPY",
   270  	CODESIZE:       "CODESIZE",
   271  	CODECOPY:       "CODECOPY",
   272  	GASPRICE:       "GASPRICE",
   273  	EXTCODESIZE:    "EXTCODESIZE",
   274  	EXTCODECOPY:    "EXTCODECOPY",
   275  	RETURNDATASIZE: "RETURNDATASIZE",
   276  	RETURNDATACOPY: "RETURNDATACOPY",
   277  	EXTCODEHASH:    "EXTCODEHASH",
   278  
   279  	// 0x40 range - block operations.
   280  	BLOCKHASH:   "BLOCKHASH",
   281  	COINBASE:    "COINBASE",
   282  	TIMESTAMP:   "TIMESTAMP",
   283  	NUMBER:      "NUMBER",
   284  	DIFFICULTY:  "DIFFICULTY", // TODO (MariusVanDerWijden) rename to PREVRANDAO post merge
   285  	GASLIMIT:    "GASLIMIT",
   286  	CHAINID:     "CHAINID",
   287  	SELFBALANCE: "SELFBALANCE",
   288  	BASEFEE:     "BASEFEE",
   289  	BLOBHASH:    "BLOBHASH",
   290  	BLOBBASEFEE: "BLOBBASEFEE",
   291  
   292  	// 0x50 range - 'storage' and execution.
   293  	POP:      "POP",
   294  	MLOAD:    "MLOAD",
   295  	MSTORE:   "MSTORE",
   296  	MSTORE8:  "MSTORE8",
   297  	SLOAD:    "SLOAD",
   298  	SSTORE:   "SSTORE",
   299  	JUMP:     "JUMP",
   300  	JUMPI:    "JUMPI",
   301  	PC:       "PC",
   302  	MSIZE:    "MSIZE",
   303  	GAS:      "GAS",
   304  	JUMPDEST: "JUMPDEST",
   305  	TLOAD:    "TLOAD",
   306  	TSTORE:   "TSTORE",
   307  	MCOPY:    "MCOPY",
   308  	PUSH0:    "PUSH0",
   309  
   310  	// 0x60 range - pushes.
   311  	PUSH1:  "PUSH1",
   312  	PUSH2:  "PUSH2",
   313  	PUSH3:  "PUSH3",
   314  	PUSH4:  "PUSH4",
   315  	PUSH5:  "PUSH5",
   316  	PUSH6:  "PUSH6",
   317  	PUSH7:  "PUSH7",
   318  	PUSH8:  "PUSH8",
   319  	PUSH9:  "PUSH9",
   320  	PUSH10: "PUSH10",
   321  	PUSH11: "PUSH11",
   322  	PUSH12: "PUSH12",
   323  	PUSH13: "PUSH13",
   324  	PUSH14: "PUSH14",
   325  	PUSH15: "PUSH15",
   326  	PUSH16: "PUSH16",
   327  	PUSH17: "PUSH17",
   328  	PUSH18: "PUSH18",
   329  	PUSH19: "PUSH19",
   330  	PUSH20: "PUSH20",
   331  	PUSH21: "PUSH21",
   332  	PUSH22: "PUSH22",
   333  	PUSH23: "PUSH23",
   334  	PUSH24: "PUSH24",
   335  	PUSH25: "PUSH25",
   336  	PUSH26: "PUSH26",
   337  	PUSH27: "PUSH27",
   338  	PUSH28: "PUSH28",
   339  	PUSH29: "PUSH29",
   340  	PUSH30: "PUSH30",
   341  	PUSH31: "PUSH31",
   342  	PUSH32: "PUSH32",
   343  
   344  	// 0x80 - dups.
   345  	DUP1:  "DUP1",
   346  	DUP2:  "DUP2",
   347  	DUP3:  "DUP3",
   348  	DUP4:  "DUP4",
   349  	DUP5:  "DUP5",
   350  	DUP6:  "DUP6",
   351  	DUP7:  "DUP7",
   352  	DUP8:  "DUP8",
   353  	DUP9:  "DUP9",
   354  	DUP10: "DUP10",
   355  	DUP11: "DUP11",
   356  	DUP12: "DUP12",
   357  	DUP13: "DUP13",
   358  	DUP14: "DUP14",
   359  	DUP15: "DUP15",
   360  	DUP16: "DUP16",
   361  
   362  	// 0x90 - swaps.
   363  	SWAP1:  "SWAP1",
   364  	SWAP2:  "SWAP2",
   365  	SWAP3:  "SWAP3",
   366  	SWAP4:  "SWAP4",
   367  	SWAP5:  "SWAP5",
   368  	SWAP6:  "SWAP6",
   369  	SWAP7:  "SWAP7",
   370  	SWAP8:  "SWAP8",
   371  	SWAP9:  "SWAP9",
   372  	SWAP10: "SWAP10",
   373  	SWAP11: "SWAP11",
   374  	SWAP12: "SWAP12",
   375  	SWAP13: "SWAP13",
   376  	SWAP14: "SWAP14",
   377  	SWAP15: "SWAP15",
   378  	SWAP16: "SWAP16",
   379  
   380  	// 0xa0 range - logging ops.
   381  	LOG0: "LOG0",
   382  	LOG1: "LOG1",
   383  	LOG2: "LOG2",
   384  	LOG3: "LOG3",
   385  	LOG4: "LOG4",
   386  
   387  	// 0xf0 range - closures.
   388  	CREATE:       "CREATE",
   389  	CALL:         "CALL",
   390  	RETURN:       "RETURN",
   391  	CALLCODE:     "CALLCODE",
   392  	DELEGATECALL: "DELEGATECALL",
   393  	CREATE2:      "CREATE2",
   394  	STATICCALL:   "STATICCALL",
   395  	REVERT:       "REVERT",
   396  	INVALID:      "INVALID",
   397  	SELFDESTRUCT: "SELFDESTRUCT",
   398  }
   399  
   400  func (op OpCode) String() string {
   401  	if s := opCodeToString[op]; s != "" {
   402  		return s
   403  	}
   404  	return fmt.Sprintf("opcode %#x not defined", int(op))
   405  }
   406  
   407  var stringToOp = map[string]OpCode{
   408  	"STOP":           STOP,
   409  	"ADD":            ADD,
   410  	"MUL":            MUL,
   411  	"SUB":            SUB,
   412  	"DIV":            DIV,
   413  	"SDIV":           SDIV,
   414  	"MOD":            MOD,
   415  	"SMOD":           SMOD,
   416  	"EXP":            EXP,
   417  	"NOT":            NOT,
   418  	"LT":             LT,
   419  	"GT":             GT,
   420  	"SLT":            SLT,
   421  	"SGT":            SGT,
   422  	"EQ":             EQ,
   423  	"ISZERO":         ISZERO,
   424  	"SIGNEXTEND":     SIGNEXTEND,
   425  	"AND":            AND,
   426  	"OR":             OR,
   427  	"XOR":            XOR,
   428  	"BYTE":           BYTE,
   429  	"SHL":            SHL,
   430  	"SHR":            SHR,
   431  	"SAR":            SAR,
   432  	"ADDMOD":         ADDMOD,
   433  	"MULMOD":         MULMOD,
   434  	"KECCAK256":      KECCAK256,
   435  	"ADDRESS":        ADDRESS,
   436  	"BALANCE":        BALANCE,
   437  	"ORIGIN":         ORIGIN,
   438  	"CALLER":         CALLER,
   439  	"CALLVALUE":      CALLVALUE,
   440  	"CALLDATALOAD":   CALLDATALOAD,
   441  	"CALLDATASIZE":   CALLDATASIZE,
   442  	"CALLDATACOPY":   CALLDATACOPY,
   443  	"CHAINID":        CHAINID,
   444  	"BASEFEE":        BASEFEE,
   445  	"BLOBHASH":       BLOBHASH,
   446  	"BLOBBASEFEE":    BLOBBASEFEE,
   447  	"DELEGATECALL":   DELEGATECALL,
   448  	"STATICCALL":     STATICCALL,
   449  	"CODESIZE":       CODESIZE,
   450  	"CODECOPY":       CODECOPY,
   451  	"GASPRICE":       GASPRICE,
   452  	"EXTCODESIZE":    EXTCODESIZE,
   453  	"EXTCODECOPY":    EXTCODECOPY,
   454  	"RETURNDATASIZE": RETURNDATASIZE,
   455  	"RETURNDATACOPY": RETURNDATACOPY,
   456  	"EXTCODEHASH":    EXTCODEHASH,
   457  	"BLOCKHASH":      BLOCKHASH,
   458  	"COINBASE":       COINBASE,
   459  	"TIMESTAMP":      TIMESTAMP,
   460  	"NUMBER":         NUMBER,
   461  	"DIFFICULTY":     DIFFICULTY,
   462  	"GASLIMIT":       GASLIMIT,
   463  	"SELFBALANCE":    SELFBALANCE,
   464  	"POP":            POP,
   465  	"MLOAD":          MLOAD,
   466  	"MSTORE":         MSTORE,
   467  	"MSTORE8":        MSTORE8,
   468  	"SLOAD":          SLOAD,
   469  	"SSTORE":         SSTORE,
   470  	"JUMP":           JUMP,
   471  	"JUMPI":          JUMPI,
   472  	"PC":             PC,
   473  	"MSIZE":          MSIZE,
   474  	"GAS":            GAS,
   475  	"JUMPDEST":       JUMPDEST,
   476  	"TLOAD":          TLOAD,
   477  	"TSTORE":         TSTORE,
   478  	"MCOPY":          MCOPY,
   479  	"PUSH0":          PUSH0,
   480  	"PUSH1":          PUSH1,
   481  	"PUSH2":          PUSH2,
   482  	"PUSH3":          PUSH3,
   483  	"PUSH4":          PUSH4,
   484  	"PUSH5":          PUSH5,
   485  	"PUSH6":          PUSH6,
   486  	"PUSH7":          PUSH7,
   487  	"PUSH8":          PUSH8,
   488  	"PUSH9":          PUSH9,
   489  	"PUSH10":         PUSH10,
   490  	"PUSH11":         PUSH11,
   491  	"PUSH12":         PUSH12,
   492  	"PUSH13":         PUSH13,
   493  	"PUSH14":         PUSH14,
   494  	"PUSH15":         PUSH15,
   495  	"PUSH16":         PUSH16,
   496  	"PUSH17":         PUSH17,
   497  	"PUSH18":         PUSH18,
   498  	"PUSH19":         PUSH19,
   499  	"PUSH20":         PUSH20,
   500  	"PUSH21":         PUSH21,
   501  	"PUSH22":         PUSH22,
   502  	"PUSH23":         PUSH23,
   503  	"PUSH24":         PUSH24,
   504  	"PUSH25":         PUSH25,
   505  	"PUSH26":         PUSH26,
   506  	"PUSH27":         PUSH27,
   507  	"PUSH28":         PUSH28,
   508  	"PUSH29":         PUSH29,
   509  	"PUSH30":         PUSH30,
   510  	"PUSH31":         PUSH31,
   511  	"PUSH32":         PUSH32,
   512  	"DUP1":           DUP1,
   513  	"DUP2":           DUP2,
   514  	"DUP3":           DUP3,
   515  	"DUP4":           DUP4,
   516  	"DUP5":           DUP5,
   517  	"DUP6":           DUP6,
   518  	"DUP7":           DUP7,
   519  	"DUP8":           DUP8,
   520  	"DUP9":           DUP9,
   521  	"DUP10":          DUP10,
   522  	"DUP11":          DUP11,
   523  	"DUP12":          DUP12,
   524  	"DUP13":          DUP13,
   525  	"DUP14":          DUP14,
   526  	"DUP15":          DUP15,
   527  	"DUP16":          DUP16,
   528  	"SWAP1":          SWAP1,
   529  	"SWAP2":          SWAP2,
   530  	"SWAP3":          SWAP3,
   531  	"SWAP4":          SWAP4,
   532  	"SWAP5":          SWAP5,
   533  	"SWAP6":          SWAP6,
   534  	"SWAP7":          SWAP7,
   535  	"SWAP8":          SWAP8,
   536  	"SWAP9":          SWAP9,
   537  	"SWAP10":         SWAP10,
   538  	"SWAP11":         SWAP11,
   539  	"SWAP12":         SWAP12,
   540  	"SWAP13":         SWAP13,
   541  	"SWAP14":         SWAP14,
   542  	"SWAP15":         SWAP15,
   543  	"SWAP16":         SWAP16,
   544  	"LOG0":           LOG0,
   545  	"LOG1":           LOG1,
   546  	"LOG2":           LOG2,
   547  	"LOG3":           LOG3,
   548  	"LOG4":           LOG4,
   549  	"CREATE":         CREATE,
   550  	"CREATE2":        CREATE2,
   551  	"CALL":           CALL,
   552  	"RETURN":         RETURN,
   553  	"CALLCODE":       CALLCODE,
   554  	"REVERT":         REVERT,
   555  	"INVALID":        INVALID,
   556  	"SELFDESTRUCT":   SELFDESTRUCT,
   557  }
   558  
   559  // StringToOp finds the opcode whose name is stored in `str`.
   560  func StringToOp(str string) OpCode {
   561  	return stringToOp[str]
   562  }