github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/core/vm/opcodes.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:36</date>
    10  //</624450083080900608>
    11  
    12  
    13  package vm
    14  
    15  import (
    16  	"fmt"
    17  )
    18  
    19  //操作码是EVM操作码
    20  type OpCode byte
    21  
    22  //is push指定操作码是否为推送操作码。
    23  func (op OpCode) IsPush() bool {
    24  	switch op {
    25  	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:
    26  		return true
    27  	}
    28  	return false
    29  }
    30  
    31  //IsStaticJump指定操作码是否为跳转。
    32  func (op OpCode) IsStaticJump() bool {
    33  	return op == JUMP
    34  }
    35  
    36  //0x0范围-算术运算。
    37  const (
    38  	STOP OpCode = iota
    39  	ADD
    40  	MUL
    41  	SUB
    42  	DIV
    43  	SDIV
    44  	MOD
    45  	SMOD
    46  	ADDMOD
    47  	MULMOD
    48  	EXP
    49  	SIGNEXTEND
    50  )
    51  
    52  //0x10范围-比较操作。
    53  const (
    54  	LT OpCode = iota + 0x10
    55  	GT
    56  	SLT
    57  	SGT
    58  	EQ
    59  	ISZERO
    60  	AND
    61  	OR
    62  	XOR
    63  	NOT
    64  	BYTE
    65  	SHL
    66  	SHR
    67  	SAR
    68  
    69  	SHA3 = 0x20
    70  )
    71  
    72  //0x30范围-关闭状态。
    73  const (
    74  	ADDRESS OpCode = 0x30 + iota
    75  	BALANCE
    76  	ORIGIN
    77  	CALLER
    78  	CALLVALUE
    79  	CALLDATALOAD
    80  	CALLDATASIZE
    81  	CALLDATACOPY
    82  	CODESIZE
    83  	CODECOPY
    84  	GASPRICE
    85  	EXTCODESIZE
    86  	EXTCODECOPY
    87  	RETURNDATASIZE
    88  	RETURNDATACOPY
    89  	EXTCODEHASH
    90  )
    91  
    92  //0x40范围-块操作。
    93  const (
    94  	BLOCKHASH OpCode = 0x40 + iota
    95  	COINBASE
    96  	TIMESTAMP
    97  	NUMBER
    98  	DIFFICULTY
    99  	GASLIMIT
   100  )
   101  
   102  //0x50范围-“存储”和执行。
   103  const (
   104  	POP OpCode = 0x50 + iota
   105  	MLOAD
   106  	MSTORE
   107  	MSTORE8
   108  	SLOAD
   109  	SSTORE
   110  	JUMP
   111  	JUMPI
   112  	PC
   113  	MSIZE
   114  	GAS
   115  	JUMPDEST
   116  )
   117  
   118  //0x60范围。
   119  const (
   120  	PUSH1 OpCode = 0x60 + iota
   121  	PUSH2
   122  	PUSH3
   123  	PUSH4
   124  	PUSH5
   125  	PUSH6
   126  	PUSH7
   127  	PUSH8
   128  	PUSH9
   129  	PUSH10
   130  	PUSH11
   131  	PUSH12
   132  	PUSH13
   133  	PUSH14
   134  	PUSH15
   135  	PUSH16
   136  	PUSH17
   137  	PUSH18
   138  	PUSH19
   139  	PUSH20
   140  	PUSH21
   141  	PUSH22
   142  	PUSH23
   143  	PUSH24
   144  	PUSH25
   145  	PUSH26
   146  	PUSH27
   147  	PUSH28
   148  	PUSH29
   149  	PUSH30
   150  	PUSH31
   151  	PUSH32
   152  	DUP1
   153  	DUP2
   154  	DUP3
   155  	DUP4
   156  	DUP5
   157  	DUP6
   158  	DUP7
   159  	DUP8
   160  	DUP9
   161  	DUP10
   162  	DUP11
   163  	DUP12
   164  	DUP13
   165  	DUP14
   166  	DUP15
   167  	DUP16
   168  	SWAP1
   169  	SWAP2
   170  	SWAP3
   171  	SWAP4
   172  	SWAP5
   173  	SWAP6
   174  	SWAP7
   175  	SWAP8
   176  	SWAP9
   177  	SWAP10
   178  	SWAP11
   179  	SWAP12
   180  	SWAP13
   181  	SWAP14
   182  	SWAP15
   183  	SWAP16
   184  )
   185  
   186  //0XA0范围-记录操作。
   187  const (
   188  	LOG0 OpCode = 0xa0 + iota
   189  	LOG1
   190  	LOG2
   191  	LOG3
   192  	LOG4
   193  )
   194  
   195  //用于解析的非官方操作码。
   196  const (
   197  	PUSH OpCode = 0xb0 + iota
   198  	DUP
   199  	SWAP
   200  )
   201  
   202  //0xF0范围-关闭。
   203  const (
   204  	CREATE OpCode = 0xf0 + iota
   205  	CALL
   206  	CALLCODE
   207  	RETURN
   208  	DELEGATECALL
   209  	CREATE2
   210  	STATICCALL = 0xfa
   211  
   212  	REVERT       = 0xfd
   213  	SELFDESTRUCT = 0xff
   214  )
   215  
   216  //由于操作码不是全部正常,我们不能使用常规切片。
   217  var opCodeToString = map[OpCode]string{
   218  //0x0范围-算术运算。
   219  	STOP:       "STOP",
   220  	ADD:        "ADD",
   221  	MUL:        "MUL",
   222  	SUB:        "SUB",
   223  	DIV:        "DIV",
   224  	SDIV:       "SDIV",
   225  	MOD:        "MOD",
   226  	SMOD:       "SMOD",
   227  	EXP:        "EXP",
   228  	NOT:        "NOT",
   229  	LT:         "LT",
   230  	GT:         "GT",
   231  	SLT:        "SLT",
   232  	SGT:        "SGT",
   233  	EQ:         "EQ",
   234  	ISZERO:     "ISZERO",
   235  	SIGNEXTEND: "SIGNEXTEND",
   236  
   237  //0x10范围-位操作。
   238  	AND:    "AND",
   239  	OR:     "OR",
   240  	XOR:    "XOR",
   241  	BYTE:   "BYTE",
   242  	SHL:    "SHL",
   243  	SHR:    "SHR",
   244  	SAR:    "SAR",
   245  	ADDMOD: "ADDMOD",
   246  	MULMOD: "MULMOD",
   247  
   248  //0x20范围-加密。
   249  	SHA3: "SHA3",
   250  
   251  //0x30范围-关闭状态。
   252  	ADDRESS:        "ADDRESS",
   253  	BALANCE:        "BALANCE",
   254  	ORIGIN:         "ORIGIN",
   255  	CALLER:         "CALLER",
   256  	CALLVALUE:      "CALLVALUE",
   257  	CALLDATALOAD:   "CALLDATALOAD",
   258  	CALLDATASIZE:   "CALLDATASIZE",
   259  	CALLDATACOPY:   "CALLDATACOPY",
   260  	CODESIZE:       "CODESIZE",
   261  	CODECOPY:       "CODECOPY",
   262  	GASPRICE:       "GASPRICE",
   263  	EXTCODESIZE:    "EXTCODESIZE",
   264  	EXTCODECOPY:    "EXTCODECOPY",
   265  	RETURNDATASIZE: "RETURNDATASIZE",
   266  	RETURNDATACOPY: "RETURNDATACOPY",
   267  	EXTCODEHASH:    "EXTCODEHASH",
   268  
   269  //0x40范围-块操作。
   270  	BLOCKHASH:  "BLOCKHASH",
   271  	COINBASE:   "COINBASE",
   272  	TIMESTAMP:  "TIMESTAMP",
   273  	NUMBER:     "NUMBER",
   274  	DIFFICULTY: "DIFFICULTY",
   275  	GASLIMIT:   "GASLIMIT",
   276  
   277  //0x50范围-“存储”和执行。
   278  	POP: "POP",
   279  //DUP:“DUP”,
   280  //swap:“交换”,
   281  	MLOAD:    "MLOAD",
   282  	MSTORE:   "MSTORE",
   283  	MSTORE8:  "MSTORE8",
   284  	SLOAD:    "SLOAD",
   285  	SSTORE:   "SSTORE",
   286  	JUMP:     "JUMP",
   287  	JUMPI:    "JUMPI",
   288  	PC:       "PC",
   289  	MSIZE:    "MSIZE",
   290  	GAS:      "GAS",
   291  	JUMPDEST: "JUMPDEST",
   292  
   293  //0x60范围-推。
   294  	PUSH1:  "PUSH1",
   295  	PUSH2:  "PUSH2",
   296  	PUSH3:  "PUSH3",
   297  	PUSH4:  "PUSH4",
   298  	PUSH5:  "PUSH5",
   299  	PUSH6:  "PUSH6",
   300  	PUSH7:  "PUSH7",
   301  	PUSH8:  "PUSH8",
   302  	PUSH9:  "PUSH9",
   303  	PUSH10: "PUSH10",
   304  	PUSH11: "PUSH11",
   305  	PUSH12: "PUSH12",
   306  	PUSH13: "PUSH13",
   307  	PUSH14: "PUSH14",
   308  	PUSH15: "PUSH15",
   309  	PUSH16: "PUSH16",
   310  	PUSH17: "PUSH17",
   311  	PUSH18: "PUSH18",
   312  	PUSH19: "PUSH19",
   313  	PUSH20: "PUSH20",
   314  	PUSH21: "PUSH21",
   315  	PUSH22: "PUSH22",
   316  	PUSH23: "PUSH23",
   317  	PUSH24: "PUSH24",
   318  	PUSH25: "PUSH25",
   319  	PUSH26: "PUSH26",
   320  	PUSH27: "PUSH27",
   321  	PUSH28: "PUSH28",
   322  	PUSH29: "PUSH29",
   323  	PUSH30: "PUSH30",
   324  	PUSH31: "PUSH31",
   325  	PUSH32: "PUSH32",
   326  
   327  	DUP1:  "DUP1",
   328  	DUP2:  "DUP2",
   329  	DUP3:  "DUP3",
   330  	DUP4:  "DUP4",
   331  	DUP5:  "DUP5",
   332  	DUP6:  "DUP6",
   333  	DUP7:  "DUP7",
   334  	DUP8:  "DUP8",
   335  	DUP9:  "DUP9",
   336  	DUP10: "DUP10",
   337  	DUP11: "DUP11",
   338  	DUP12: "DUP12",
   339  	DUP13: "DUP13",
   340  	DUP14: "DUP14",
   341  	DUP15: "DUP15",
   342  	DUP16: "DUP16",
   343  
   344  	SWAP1:  "SWAP1",
   345  	SWAP2:  "SWAP2",
   346  	SWAP3:  "SWAP3",
   347  	SWAP4:  "SWAP4",
   348  	SWAP5:  "SWAP5",
   349  	SWAP6:  "SWAP6",
   350  	SWAP7:  "SWAP7",
   351  	SWAP8:  "SWAP8",
   352  	SWAP9:  "SWAP9",
   353  	SWAP10: "SWAP10",
   354  	SWAP11: "SWAP11",
   355  	SWAP12: "SWAP12",
   356  	SWAP13: "SWAP13",
   357  	SWAP14: "SWAP14",
   358  	SWAP15: "SWAP15",
   359  	SWAP16: "SWAP16",
   360  	LOG0:   "LOG0",
   361  	LOG1:   "LOG1",
   362  	LOG2:   "LOG2",
   363  	LOG3:   "LOG3",
   364  	LOG4:   "LOG4",
   365  
   366  //0xF0范围。
   367  	CREATE:       "CREATE",
   368  	CALL:         "CALL",
   369  	RETURN:       "RETURN",
   370  	CALLCODE:     "CALLCODE",
   371  	DELEGATECALL: "DELEGATECALL",
   372  	CREATE2:      "CREATE2",
   373  	STATICCALL:   "STATICCALL",
   374  	REVERT:       "REVERT",
   375  	SELFDESTRUCT: "SELFDESTRUCT",
   376  
   377  	PUSH: "PUSH",
   378  	DUP:  "DUP",
   379  	SWAP: "SWAP",
   380  }
   381  
   382  func (op OpCode) String() string {
   383  	str := opCodeToString[op]
   384  	if len(str) == 0 {
   385  		return fmt.Sprintf("Missing opcode 0x%x", int(op))
   386  	}
   387  
   388  	return str
   389  }
   390  
   391  var stringToOp = map[string]OpCode{
   392  	"STOP":           STOP,
   393  	"ADD":            ADD,
   394  	"MUL":            MUL,
   395  	"SUB":            SUB,
   396  	"DIV":            DIV,
   397  	"SDIV":           SDIV,
   398  	"MOD":            MOD,
   399  	"SMOD":           SMOD,
   400  	"EXP":            EXP,
   401  	"NOT":            NOT,
   402  	"LT":             LT,
   403  	"GT":             GT,
   404  	"SLT":            SLT,
   405  	"SGT":            SGT,
   406  	"EQ":             EQ,
   407  	"ISZERO":         ISZERO,
   408  	"SIGNEXTEND":     SIGNEXTEND,
   409  	"AND":            AND,
   410  	"OR":             OR,
   411  	"XOR":            XOR,
   412  	"BYTE":           BYTE,
   413  	"SHL":            SHL,
   414  	"SHR":            SHR,
   415  	"SAR":            SAR,
   416  	"ADDMOD":         ADDMOD,
   417  	"MULMOD":         MULMOD,
   418  	"SHA3":           SHA3,
   419  	"ADDRESS":        ADDRESS,
   420  	"BALANCE":        BALANCE,
   421  	"ORIGIN":         ORIGIN,
   422  	"CALLER":         CALLER,
   423  	"CALLVALUE":      CALLVALUE,
   424  	"CALLDATALOAD":   CALLDATALOAD,
   425  	"CALLDATASIZE":   CALLDATASIZE,
   426  	"CALLDATACOPY":   CALLDATACOPY,
   427  	"DELEGATECALL":   DELEGATECALL,
   428  	"STATICCALL":     STATICCALL,
   429  	"CODESIZE":       CODESIZE,
   430  	"CODECOPY":       CODECOPY,
   431  	"GASPRICE":       GASPRICE,
   432  	"EXTCODESIZE":    EXTCODESIZE,
   433  	"EXTCODECOPY":    EXTCODECOPY,
   434  	"RETURNDATASIZE": RETURNDATASIZE,
   435  	"RETURNDATACOPY": RETURNDATACOPY,
   436  	"EXTCODEHASH":    EXTCODEHASH,
   437  	"BLOCKHASH":      BLOCKHASH,
   438  	"COINBASE":       COINBASE,
   439  	"TIMESTAMP":      TIMESTAMP,
   440  	"NUMBER":         NUMBER,
   441  	"DIFFICULTY":     DIFFICULTY,
   442  	"GASLIMIT":       GASLIMIT,
   443  	"POP":            POP,
   444  	"MLOAD":          MLOAD,
   445  	"MSTORE":         MSTORE,
   446  	"MSTORE8":        MSTORE8,
   447  	"SLOAD":          SLOAD,
   448  	"SSTORE":         SSTORE,
   449  	"JUMP":           JUMP,
   450  	"JUMPI":          JUMPI,
   451  	"PC":             PC,
   452  	"MSIZE":          MSIZE,
   453  	"GAS":            GAS,
   454  	"JUMPDEST":       JUMPDEST,
   455  	"PUSH1":          PUSH1,
   456  	"PUSH2":          PUSH2,
   457  	"PUSH3":          PUSH3,
   458  	"PUSH4":          PUSH4,
   459  	"PUSH5":          PUSH5,
   460  	"PUSH6":          PUSH6,
   461  	"PUSH7":          PUSH7,
   462  	"PUSH8":          PUSH8,
   463  	"PUSH9":          PUSH9,
   464  	"PUSH10":         PUSH10,
   465  	"PUSH11":         PUSH11,
   466  	"PUSH12":         PUSH12,
   467  	"PUSH13":         PUSH13,
   468  	"PUSH14":         PUSH14,
   469  	"PUSH15":         PUSH15,
   470  	"PUSH16":         PUSH16,
   471  	"PUSH17":         PUSH17,
   472  	"PUSH18":         PUSH18,
   473  	"PUSH19":         PUSH19,
   474  	"PUSH20":         PUSH20,
   475  	"PUSH21":         PUSH21,
   476  	"PUSH22":         PUSH22,
   477  	"PUSH23":         PUSH23,
   478  	"PUSH24":         PUSH24,
   479  	"PUSH25":         PUSH25,
   480  	"PUSH26":         PUSH26,
   481  	"PUSH27":         PUSH27,
   482  	"PUSH28":         PUSH28,
   483  	"PUSH29":         PUSH29,
   484  	"PUSH30":         PUSH30,
   485  	"PUSH31":         PUSH31,
   486  	"PUSH32":         PUSH32,
   487  	"DUP1":           DUP1,
   488  	"DUP2":           DUP2,
   489  	"DUP3":           DUP3,
   490  	"DUP4":           DUP4,
   491  	"DUP5":           DUP5,
   492  	"DUP6":           DUP6,
   493  	"DUP7":           DUP7,
   494  	"DUP8":           DUP8,
   495  	"DUP9":           DUP9,
   496  	"DUP10":          DUP10,
   497  	"DUP11":          DUP11,
   498  	"DUP12":          DUP12,
   499  	"DUP13":          DUP13,
   500  	"DUP14":          DUP14,
   501  	"DUP15":          DUP15,
   502  	"DUP16":          DUP16,
   503  	"SWAP1":          SWAP1,
   504  	"SWAP2":          SWAP2,
   505  	"SWAP3":          SWAP3,
   506  	"SWAP4":          SWAP4,
   507  	"SWAP5":          SWAP5,
   508  	"SWAP6":          SWAP6,
   509  	"SWAP7":          SWAP7,
   510  	"SWAP8":          SWAP8,
   511  	"SWAP9":          SWAP9,
   512  	"SWAP10":         SWAP10,
   513  	"SWAP11":         SWAP11,
   514  	"SWAP12":         SWAP12,
   515  	"SWAP13":         SWAP13,
   516  	"SWAP14":         SWAP14,
   517  	"SWAP15":         SWAP15,
   518  	"SWAP16":         SWAP16,
   519  	"LOG0":           LOG0,
   520  	"LOG1":           LOG1,
   521  	"LOG2":           LOG2,
   522  	"LOG3":           LOG3,
   523  	"LOG4":           LOG4,
   524  	"CREATE":         CREATE,
   525  	"CREATE2":        CREATE2,
   526  	"CALL":           CALL,
   527  	"RETURN":         RETURN,
   528  	"CALLCODE":       CALLCODE,
   529  	"REVERT":         REVERT,
   530  	"SELFDESTRUCT":   SELFDESTRUCT,
   531  }
   532  
   533  //stringtoop查找名称存储在“str”中的操作码。
   534  func StringToOp(str string) OpCode {
   535  	return stringToOp[str]
   536  }
   537