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