github.com/bigzoro/my_simplechain@v0.0.0-20240315012955-8ad0a2a29bb9/core/vm/opcodes.go (about)

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