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