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