github.com/ethereum/go-ethereum@v1.16.1/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 // OpCode is an EVM opcode 24 type OpCode byte 25 26 // IsPush specifies if an opcode is a PUSH opcode. 27 // @deprecated: this method is often used in order to know if there are immediates. 28 // Please use `vm.Immediates` instead. 29 func (op OpCode) IsPush() bool { 30 return PUSH0 <= op && op <= PUSH32 31 } 32 33 // 0x0 range - arithmetic ops. 34 const ( 35 STOP OpCode = 0x0 36 ADD OpCode = 0x1 37 MUL OpCode = 0x2 38 SUB OpCode = 0x3 39 DIV OpCode = 0x4 40 SDIV OpCode = 0x5 41 MOD OpCode = 0x6 42 SMOD OpCode = 0x7 43 ADDMOD OpCode = 0x8 44 MULMOD OpCode = 0x9 45 EXP OpCode = 0xa 46 SIGNEXTEND OpCode = 0xb 47 ) 48 49 // 0x10 range - comparison ops. 50 const ( 51 LT OpCode = 0x10 52 GT OpCode = 0x11 53 SLT OpCode = 0x12 54 SGT OpCode = 0x13 55 EQ OpCode = 0x14 56 ISZERO OpCode = 0x15 57 AND OpCode = 0x16 58 OR OpCode = 0x17 59 XOR OpCode = 0x18 60 NOT OpCode = 0x19 61 BYTE OpCode = 0x1a 62 SHL OpCode = 0x1b 63 SHR OpCode = 0x1c 64 SAR OpCode = 0x1d 65 ) 66 67 // 0x20 range - crypto. 68 const ( 69 KECCAK256 OpCode = 0x20 70 ) 71 72 // 0x30 range - closure state. 73 const ( 74 ADDRESS OpCode = 0x30 75 BALANCE OpCode = 0x31 76 ORIGIN OpCode = 0x32 77 CALLER OpCode = 0x33 78 CALLVALUE OpCode = 0x34 79 CALLDATALOAD OpCode = 0x35 80 CALLDATASIZE OpCode = 0x36 81 CALLDATACOPY OpCode = 0x37 82 CODESIZE OpCode = 0x38 83 CODECOPY OpCode = 0x39 84 GASPRICE OpCode = 0x3a 85 EXTCODESIZE OpCode = 0x3b 86 EXTCODECOPY OpCode = 0x3c 87 RETURNDATASIZE OpCode = 0x3d 88 RETURNDATACOPY OpCode = 0x3e 89 EXTCODEHASH OpCode = 0x3f 90 ) 91 92 // 0x40 range - block operations. 93 const ( 94 BLOCKHASH OpCode = 0x40 95 COINBASE OpCode = 0x41 96 TIMESTAMP OpCode = 0x42 97 NUMBER OpCode = 0x43 98 DIFFICULTY OpCode = 0x44 99 RANDOM OpCode = 0x44 // Same as DIFFICULTY 100 PREVRANDAO OpCode = 0x44 // Same as DIFFICULTY 101 GASLIMIT OpCode = 0x45 102 CHAINID OpCode = 0x46 103 SELFBALANCE OpCode = 0x47 104 BASEFEE OpCode = 0x48 105 BLOBHASH OpCode = 0x49 106 BLOBBASEFEE OpCode = 0x4a 107 ) 108 109 // 0x50 range - 'storage' and execution. 110 const ( 111 POP OpCode = 0x50 112 MLOAD OpCode = 0x51 113 MSTORE OpCode = 0x52 114 MSTORE8 OpCode = 0x53 115 SLOAD OpCode = 0x54 116 SSTORE OpCode = 0x55 117 JUMP OpCode = 0x56 118 JUMPI OpCode = 0x57 119 PC OpCode = 0x58 120 MSIZE OpCode = 0x59 121 GAS OpCode = 0x5a 122 JUMPDEST OpCode = 0x5b 123 TLOAD OpCode = 0x5c 124 TSTORE OpCode = 0x5d 125 MCOPY OpCode = 0x5e 126 PUSH0 OpCode = 0x5f 127 ) 128 129 // 0x60 range - pushes. 130 const ( 131 PUSH1 OpCode = 0x60 + iota 132 PUSH2 133 PUSH3 134 PUSH4 135 PUSH5 136 PUSH6 137 PUSH7 138 PUSH8 139 PUSH9 140 PUSH10 141 PUSH11 142 PUSH12 143 PUSH13 144 PUSH14 145 PUSH15 146 PUSH16 147 PUSH17 148 PUSH18 149 PUSH19 150 PUSH20 151 PUSH21 152 PUSH22 153 PUSH23 154 PUSH24 155 PUSH25 156 PUSH26 157 PUSH27 158 PUSH28 159 PUSH29 160 PUSH30 161 PUSH31 162 PUSH32 163 ) 164 165 // 0x80 range - dups. 166 const ( 167 DUP1 OpCode = 0x80 + iota 168 DUP2 169 DUP3 170 DUP4 171 DUP5 172 DUP6 173 DUP7 174 DUP8 175 DUP9 176 DUP10 177 DUP11 178 DUP12 179 DUP13 180 DUP14 181 DUP15 182 DUP16 183 ) 184 185 // 0x90 range - swaps. 186 const ( 187 SWAP1 OpCode = 0x90 + iota 188 SWAP2 189 SWAP3 190 SWAP4 191 SWAP5 192 SWAP6 193 SWAP7 194 SWAP8 195 SWAP9 196 SWAP10 197 SWAP11 198 SWAP12 199 SWAP13 200 SWAP14 201 SWAP15 202 SWAP16 203 ) 204 205 // 0xa0 range - logging ops. 206 const ( 207 LOG0 OpCode = 0xa0 + iota 208 LOG1 209 LOG2 210 LOG3 211 LOG4 212 ) 213 214 // 0xd0 range - eof operations. 215 const ( 216 DATALOAD OpCode = 0xd0 217 DATALOADN OpCode = 0xd1 218 DATASIZE OpCode = 0xd2 219 DATACOPY OpCode = 0xd3 220 ) 221 222 // 0xe0 range - eof operations. 223 const ( 224 RJUMP OpCode = 0xe0 225 RJUMPI OpCode = 0xe1 226 RJUMPV OpCode = 0xe2 227 CALLF OpCode = 0xe3 228 RETF OpCode = 0xe4 229 JUMPF OpCode = 0xe5 230 DUPN OpCode = 0xe6 231 SWAPN OpCode = 0xe7 232 EXCHANGE OpCode = 0xe8 233 EOFCREATE OpCode = 0xec 234 RETURNCONTRACT OpCode = 0xee 235 ) 236 237 // 0xf0 range - closures. 238 const ( 239 CREATE OpCode = 0xf0 240 CALL OpCode = 0xf1 241 CALLCODE OpCode = 0xf2 242 RETURN OpCode = 0xf3 243 DELEGATECALL OpCode = 0xf4 244 CREATE2 OpCode = 0xf5 245 246 RETURNDATALOAD OpCode = 0xf7 247 EXTCALL OpCode = 0xf8 248 EXTDELEGATECALL OpCode = 0xf9 249 250 STATICCALL OpCode = 0xfa 251 EXTSTATICCALL OpCode = 0xfb 252 REVERT OpCode = 0xfd 253 INVALID OpCode = 0xfe 254 SELFDESTRUCT OpCode = 0xff 255 ) 256 257 var opCodeToString = [256]string{ 258 // 0x0 range - arithmetic ops. 259 STOP: "STOP", 260 ADD: "ADD", 261 MUL: "MUL", 262 SUB: "SUB", 263 DIV: "DIV", 264 SDIV: "SDIV", 265 MOD: "MOD", 266 SMOD: "SMOD", 267 EXP: "EXP", 268 NOT: "NOT", 269 LT: "LT", 270 GT: "GT", 271 SLT: "SLT", 272 SGT: "SGT", 273 EQ: "EQ", 274 ISZERO: "ISZERO", 275 SIGNEXTEND: "SIGNEXTEND", 276 277 // 0x10 range - bit ops. 278 AND: "AND", 279 OR: "OR", 280 XOR: "XOR", 281 BYTE: "BYTE", 282 SHL: "SHL", 283 SHR: "SHR", 284 SAR: "SAR", 285 ADDMOD: "ADDMOD", 286 MULMOD: "MULMOD", 287 288 // 0x20 range - crypto. 289 KECCAK256: "KECCAK256", 290 291 // 0x30 range - closure state. 292 ADDRESS: "ADDRESS", 293 BALANCE: "BALANCE", 294 ORIGIN: "ORIGIN", 295 CALLER: "CALLER", 296 CALLVALUE: "CALLVALUE", 297 CALLDATALOAD: "CALLDATALOAD", 298 CALLDATASIZE: "CALLDATASIZE", 299 CALLDATACOPY: "CALLDATACOPY", 300 CODESIZE: "CODESIZE", 301 CODECOPY: "CODECOPY", 302 GASPRICE: "GASPRICE", 303 EXTCODESIZE: "EXTCODESIZE", 304 EXTCODECOPY: "EXTCODECOPY", 305 RETURNDATASIZE: "RETURNDATASIZE", 306 RETURNDATACOPY: "RETURNDATACOPY", 307 EXTCODEHASH: "EXTCODEHASH", 308 309 // 0x40 range - block operations. 310 BLOCKHASH: "BLOCKHASH", 311 COINBASE: "COINBASE", 312 TIMESTAMP: "TIMESTAMP", 313 NUMBER: "NUMBER", 314 DIFFICULTY: "DIFFICULTY", // TODO (MariusVanDerWijden) rename to PREVRANDAO post merge 315 GASLIMIT: "GASLIMIT", 316 CHAINID: "CHAINID", 317 SELFBALANCE: "SELFBALANCE", 318 BASEFEE: "BASEFEE", 319 BLOBHASH: "BLOBHASH", 320 BLOBBASEFEE: "BLOBBASEFEE", 321 322 // 0x50 range - 'storage' and execution. 323 POP: "POP", 324 MLOAD: "MLOAD", 325 MSTORE: "MSTORE", 326 MSTORE8: "MSTORE8", 327 SLOAD: "SLOAD", 328 SSTORE: "SSTORE", 329 JUMP: "JUMP", 330 JUMPI: "JUMPI", 331 PC: "PC", 332 MSIZE: "MSIZE", 333 GAS: "GAS", 334 JUMPDEST: "JUMPDEST", 335 TLOAD: "TLOAD", 336 TSTORE: "TSTORE", 337 MCOPY: "MCOPY", 338 PUSH0: "PUSH0", 339 340 // 0x60 range - pushes. 341 PUSH1: "PUSH1", 342 PUSH2: "PUSH2", 343 PUSH3: "PUSH3", 344 PUSH4: "PUSH4", 345 PUSH5: "PUSH5", 346 PUSH6: "PUSH6", 347 PUSH7: "PUSH7", 348 PUSH8: "PUSH8", 349 PUSH9: "PUSH9", 350 PUSH10: "PUSH10", 351 PUSH11: "PUSH11", 352 PUSH12: "PUSH12", 353 PUSH13: "PUSH13", 354 PUSH14: "PUSH14", 355 PUSH15: "PUSH15", 356 PUSH16: "PUSH16", 357 PUSH17: "PUSH17", 358 PUSH18: "PUSH18", 359 PUSH19: "PUSH19", 360 PUSH20: "PUSH20", 361 PUSH21: "PUSH21", 362 PUSH22: "PUSH22", 363 PUSH23: "PUSH23", 364 PUSH24: "PUSH24", 365 PUSH25: "PUSH25", 366 PUSH26: "PUSH26", 367 PUSH27: "PUSH27", 368 PUSH28: "PUSH28", 369 PUSH29: "PUSH29", 370 PUSH30: "PUSH30", 371 PUSH31: "PUSH31", 372 PUSH32: "PUSH32", 373 374 // 0x80 - dups. 375 DUP1: "DUP1", 376 DUP2: "DUP2", 377 DUP3: "DUP3", 378 DUP4: "DUP4", 379 DUP5: "DUP5", 380 DUP6: "DUP6", 381 DUP7: "DUP7", 382 DUP8: "DUP8", 383 DUP9: "DUP9", 384 DUP10: "DUP10", 385 DUP11: "DUP11", 386 DUP12: "DUP12", 387 DUP13: "DUP13", 388 DUP14: "DUP14", 389 DUP15: "DUP15", 390 DUP16: "DUP16", 391 392 // 0x90 - swaps. 393 SWAP1: "SWAP1", 394 SWAP2: "SWAP2", 395 SWAP3: "SWAP3", 396 SWAP4: "SWAP4", 397 SWAP5: "SWAP5", 398 SWAP6: "SWAP6", 399 SWAP7: "SWAP7", 400 SWAP8: "SWAP8", 401 SWAP9: "SWAP9", 402 SWAP10: "SWAP10", 403 SWAP11: "SWAP11", 404 SWAP12: "SWAP12", 405 SWAP13: "SWAP13", 406 SWAP14: "SWAP14", 407 SWAP15: "SWAP15", 408 SWAP16: "SWAP16", 409 410 // 0xa0 range - logging ops. 411 LOG0: "LOG0", 412 LOG1: "LOG1", 413 LOG2: "LOG2", 414 LOG3: "LOG3", 415 LOG4: "LOG4", 416 417 // 0xd range - eof ops. 418 DATALOAD: "DATALOAD", 419 DATALOADN: "DATALOADN", 420 DATASIZE: "DATASIZE", 421 DATACOPY: "DATACOPY", 422 423 // 0xe0 range. 424 RJUMP: "RJUMP", 425 RJUMPI: "RJUMPI", 426 RJUMPV: "RJUMPV", 427 CALLF: "CALLF", 428 RETF: "RETF", 429 JUMPF: "JUMPF", 430 DUPN: "DUPN", 431 SWAPN: "SWAPN", 432 EXCHANGE: "EXCHANGE", 433 EOFCREATE: "EOFCREATE", 434 RETURNCONTRACT: "RETURNCONTRACT", 435 436 // 0xf0 range - closures. 437 CREATE: "CREATE", 438 CALL: "CALL", 439 RETURN: "RETURN", 440 CALLCODE: "CALLCODE", 441 DELEGATECALL: "DELEGATECALL", 442 CREATE2: "CREATE2", 443 444 RETURNDATALOAD: "RETURNDATALOAD", 445 EXTCALL: "EXTCALL", 446 EXTDELEGATECALL: "EXTDELEGATECALL", 447 448 STATICCALL: "STATICCALL", 449 EXTSTATICCALL: "EXTSTATICCALL", 450 REVERT: "REVERT", 451 INVALID: "INVALID", 452 SELFDESTRUCT: "SELFDESTRUCT", 453 } 454 455 func (op OpCode) String() string { 456 if s := opCodeToString[op]; s != "" { 457 return s 458 } 459 return fmt.Sprintf("opcode %#x not defined", int(op)) 460 } 461 462 var stringToOp = map[string]OpCode{ 463 "STOP": STOP, 464 "ADD": ADD, 465 "MUL": MUL, 466 "SUB": SUB, 467 "DIV": DIV, 468 "SDIV": SDIV, 469 "MOD": MOD, 470 "SMOD": SMOD, 471 "EXP": EXP, 472 "NOT": NOT, 473 "LT": LT, 474 "GT": GT, 475 "SLT": SLT, 476 "SGT": SGT, 477 "EQ": EQ, 478 "ISZERO": ISZERO, 479 "SIGNEXTEND": SIGNEXTEND, 480 "AND": AND, 481 "OR": OR, 482 "XOR": XOR, 483 "BYTE": BYTE, 484 "SHL": SHL, 485 "SHR": SHR, 486 "SAR": SAR, 487 "ADDMOD": ADDMOD, 488 "MULMOD": MULMOD, 489 "KECCAK256": KECCAK256, 490 "ADDRESS": ADDRESS, 491 "BALANCE": BALANCE, 492 "ORIGIN": ORIGIN, 493 "CALLER": CALLER, 494 "CALLVALUE": CALLVALUE, 495 "CALLDATALOAD": CALLDATALOAD, 496 "CALLDATASIZE": CALLDATASIZE, 497 "CALLDATACOPY": CALLDATACOPY, 498 "CHAINID": CHAINID, 499 "BASEFEE": BASEFEE, 500 "BLOBHASH": BLOBHASH, 501 "BLOBBASEFEE": BLOBBASEFEE, 502 "DELEGATECALL": DELEGATECALL, 503 "STATICCALL": STATICCALL, 504 "CODESIZE": CODESIZE, 505 "CODECOPY": CODECOPY, 506 "GASPRICE": GASPRICE, 507 "EXTCODESIZE": EXTCODESIZE, 508 "EXTCODECOPY": EXTCODECOPY, 509 "RETURNDATASIZE": RETURNDATASIZE, 510 "RETURNDATACOPY": RETURNDATACOPY, 511 "EXTCODEHASH": EXTCODEHASH, 512 "BLOCKHASH": BLOCKHASH, 513 "COINBASE": COINBASE, 514 "TIMESTAMP": TIMESTAMP, 515 "NUMBER": NUMBER, 516 "DIFFICULTY": DIFFICULTY, 517 "GASLIMIT": GASLIMIT, 518 "SELFBALANCE": SELFBALANCE, 519 "POP": POP, 520 "MLOAD": MLOAD, 521 "MSTORE": MSTORE, 522 "MSTORE8": MSTORE8, 523 "SLOAD": SLOAD, 524 "SSTORE": SSTORE, 525 "JUMP": JUMP, 526 "JUMPI": JUMPI, 527 "PC": PC, 528 "MSIZE": MSIZE, 529 "GAS": GAS, 530 "JUMPDEST": JUMPDEST, 531 "TLOAD": TLOAD, 532 "TSTORE": TSTORE, 533 "MCOPY": MCOPY, 534 "PUSH0": PUSH0, 535 "PUSH1": PUSH1, 536 "PUSH2": PUSH2, 537 "PUSH3": PUSH3, 538 "PUSH4": PUSH4, 539 "PUSH5": PUSH5, 540 "PUSH6": PUSH6, 541 "PUSH7": PUSH7, 542 "PUSH8": PUSH8, 543 "PUSH9": PUSH9, 544 "PUSH10": PUSH10, 545 "PUSH11": PUSH11, 546 "PUSH12": PUSH12, 547 "PUSH13": PUSH13, 548 "PUSH14": PUSH14, 549 "PUSH15": PUSH15, 550 "PUSH16": PUSH16, 551 "PUSH17": PUSH17, 552 "PUSH18": PUSH18, 553 "PUSH19": PUSH19, 554 "PUSH20": PUSH20, 555 "PUSH21": PUSH21, 556 "PUSH22": PUSH22, 557 "PUSH23": PUSH23, 558 "PUSH24": PUSH24, 559 "PUSH25": PUSH25, 560 "PUSH26": PUSH26, 561 "PUSH27": PUSH27, 562 "PUSH28": PUSH28, 563 "PUSH29": PUSH29, 564 "PUSH30": PUSH30, 565 "PUSH31": PUSH31, 566 "PUSH32": PUSH32, 567 "DUP1": DUP1, 568 "DUP2": DUP2, 569 "DUP3": DUP3, 570 "DUP4": DUP4, 571 "DUP5": DUP5, 572 "DUP6": DUP6, 573 "DUP7": DUP7, 574 "DUP8": DUP8, 575 "DUP9": DUP9, 576 "DUP10": DUP10, 577 "DUP11": DUP11, 578 "DUP12": DUP12, 579 "DUP13": DUP13, 580 "DUP14": DUP14, 581 "DUP15": DUP15, 582 "DUP16": DUP16, 583 "SWAP1": SWAP1, 584 "SWAP2": SWAP2, 585 "SWAP3": SWAP3, 586 "SWAP4": SWAP4, 587 "SWAP5": SWAP5, 588 "SWAP6": SWAP6, 589 "SWAP7": SWAP7, 590 "SWAP8": SWAP8, 591 "SWAP9": SWAP9, 592 "SWAP10": SWAP10, 593 "SWAP11": SWAP11, 594 "SWAP12": SWAP12, 595 "SWAP13": SWAP13, 596 "SWAP14": SWAP14, 597 "SWAP15": SWAP15, 598 "SWAP16": SWAP16, 599 "LOG0": LOG0, 600 "LOG1": LOG1, 601 "LOG2": LOG2, 602 "LOG3": LOG3, 603 "LOG4": LOG4, 604 "DATALOAD": DATALOAD, 605 "DATALOADN": DATALOADN, 606 "DATASIZE": DATASIZE, 607 "DATACOPY": DATACOPY, 608 "RJUMP": RJUMP, 609 "RJUMPI": RJUMPI, 610 "RJUMPV": RJUMPV, 611 "CALLF": CALLF, 612 "RETF": RETF, 613 "JUMPF": JUMPF, 614 "DUPN": DUPN, 615 "SWAPN": SWAPN, 616 "EXCHANGE": EXCHANGE, 617 "EOFCREATE": EOFCREATE, 618 "RETURNCONTRACT": RETURNCONTRACT, 619 "CREATE": CREATE, 620 "CREATE2": CREATE2, 621 "RETURNDATALOAD": RETURNDATALOAD, 622 "EXTCALL": EXTCALL, 623 "EXTDELEGATECALL": EXTDELEGATECALL, 624 "EXTSTATICCALL": EXTSTATICCALL, 625 "CALL": CALL, 626 "RETURN": RETURN, 627 "CALLCODE": CALLCODE, 628 "REVERT": REVERT, 629 "INVALID": INVALID, 630 "SELFDESTRUCT": SELFDESTRUCT, 631 } 632 633 // StringToOp finds the opcode whose name is stored in `str`. 634 func StringToOp(str string) OpCode { 635 return stringToOp[str] 636 }