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