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