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