github.com/klaytn/klaytn@v1.10.2/blockchain/vm/opcodes.go (about)

     1  // Modifications Copyright 2018 The klaytn Authors
     2  // Copyright 2015 The go-ethereum Authors
     3  // This file is part of the go-ethereum library.
     4  //
     5  // The go-ethereum library is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU Lesser General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  //
    10  // The go-ethereum library is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  // GNU Lesser General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU Lesser General Public License
    16  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    17  //
    18  // This file is derived from core/vm/opcodes.go (2018/06/04).
    19  // Modified and improved for the klaytn development.
    20  
    21  package vm
    22  
    23  import "fmt"
    24  
    25  // OpCode is an EVM opcode
    26  type OpCode byte
    27  
    28  // IsPush specifies if an opcode is a PUSH opcode.
    29  func (op OpCode) IsPush() bool {
    30  	switch op {
    31  	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:
    32  		return true
    33  	}
    34  	return false
    35  }
    36  
    37  // IsStaticJump specifies if an opcode is JUMP.
    38  func (op OpCode) IsStaticJump() bool {
    39  	return op == JUMP
    40  }
    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  OpCode = 0x44
   105  	PREVRANDAO  OpCode = 0x44
   106  	GASLIMIT    OpCode = 0x45
   107  	CHAINID     OpCode = 0x46
   108  	SELFBALANCE OpCode = 0x47
   109  	BASEFEE     OpCode = 0x48
   110  )
   111  
   112  // 0x50 range - 'storage' and execution.
   113  const (
   114  	POP OpCode = 0x50 + iota
   115  	MLOAD
   116  	MSTORE
   117  	MSTORE8
   118  	SLOAD
   119  	SSTORE
   120  	JUMP
   121  	JUMPI
   122  	PC
   123  	MSIZE
   124  	GAS
   125  	JUMPDEST
   126  )
   127  
   128  // 0x60 range.
   129  const (
   130  	PUSH1 OpCode = 0x60 + iota
   131  	PUSH2
   132  	PUSH3
   133  	PUSH4
   134  	PUSH5
   135  	PUSH6
   136  	PUSH7
   137  	PUSH8
   138  	PUSH9
   139  	PUSH10
   140  	PUSH11
   141  	PUSH12
   142  	PUSH13
   143  	PUSH14
   144  	PUSH15
   145  	PUSH16
   146  	PUSH17
   147  	PUSH18
   148  	PUSH19
   149  	PUSH20
   150  	PUSH21
   151  	PUSH22
   152  	PUSH23
   153  	PUSH24
   154  	PUSH25
   155  	PUSH26
   156  	PUSH27
   157  	PUSH28
   158  	PUSH29
   159  	PUSH30
   160  	PUSH31
   161  	PUSH32
   162  	DUP1
   163  	DUP2
   164  	DUP3
   165  	DUP4
   166  	DUP5
   167  	DUP6
   168  	DUP7
   169  	DUP8
   170  	DUP9
   171  	DUP10
   172  	DUP11
   173  	DUP12
   174  	DUP13
   175  	DUP14
   176  	DUP15
   177  	DUP16
   178  	SWAP1
   179  	SWAP2
   180  	SWAP3
   181  	SWAP4
   182  	SWAP5
   183  	SWAP6
   184  	SWAP7
   185  	SWAP8
   186  	SWAP9
   187  	SWAP10
   188  	SWAP11
   189  	SWAP12
   190  	SWAP13
   191  	SWAP14
   192  	SWAP15
   193  	SWAP16
   194  )
   195  
   196  // 0xa0 range - logging ops.
   197  const (
   198  	LOG0 OpCode = 0xa0 + iota
   199  	LOG1
   200  	LOG2
   201  	LOG3
   202  	LOG4
   203  )
   204  
   205  // unofficial opcodes used for parsing.
   206  const (
   207  	PUSH OpCode = 0xb0 + iota
   208  	DUP
   209  	SWAP
   210  )
   211  
   212  // 0xf0 range - closures.
   213  const (
   214  	CREATE OpCode = 0xf0 + iota
   215  	CALL
   216  	CALLCODE
   217  	RETURN
   218  	DELEGATECALL
   219  	CREATE2
   220  	STATICCALL = 0xfa
   221  
   222  	REVERT       = 0xfd
   223  	SELFDESTRUCT = 0xff
   224  )
   225  
   226  // Since the opcodes aren't all in order we can't use a regular slice.
   227  var opCodeToString = map[OpCode]string{
   228  	// 0x0 range - arithmetic ops.
   229  	STOP:       "STOP",
   230  	ADD:        "ADD",
   231  	MUL:        "MUL",
   232  	SUB:        "SUB",
   233  	DIV:        "DIV",
   234  	SDIV:       "SDIV",
   235  	MOD:        "MOD",
   236  	SMOD:       "SMOD",
   237  	EXP:        "EXP",
   238  	NOT:        "NOT",
   239  	LT:         "LT",
   240  	GT:         "GT",
   241  	SLT:        "SLT",
   242  	SGT:        "SGT",
   243  	EQ:         "EQ",
   244  	ISZERO:     "ISZERO",
   245  	SIGNEXTEND: "SIGNEXTEND",
   246  
   247  	// 0x10 range - bit ops.
   248  	AND:    "AND",
   249  	OR:     "OR",
   250  	XOR:    "XOR",
   251  	BYTE:   "BYTE",
   252  	SHL:    "SHL",
   253  	SHR:    "SHR",
   254  	SAR:    "SAR",
   255  	ADDMOD: "ADDMOD",
   256  	MULMOD: "MULMOD",
   257  
   258  	// 0x20 range - crypto.
   259  	SHA3: "SHA3",
   260  
   261  	// 0x30 range - closure state.
   262  	ADDRESS:        "ADDRESS",
   263  	BALANCE:        "BALANCE",
   264  	ORIGIN:         "ORIGIN",
   265  	CALLER:         "CALLER",
   266  	CALLVALUE:      "CALLVALUE",
   267  	CALLDATALOAD:   "CALLDATALOAD",
   268  	CALLDATASIZE:   "CALLDATASIZE",
   269  	CALLDATACOPY:   "CALLDATACOPY",
   270  	CODESIZE:       "CODESIZE",
   271  	CODECOPY:       "CODECOPY",
   272  	GASPRICE:       "GASPRICE",
   273  	EXTCODESIZE:    "EXTCODESIZE",
   274  	EXTCODECOPY:    "EXTCODECOPY",
   275  	RETURNDATASIZE: "RETURNDATASIZE",
   276  	RETURNDATACOPY: "RETURNDATACOPY",
   277  	EXTCODEHASH:    "EXTCODEHASH",
   278  
   279  	// 0x40 range - block operations.
   280  	BLOCKHASH:   "BLOCKHASH",
   281  	COINBASE:    "COINBASE",
   282  	TIMESTAMP:   "TIMESTAMP",
   283  	NUMBER:      "NUMBER",
   284  	DIFFICULTY:  "DIFFICULTY",
   285  	GASLIMIT:    "GASLIMIT",
   286  	CHAINID:     "CHAINID",
   287  	SELFBALANCE: "SELFBALANCE",
   288  	BASEFEE:     "BASEFEE",
   289  
   290  	// 0x50 range - 'storage' and execution.
   291  	POP: "POP",
   292  	// DUP:     "DUP",
   293  	// SWAP:    "SWAP",
   294  	MLOAD:    "MLOAD",
   295  	MSTORE:   "MSTORE",
   296  	MSTORE8:  "MSTORE8",
   297  	SLOAD:    "SLOAD",
   298  	SSTORE:   "SSTORE",
   299  	JUMP:     "JUMP",
   300  	JUMPI:    "JUMPI",
   301  	PC:       "PC",
   302  	MSIZE:    "MSIZE",
   303  	GAS:      "GAS",
   304  	JUMPDEST: "JUMPDEST",
   305  
   306  	// 0x60 range - push.
   307  	PUSH1:  "PUSH1",
   308  	PUSH2:  "PUSH2",
   309  	PUSH3:  "PUSH3",
   310  	PUSH4:  "PUSH4",
   311  	PUSH5:  "PUSH5",
   312  	PUSH6:  "PUSH6",
   313  	PUSH7:  "PUSH7",
   314  	PUSH8:  "PUSH8",
   315  	PUSH9:  "PUSH9",
   316  	PUSH10: "PUSH10",
   317  	PUSH11: "PUSH11",
   318  	PUSH12: "PUSH12",
   319  	PUSH13: "PUSH13",
   320  	PUSH14: "PUSH14",
   321  	PUSH15: "PUSH15",
   322  	PUSH16: "PUSH16",
   323  	PUSH17: "PUSH17",
   324  	PUSH18: "PUSH18",
   325  	PUSH19: "PUSH19",
   326  	PUSH20: "PUSH20",
   327  	PUSH21: "PUSH21",
   328  	PUSH22: "PUSH22",
   329  	PUSH23: "PUSH23",
   330  	PUSH24: "PUSH24",
   331  	PUSH25: "PUSH25",
   332  	PUSH26: "PUSH26",
   333  	PUSH27: "PUSH27",
   334  	PUSH28: "PUSH28",
   335  	PUSH29: "PUSH29",
   336  	PUSH30: "PUSH30",
   337  	PUSH31: "PUSH31",
   338  	PUSH32: "PUSH32",
   339  
   340  	DUP1:  "DUP1",
   341  	DUP2:  "DUP2",
   342  	DUP3:  "DUP3",
   343  	DUP4:  "DUP4",
   344  	DUP5:  "DUP5",
   345  	DUP6:  "DUP6",
   346  	DUP7:  "DUP7",
   347  	DUP8:  "DUP8",
   348  	DUP9:  "DUP9",
   349  	DUP10: "DUP10",
   350  	DUP11: "DUP11",
   351  	DUP12: "DUP12",
   352  	DUP13: "DUP13",
   353  	DUP14: "DUP14",
   354  	DUP15: "DUP15",
   355  	DUP16: "DUP16",
   356  
   357  	SWAP1:  "SWAP1",
   358  	SWAP2:  "SWAP2",
   359  	SWAP3:  "SWAP3",
   360  	SWAP4:  "SWAP4",
   361  	SWAP5:  "SWAP5",
   362  	SWAP6:  "SWAP6",
   363  	SWAP7:  "SWAP7",
   364  	SWAP8:  "SWAP8",
   365  	SWAP9:  "SWAP9",
   366  	SWAP10: "SWAP10",
   367  	SWAP11: "SWAP11",
   368  	SWAP12: "SWAP12",
   369  	SWAP13: "SWAP13",
   370  	SWAP14: "SWAP14",
   371  	SWAP15: "SWAP15",
   372  	SWAP16: "SWAP16",
   373  	LOG0:   "LOG0",
   374  	LOG1:   "LOG1",
   375  	LOG2:   "LOG2",
   376  	LOG3:   "LOG3",
   377  	LOG4:   "LOG4",
   378  
   379  	// 0xf0 range.
   380  	CREATE:       "CREATE",
   381  	CALL:         "CALL",
   382  	RETURN:       "RETURN",
   383  	CALLCODE:     "CALLCODE",
   384  	DELEGATECALL: "DELEGATECALL",
   385  	CREATE2:      "CREATE2",
   386  	STATICCALL:   "STATICCALL",
   387  	REVERT:       "REVERT",
   388  	SELFDESTRUCT: "SELFDESTRUCT",
   389  
   390  	PUSH: "PUSH",
   391  	DUP:  "DUP",
   392  	SWAP: "SWAP",
   393  }
   394  
   395  func (op OpCode) String() string {
   396  	str := opCodeToString[op]
   397  	if len(str) == 0 {
   398  		return fmt.Sprintf("Missing opcode 0x%x", int(op))
   399  	}
   400  
   401  	return str
   402  }
   403  
   404  var stringToOp = map[string]OpCode{
   405  	"STOP":           STOP,
   406  	"ADD":            ADD,
   407  	"MUL":            MUL,
   408  	"SUB":            SUB,
   409  	"DIV":            DIV,
   410  	"SDIV":           SDIV,
   411  	"MOD":            MOD,
   412  	"SMOD":           SMOD,
   413  	"EXP":            EXP,
   414  	"NOT":            NOT,
   415  	"LT":             LT,
   416  	"GT":             GT,
   417  	"SLT":            SLT,
   418  	"SGT":            SGT,
   419  	"EQ":             EQ,
   420  	"ISZERO":         ISZERO,
   421  	"SIGNEXTEND":     SIGNEXTEND,
   422  	"AND":            AND,
   423  	"OR":             OR,
   424  	"XOR":            XOR,
   425  	"BYTE":           BYTE,
   426  	"SHL":            SHL,
   427  	"SHR":            SHR,
   428  	"SAR":            SAR,
   429  	"ADDMOD":         ADDMOD,
   430  	"MULMOD":         MULMOD,
   431  	"SHA3":           SHA3,
   432  	"ADDRESS":        ADDRESS,
   433  	"BALANCE":        BALANCE,
   434  	"ORIGIN":         ORIGIN,
   435  	"CALLER":         CALLER,
   436  	"CALLVALUE":      CALLVALUE,
   437  	"CALLDATALOAD":   CALLDATALOAD,
   438  	"CALLDATASIZE":   CALLDATASIZE,
   439  	"CALLDATACOPY":   CALLDATACOPY,
   440  	"CHAINID":        CHAINID,
   441  	"BASEFEE":        BASEFEE,
   442  	"DELEGATECALL":   DELEGATECALL,
   443  	"STATICCALL":     STATICCALL,
   444  	"CODESIZE":       CODESIZE,
   445  	"CODECOPY":       CODECOPY,
   446  	"GASPRICE":       GASPRICE,
   447  	"EXTCODESIZE":    EXTCODESIZE,
   448  	"EXTCODECOPY":    EXTCODECOPY,
   449  	"RETURNDATASIZE": RETURNDATASIZE,
   450  	"RETURNDATACOPY": RETURNDATACOPY,
   451  	"EXTCODEHASH":    EXTCODEHASH,
   452  	"BLOCKHASH":      BLOCKHASH,
   453  	"COINBASE":       COINBASE,
   454  	"TIMESTAMP":      TIMESTAMP,
   455  	"NUMBER":         NUMBER,
   456  	"DIFFICULTY":     DIFFICULTY,
   457  	"GASLIMIT":       GASLIMIT,
   458  	"SELFBALANCE":    SELFBALANCE,
   459  	"POP":            POP,
   460  	"MLOAD":          MLOAD,
   461  	"MSTORE":         MSTORE,
   462  	"MSTORE8":        MSTORE8,
   463  	"SLOAD":          SLOAD,
   464  	"SSTORE":         SSTORE,
   465  	"JUMP":           JUMP,
   466  	"JUMPI":          JUMPI,
   467  	"PC":             PC,
   468  	"MSIZE":          MSIZE,
   469  	"GAS":            GAS,
   470  	"JUMPDEST":       JUMPDEST,
   471  	"PUSH1":          PUSH1,
   472  	"PUSH2":          PUSH2,
   473  	"PUSH3":          PUSH3,
   474  	"PUSH4":          PUSH4,
   475  	"PUSH5":          PUSH5,
   476  	"PUSH6":          PUSH6,
   477  	"PUSH7":          PUSH7,
   478  	"PUSH8":          PUSH8,
   479  	"PUSH9":          PUSH9,
   480  	"PUSH10":         PUSH10,
   481  	"PUSH11":         PUSH11,
   482  	"PUSH12":         PUSH12,
   483  	"PUSH13":         PUSH13,
   484  	"PUSH14":         PUSH14,
   485  	"PUSH15":         PUSH15,
   486  	"PUSH16":         PUSH16,
   487  	"PUSH17":         PUSH17,
   488  	"PUSH18":         PUSH18,
   489  	"PUSH19":         PUSH19,
   490  	"PUSH20":         PUSH20,
   491  	"PUSH21":         PUSH21,
   492  	"PUSH22":         PUSH22,
   493  	"PUSH23":         PUSH23,
   494  	"PUSH24":         PUSH24,
   495  	"PUSH25":         PUSH25,
   496  	"PUSH26":         PUSH26,
   497  	"PUSH27":         PUSH27,
   498  	"PUSH28":         PUSH28,
   499  	"PUSH29":         PUSH29,
   500  	"PUSH30":         PUSH30,
   501  	"PUSH31":         PUSH31,
   502  	"PUSH32":         PUSH32,
   503  	"DUP1":           DUP1,
   504  	"DUP2":           DUP2,
   505  	"DUP3":           DUP3,
   506  	"DUP4":           DUP4,
   507  	"DUP5":           DUP5,
   508  	"DUP6":           DUP6,
   509  	"DUP7":           DUP7,
   510  	"DUP8":           DUP8,
   511  	"DUP9":           DUP9,
   512  	"DUP10":          DUP10,
   513  	"DUP11":          DUP11,
   514  	"DUP12":          DUP12,
   515  	"DUP13":          DUP13,
   516  	"DUP14":          DUP14,
   517  	"DUP15":          DUP15,
   518  	"DUP16":          DUP16,
   519  	"SWAP1":          SWAP1,
   520  	"SWAP2":          SWAP2,
   521  	"SWAP3":          SWAP3,
   522  	"SWAP4":          SWAP4,
   523  	"SWAP5":          SWAP5,
   524  	"SWAP6":          SWAP6,
   525  	"SWAP7":          SWAP7,
   526  	"SWAP8":          SWAP8,
   527  	"SWAP9":          SWAP9,
   528  	"SWAP10":         SWAP10,
   529  	"SWAP11":         SWAP11,
   530  	"SWAP12":         SWAP12,
   531  	"SWAP13":         SWAP13,
   532  	"SWAP14":         SWAP14,
   533  	"SWAP15":         SWAP15,
   534  	"SWAP16":         SWAP16,
   535  	"LOG0":           LOG0,
   536  	"LOG1":           LOG1,
   537  	"LOG2":           LOG2,
   538  	"LOG3":           LOG3,
   539  	"LOG4":           LOG4,
   540  	"CREATE":         CREATE,
   541  	"CREATE2":        CREATE2,
   542  	"CALL":           CALL,
   543  	"RETURN":         RETURN,
   544  	"CALLCODE":       CALLCODE,
   545  	"REVERT":         REVERT,
   546  	"SELFDESTRUCT":   SELFDESTRUCT,
   547  }
   548  
   549  // StringToOp finds the opcode whose name is stored in `str`.
   550  func StringToOp(str string) OpCode {
   551  	return stringToOp[str]
   552  }