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