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