github.com/jeffallen/go-ethereum@v1.1.4-0.20150910155051-571d3236c49c/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  type OpCode byte
    24  
    25  // Op codes
    26  const (
    27  	// 0x0 range - arithmetic ops
    28  	STOP OpCode = iota
    29  	ADD
    30  	MUL
    31  	SUB
    32  	DIV
    33  	SDIV
    34  	MOD
    35  	SMOD
    36  	ADDMOD
    37  	MULMOD
    38  	EXP
    39  	SIGNEXTEND
    40  )
    41  
    42  const (
    43  	LT OpCode = iota + 0x10
    44  	GT
    45  	SLT
    46  	SGT
    47  	EQ
    48  	ISZERO
    49  	AND
    50  	OR
    51  	XOR
    52  	NOT
    53  	BYTE
    54  
    55  	SHA3 = 0x20
    56  )
    57  
    58  const (
    59  	// 0x30 range - closure state
    60  	ADDRESS OpCode = 0x30 + iota
    61  	BALANCE
    62  	ORIGIN
    63  	CALLER
    64  	CALLVALUE
    65  	CALLDATALOAD
    66  	CALLDATASIZE
    67  	CALLDATACOPY
    68  	CODESIZE
    69  	CODECOPY
    70  	GASPRICE
    71  	EXTCODESIZE
    72  	EXTCODECOPY
    73  )
    74  
    75  const (
    76  
    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  const (
   179  	// 0xf0 range - closures
   180  	CREATE OpCode = 0xf0 + iota
   181  	CALL
   182  	CALLCODE
   183  	RETURN
   184  
   185  	// 0x70 range - other
   186  	SUICIDE = 0xff
   187  )
   188  
   189  // Since the opcodes aren't all in order we can't use a regular slice
   190  var opCodeToString = map[OpCode]string{
   191  	// 0x0 range - arithmetic ops
   192  	STOP:       "STOP",
   193  	ADD:        "ADD",
   194  	MUL:        "MUL",
   195  	SUB:        "SUB",
   196  	DIV:        "DIV",
   197  	SDIV:       "SDIV",
   198  	MOD:        "MOD",
   199  	SMOD:       "SMOD",
   200  	EXP:        "EXP",
   201  	NOT:        "NOT",
   202  	LT:         "LT",
   203  	GT:         "GT",
   204  	SLT:        "SLT",
   205  	SGT:        "SGT",
   206  	EQ:         "EQ",
   207  	ISZERO:     "ISZERO",
   208  	SIGNEXTEND: "SIGNEXTEND",
   209  
   210  	// 0x10 range - bit ops
   211  	AND:    "AND",
   212  	OR:     "OR",
   213  	XOR:    "XOR",
   214  	BYTE:   "BYTE",
   215  	ADDMOD: "ADDMOD",
   216  	MULMOD: "MULMOD",
   217  
   218  	// 0x20 range - crypto
   219  	SHA3: "SHA3",
   220  
   221  	// 0x30 range - closure state
   222  	ADDRESS:      "ADDRESS",
   223  	BALANCE:      "BALANCE",
   224  	ORIGIN:       "ORIGIN",
   225  	CALLER:       "CALLER",
   226  	CALLVALUE:    "CALLVALUE",
   227  	CALLDATALOAD: "CALLDATALOAD",
   228  	CALLDATASIZE: "CALLDATASIZE",
   229  	CALLDATACOPY: "CALLDATACOPY",
   230  	CODESIZE:     "CODESIZE",
   231  	CODECOPY:     "CODECOPY",
   232  	GASPRICE:     "TXGASPRICE",
   233  
   234  	// 0x40 range - block operations
   235  	BLOCKHASH:   "BLOCKHASH",
   236  	COINBASE:    "COINBASE",
   237  	TIMESTAMP:   "TIMESTAMP",
   238  	NUMBER:      "NUMBER",
   239  	DIFFICULTY:  "DIFFICULTY",
   240  	GASLIMIT:    "GASLIMIT",
   241  	EXTCODESIZE: "EXTCODESIZE",
   242  	EXTCODECOPY: "EXTCODECOPY",
   243  
   244  	// 0x50 range - 'storage' and execution
   245  	POP: "POP",
   246  	//DUP:     "DUP",
   247  	//SWAP:    "SWAP",
   248  	MLOAD:    "MLOAD",
   249  	MSTORE:   "MSTORE",
   250  	MSTORE8:  "MSTORE8",
   251  	SLOAD:    "SLOAD",
   252  	SSTORE:   "SSTORE",
   253  	JUMP:     "JUMP",
   254  	JUMPI:    "JUMPI",
   255  	PC:       "PC",
   256  	MSIZE:    "MSIZE",
   257  	GAS:      "GAS",
   258  	JUMPDEST: "JUMPDEST",
   259  
   260  	// 0x60 range - push
   261  	PUSH1:  "PUSH1",
   262  	PUSH2:  "PUSH2",
   263  	PUSH3:  "PUSH3",
   264  	PUSH4:  "PUSH4",
   265  	PUSH5:  "PUSH5",
   266  	PUSH6:  "PUSH6",
   267  	PUSH7:  "PUSH7",
   268  	PUSH8:  "PUSH8",
   269  	PUSH9:  "PUSH9",
   270  	PUSH10: "PUSH10",
   271  	PUSH11: "PUSH11",
   272  	PUSH12: "PUSH12",
   273  	PUSH13: "PUSH13",
   274  	PUSH14: "PUSH14",
   275  	PUSH15: "PUSH15",
   276  	PUSH16: "PUSH16",
   277  	PUSH17: "PUSH17",
   278  	PUSH18: "PUSH18",
   279  	PUSH19: "PUSH19",
   280  	PUSH20: "PUSH20",
   281  	PUSH21: "PUSH21",
   282  	PUSH22: "PUSH22",
   283  	PUSH23: "PUSH23",
   284  	PUSH24: "PUSH24",
   285  	PUSH25: "PUSH25",
   286  	PUSH26: "PUSH26",
   287  	PUSH27: "PUSH27",
   288  	PUSH28: "PUSH28",
   289  	PUSH29: "PUSH29",
   290  	PUSH30: "PUSH30",
   291  	PUSH31: "PUSH31",
   292  	PUSH32: "PUSH32",
   293  
   294  	DUP1:  "DUP1",
   295  	DUP2:  "DUP2",
   296  	DUP3:  "DUP3",
   297  	DUP4:  "DUP4",
   298  	DUP5:  "DUP5",
   299  	DUP6:  "DUP6",
   300  	DUP7:  "DUP7",
   301  	DUP8:  "DUP8",
   302  	DUP9:  "DUP9",
   303  	DUP10: "DUP10",
   304  	DUP11: "DUP11",
   305  	DUP12: "DUP12",
   306  	DUP13: "DUP13",
   307  	DUP14: "DUP14",
   308  	DUP15: "DUP15",
   309  	DUP16: "DUP16",
   310  
   311  	SWAP1:  "SWAP1",
   312  	SWAP2:  "SWAP2",
   313  	SWAP3:  "SWAP3",
   314  	SWAP4:  "SWAP4",
   315  	SWAP5:  "SWAP5",
   316  	SWAP6:  "SWAP6",
   317  	SWAP7:  "SWAP7",
   318  	SWAP8:  "SWAP8",
   319  	SWAP9:  "SWAP9",
   320  	SWAP10: "SWAP10",
   321  	SWAP11: "SWAP11",
   322  	SWAP12: "SWAP12",
   323  	SWAP13: "SWAP13",
   324  	SWAP14: "SWAP14",
   325  	SWAP15: "SWAP15",
   326  	SWAP16: "SWAP16",
   327  	LOG0:   "LOG0",
   328  	LOG1:   "LOG1",
   329  	LOG2:   "LOG2",
   330  	LOG3:   "LOG3",
   331  	LOG4:   "LOG4",
   332  
   333  	// 0xf0 range
   334  	CREATE:   "CREATE",
   335  	CALL:     "CALL",
   336  	RETURN:   "RETURN",
   337  	CALLCODE: "CALLCODE",
   338  
   339  	// 0x70 range - other
   340  	SUICIDE: "SUICIDE",
   341  }
   342  
   343  func (o OpCode) String() string {
   344  	str := opCodeToString[o]
   345  	if len(str) == 0 {
   346  		return fmt.Sprintf("Missing opcode 0x%x", int(o))
   347  	}
   348  
   349  	return str
   350  }
   351  
   352  var stringToOp = map[string]OpCode{
   353  	"STOP":         STOP,
   354  	"ADD":          ADD,
   355  	"MUL":          MUL,
   356  	"SUB":          SUB,
   357  	"DIV":          DIV,
   358  	"SDIV":         SDIV,
   359  	"MOD":          MOD,
   360  	"SMOD":         SMOD,
   361  	"EXP":          EXP,
   362  	"NOT":          NOT,
   363  	"LT":           LT,
   364  	"GT":           GT,
   365  	"SLT":          SLT,
   366  	"SGT":          SGT,
   367  	"EQ":           EQ,
   368  	"ISZERO":       ISZERO,
   369  	"SIGNEXTEND":   SIGNEXTEND,
   370  	"AND":          AND,
   371  	"OR":           OR,
   372  	"XOR":          XOR,
   373  	"BYTE":         BYTE,
   374  	"ADDMOD":       ADDMOD,
   375  	"MULMOD":       MULMOD,
   376  	"SHA3":         SHA3,
   377  	"ADDRESS":      ADDRESS,
   378  	"BALANCE":      BALANCE,
   379  	"ORIGIN":       ORIGIN,
   380  	"CALLER":       CALLER,
   381  	"CALLVALUE":    CALLVALUE,
   382  	"CALLDATALOAD": CALLDATALOAD,
   383  	"CALLDATASIZE": CALLDATASIZE,
   384  	"CALLDATACOPY": CALLDATACOPY,
   385  	"CODESIZE":     CODESIZE,
   386  	"CODECOPY":     CODECOPY,
   387  	"GASPRICE":     GASPRICE,
   388  	"BLOCKHASH":    BLOCKHASH,
   389  	"COINBASE":     COINBASE,
   390  	"TIMESTAMP":    TIMESTAMP,
   391  	"NUMBER":       NUMBER,
   392  	"DIFFICULTY":   DIFFICULTY,
   393  	"GASLIMIT":     GASLIMIT,
   394  	"EXTCODESIZE":  EXTCODESIZE,
   395  	"EXTCODECOPY":  EXTCODECOPY,
   396  	"POP":          POP,
   397  	"MLOAD":        MLOAD,
   398  	"MSTORE":       MSTORE,
   399  	"MSTORE8":      MSTORE8,
   400  	"SLOAD":        SLOAD,
   401  	"SSTORE":       SSTORE,
   402  	"JUMP":         JUMP,
   403  	"JUMPI":        JUMPI,
   404  	"PC":           PC,
   405  	"MSIZE":        MSIZE,
   406  	"GAS":          GAS,
   407  	"JUMPDEST":     JUMPDEST,
   408  	"PUSH1":        PUSH1,
   409  	"PUSH2":        PUSH2,
   410  	"PUSH3":        PUSH3,
   411  	"PUSH4":        PUSH4,
   412  	"PUSH5":        PUSH5,
   413  	"PUSH6":        PUSH6,
   414  	"PUSH7":        PUSH7,
   415  	"PUSH8":        PUSH8,
   416  	"PUSH9":        PUSH9,
   417  	"PUSH10":       PUSH10,
   418  	"PUSH11":       PUSH11,
   419  	"PUSH12":       PUSH12,
   420  	"PUSH13":       PUSH13,
   421  	"PUSH14":       PUSH14,
   422  	"PUSH15":       PUSH15,
   423  	"PUSH16":       PUSH16,
   424  	"PUSH17":       PUSH17,
   425  	"PUSH18":       PUSH18,
   426  	"PUSH19":       PUSH19,
   427  	"PUSH20":       PUSH20,
   428  	"PUSH21":       PUSH21,
   429  	"PUSH22":       PUSH22,
   430  	"PUSH23":       PUSH23,
   431  	"PUSH24":       PUSH24,
   432  	"PUSH25":       PUSH25,
   433  	"PUSH26":       PUSH26,
   434  	"PUSH27":       PUSH27,
   435  	"PUSH28":       PUSH28,
   436  	"PUSH29":       PUSH29,
   437  	"PUSH30":       PUSH30,
   438  	"PUSH31":       PUSH31,
   439  	"PUSH32":       PUSH32,
   440  	"DUP1":         DUP1,
   441  	"DUP2":         DUP2,
   442  	"DUP3":         DUP3,
   443  	"DUP4":         DUP4,
   444  	"DUP5":         DUP5,
   445  	"DUP6":         DUP6,
   446  	"DUP7":         DUP7,
   447  	"DUP8":         DUP8,
   448  	"DUP9":         DUP9,
   449  	"DUP10":        DUP10,
   450  	"DUP11":        DUP11,
   451  	"DUP12":        DUP12,
   452  	"DUP13":        DUP13,
   453  	"DUP14":        DUP14,
   454  	"DUP15":        DUP15,
   455  	"DUP16":        DUP16,
   456  	"SWAP1":        SWAP1,
   457  	"SWAP2":        SWAP2,
   458  	"SWAP3":        SWAP3,
   459  	"SWAP4":        SWAP4,
   460  	"SWAP5":        SWAP5,
   461  	"SWAP6":        SWAP6,
   462  	"SWAP7":        SWAP7,
   463  	"SWAP8":        SWAP8,
   464  	"SWAP9":        SWAP9,
   465  	"SWAP10":       SWAP10,
   466  	"SWAP11":       SWAP11,
   467  	"SWAP12":       SWAP12,
   468  	"SWAP13":       SWAP13,
   469  	"SWAP14":       SWAP14,
   470  	"SWAP15":       SWAP15,
   471  	"SWAP16":       SWAP16,
   472  	"LOG0":         LOG0,
   473  	"LOG1":         LOG1,
   474  	"LOG2":         LOG2,
   475  	"LOG3":         LOG3,
   476  	"LOG4":         LOG4,
   477  	"CREATE":       CREATE,
   478  	"CALL":         CALL,
   479  	"RETURN":       RETURN,
   480  	"CALLCODE":     CALLCODE,
   481  	"SUICIDE":      SUICIDE,
   482  }
   483  
   484  func StringToOp(str string) OpCode {
   485  	return stringToOp[str]
   486  }