github.com/MetalBlockchain/subnet-evm@v0.4.9/core/vm/opcodes.go (about)

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