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