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