github.com/dim4egster/coreth@v0.10.2/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  const (
   220  	BALANCEMC = 0xcd
   221  	CALLEX    = 0xcf
   222  )
   223  
   224  // 0xf0 range - closures.
   225  const (
   226  	CREATE       OpCode = 0xf0
   227  	CALL         OpCode = 0xf1
   228  	CALLCODE     OpCode = 0xf2
   229  	RETURN       OpCode = 0xf3
   230  	DELEGATECALL OpCode = 0xf4
   231  	CREATE2      OpCode = 0xf5
   232  
   233  	STATICCALL   OpCode = 0xfa
   234  	REVERT       OpCode = 0xfd
   235  	INVALID      OpCode = 0xfe
   236  	SELFDESTRUCT OpCode = 0xff
   237  )
   238  
   239  // Since the opcodes aren't all in order we can't use a regular slice.
   240  var opCodeToString = map[OpCode]string{
   241  	// 0x0 range - arithmetic ops.
   242  	STOP:       "STOP",
   243  	ADD:        "ADD",
   244  	MUL:        "MUL",
   245  	SUB:        "SUB",
   246  	DIV:        "DIV",
   247  	SDIV:       "SDIV",
   248  	MOD:        "MOD",
   249  	SMOD:       "SMOD",
   250  	EXP:        "EXP",
   251  	NOT:        "NOT",
   252  	LT:         "LT",
   253  	GT:         "GT",
   254  	SLT:        "SLT",
   255  	SGT:        "SGT",
   256  	EQ:         "EQ",
   257  	ISZERO:     "ISZERO",
   258  	SIGNEXTEND: "SIGNEXTEND",
   259  
   260  	// 0x10 range - bit ops.
   261  	AND:    "AND",
   262  	OR:     "OR",
   263  	XOR:    "XOR",
   264  	BYTE:   "BYTE",
   265  	SHL:    "SHL",
   266  	SHR:    "SHR",
   267  	SAR:    "SAR",
   268  	ADDMOD: "ADDMOD",
   269  	MULMOD: "MULMOD",
   270  
   271  	// 0x20 range - crypto.
   272  	KECCAK256: "KECCAK256",
   273  
   274  	// 0x30 range - closure state.
   275  	ADDRESS:        "ADDRESS",
   276  	BALANCE:        "BALANCE",
   277  	BALANCEMC:      "BALANCEMC",
   278  	ORIGIN:         "ORIGIN",
   279  	CALLER:         "CALLER",
   280  	CALLVALUE:      "CALLVALUE",
   281  	CALLDATALOAD:   "CALLDATALOAD",
   282  	CALLDATASIZE:   "CALLDATASIZE",
   283  	CALLDATACOPY:   "CALLDATACOPY",
   284  	CODESIZE:       "CODESIZE",
   285  	CODECOPY:       "CODECOPY",
   286  	GASPRICE:       "GASPRICE",
   287  	EXTCODESIZE:    "EXTCODESIZE",
   288  	EXTCODECOPY:    "EXTCODECOPY",
   289  	RETURNDATASIZE: "RETURNDATASIZE",
   290  	RETURNDATACOPY: "RETURNDATACOPY",
   291  	EXTCODEHASH:    "EXTCODEHASH",
   292  
   293  	// 0x40 range - block operations.
   294  	BLOCKHASH:   "BLOCKHASH",
   295  	COINBASE:    "COINBASE",
   296  	TIMESTAMP:   "TIMESTAMP",
   297  	NUMBER:      "NUMBER",
   298  	DIFFICULTY:  "DIFFICULTY",
   299  	GASLIMIT:    "GASLIMIT",
   300  	CHAINID:     "CHAINID",
   301  	SELFBALANCE: "SELFBALANCE",
   302  	BASEFEE:     "BASEFEE",
   303  
   304  	// 0x50 range - 'storage' and execution.
   305  	POP: "POP",
   306  	//DUP:     "DUP",
   307  	//SWAP:    "SWAP",
   308  	MLOAD:    "MLOAD",
   309  	MSTORE:   "MSTORE",
   310  	MSTORE8:  "MSTORE8",
   311  	SLOAD:    "SLOAD",
   312  	SSTORE:   "SSTORE",
   313  	JUMP:     "JUMP",
   314  	JUMPI:    "JUMPI",
   315  	PC:       "PC",
   316  	MSIZE:    "MSIZE",
   317  	GAS:      "GAS",
   318  	JUMPDEST: "JUMPDEST",
   319  	PUSH0:    "PUSH0",
   320  
   321  	// 0x60 range - push.
   322  	PUSH1:  "PUSH1",
   323  	PUSH2:  "PUSH2",
   324  	PUSH3:  "PUSH3",
   325  	PUSH4:  "PUSH4",
   326  	PUSH5:  "PUSH5",
   327  	PUSH6:  "PUSH6",
   328  	PUSH7:  "PUSH7",
   329  	PUSH8:  "PUSH8",
   330  	PUSH9:  "PUSH9",
   331  	PUSH10: "PUSH10",
   332  	PUSH11: "PUSH11",
   333  	PUSH12: "PUSH12",
   334  	PUSH13: "PUSH13",
   335  	PUSH14: "PUSH14",
   336  	PUSH15: "PUSH15",
   337  	PUSH16: "PUSH16",
   338  	PUSH17: "PUSH17",
   339  	PUSH18: "PUSH18",
   340  	PUSH19: "PUSH19",
   341  	PUSH20: "PUSH20",
   342  	PUSH21: "PUSH21",
   343  	PUSH22: "PUSH22",
   344  	PUSH23: "PUSH23",
   345  	PUSH24: "PUSH24",
   346  	PUSH25: "PUSH25",
   347  	PUSH26: "PUSH26",
   348  	PUSH27: "PUSH27",
   349  	PUSH28: "PUSH28",
   350  	PUSH29: "PUSH29",
   351  	PUSH30: "PUSH30",
   352  	PUSH31: "PUSH31",
   353  	PUSH32: "PUSH32",
   354  
   355  	DUP1:  "DUP1",
   356  	DUP2:  "DUP2",
   357  	DUP3:  "DUP3",
   358  	DUP4:  "DUP4",
   359  	DUP5:  "DUP5",
   360  	DUP6:  "DUP6",
   361  	DUP7:  "DUP7",
   362  	DUP8:  "DUP8",
   363  	DUP9:  "DUP9",
   364  	DUP10: "DUP10",
   365  	DUP11: "DUP11",
   366  	DUP12: "DUP12",
   367  	DUP13: "DUP13",
   368  	DUP14: "DUP14",
   369  	DUP15: "DUP15",
   370  	DUP16: "DUP16",
   371  
   372  	SWAP1:  "SWAP1",
   373  	SWAP2:  "SWAP2",
   374  	SWAP3:  "SWAP3",
   375  	SWAP4:  "SWAP4",
   376  	SWAP5:  "SWAP5",
   377  	SWAP6:  "SWAP6",
   378  	SWAP7:  "SWAP7",
   379  	SWAP8:  "SWAP8",
   380  	SWAP9:  "SWAP9",
   381  	SWAP10: "SWAP10",
   382  	SWAP11: "SWAP11",
   383  	SWAP12: "SWAP12",
   384  	SWAP13: "SWAP13",
   385  	SWAP14: "SWAP14",
   386  	SWAP15: "SWAP15",
   387  	SWAP16: "SWAP16",
   388  	LOG0:   "LOG0",
   389  	LOG1:   "LOG1",
   390  	LOG2:   "LOG2",
   391  	LOG3:   "LOG3",
   392  	LOG4:   "LOG4",
   393  
   394  	// 0xf0 range.
   395  	CREATE:       "CREATE",
   396  	CALL:         "CALL",
   397  	CALLEX:       "CALLEX",
   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  	"BALANCEMC":      BALANCEMC,
   448  	"ORIGIN":         ORIGIN,
   449  	"CALLER":         CALLER,
   450  	"CALLVALUE":      CALLVALUE,
   451  	"CALLDATALOAD":   CALLDATALOAD,
   452  	"CALLDATASIZE":   CALLDATASIZE,
   453  	"CALLDATACOPY":   CALLDATACOPY,
   454  	"CHAINID":        CHAINID,
   455  	"BASEFEE":        BASEFEE,
   456  	"DELEGATECALL":   DELEGATECALL,
   457  	"STATICCALL":     STATICCALL,
   458  	"CODESIZE":       CODESIZE,
   459  	"CODECOPY":       CODECOPY,
   460  	"GASPRICE":       GASPRICE,
   461  	"EXTCODESIZE":    EXTCODESIZE,
   462  	"EXTCODECOPY":    EXTCODECOPY,
   463  	"RETURNDATASIZE": RETURNDATASIZE,
   464  	"RETURNDATACOPY": RETURNDATACOPY,
   465  	"EXTCODEHASH":    EXTCODEHASH,
   466  	"BLOCKHASH":      BLOCKHASH,
   467  	"COINBASE":       COINBASE,
   468  	"TIMESTAMP":      TIMESTAMP,
   469  	"NUMBER":         NUMBER,
   470  	"DIFFICULTY":     DIFFICULTY,
   471  	"GASLIMIT":       GASLIMIT,
   472  	"SELFBALANCE":    SELFBALANCE,
   473  	"POP":            POP,
   474  	"MLOAD":          MLOAD,
   475  	"MSTORE":         MSTORE,
   476  	"MSTORE8":        MSTORE8,
   477  	"SLOAD":          SLOAD,
   478  	"SSTORE":         SSTORE,
   479  	"JUMP":           JUMP,
   480  	"JUMPI":          JUMPI,
   481  	"PC":             PC,
   482  	"MSIZE":          MSIZE,
   483  	"GAS":            GAS,
   484  	"JUMPDEST":       JUMPDEST,
   485  	"PUSH0":          PUSH0,
   486  	"PUSH1":          PUSH1,
   487  	"PUSH2":          PUSH2,
   488  	"PUSH3":          PUSH3,
   489  	"PUSH4":          PUSH4,
   490  	"PUSH5":          PUSH5,
   491  	"PUSH6":          PUSH6,
   492  	"PUSH7":          PUSH7,
   493  	"PUSH8":          PUSH8,
   494  	"PUSH9":          PUSH9,
   495  	"PUSH10":         PUSH10,
   496  	"PUSH11":         PUSH11,
   497  	"PUSH12":         PUSH12,
   498  	"PUSH13":         PUSH13,
   499  	"PUSH14":         PUSH14,
   500  	"PUSH15":         PUSH15,
   501  	"PUSH16":         PUSH16,
   502  	"PUSH17":         PUSH17,
   503  	"PUSH18":         PUSH18,
   504  	"PUSH19":         PUSH19,
   505  	"PUSH20":         PUSH20,
   506  	"PUSH21":         PUSH21,
   507  	"PUSH22":         PUSH22,
   508  	"PUSH23":         PUSH23,
   509  	"PUSH24":         PUSH24,
   510  	"PUSH25":         PUSH25,
   511  	"PUSH26":         PUSH26,
   512  	"PUSH27":         PUSH27,
   513  	"PUSH28":         PUSH28,
   514  	"PUSH29":         PUSH29,
   515  	"PUSH30":         PUSH30,
   516  	"PUSH31":         PUSH31,
   517  	"PUSH32":         PUSH32,
   518  	"DUP1":           DUP1,
   519  	"DUP2":           DUP2,
   520  	"DUP3":           DUP3,
   521  	"DUP4":           DUP4,
   522  	"DUP5":           DUP5,
   523  	"DUP6":           DUP6,
   524  	"DUP7":           DUP7,
   525  	"DUP8":           DUP8,
   526  	"DUP9":           DUP9,
   527  	"DUP10":          DUP10,
   528  	"DUP11":          DUP11,
   529  	"DUP12":          DUP12,
   530  	"DUP13":          DUP13,
   531  	"DUP14":          DUP14,
   532  	"DUP15":          DUP15,
   533  	"DUP16":          DUP16,
   534  	"SWAP1":          SWAP1,
   535  	"SWAP2":          SWAP2,
   536  	"SWAP3":          SWAP3,
   537  	"SWAP4":          SWAP4,
   538  	"SWAP5":          SWAP5,
   539  	"SWAP6":          SWAP6,
   540  	"SWAP7":          SWAP7,
   541  	"SWAP8":          SWAP8,
   542  	"SWAP9":          SWAP9,
   543  	"SWAP10":         SWAP10,
   544  	"SWAP11":         SWAP11,
   545  	"SWAP12":         SWAP12,
   546  	"SWAP13":         SWAP13,
   547  	"SWAP14":         SWAP14,
   548  	"SWAP15":         SWAP15,
   549  	"SWAP16":         SWAP16,
   550  	"LOG0":           LOG0,
   551  	"LOG1":           LOG1,
   552  	"LOG2":           LOG2,
   553  	"LOG3":           LOG3,
   554  	"LOG4":           LOG4,
   555  	"CREATE":         CREATE,
   556  	"CREATE2":        CREATE2,
   557  	"CALL":           CALL,
   558  	"CALLEX":         CALLEX,
   559  	"RETURN":         RETURN,
   560  	"CALLCODE":       CALLCODE,
   561  	"REVERT":         REVERT,
   562  	"INVALID":        INVALID,
   563  	"SELFDESTRUCT":   SELFDESTRUCT,
   564  }
   565  
   566  // StringToOp finds the opcode whose name is stored in `str`.
   567  func StringToOp(str string) OpCode {
   568  	return stringToOp[str]
   569  }