github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/core/vm/opcodes.go (about)

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