github.com/carter-ya/go-ethereum@v0.0.0-20230628080049-d2309be3983b/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 // Since the opcodes aren't all in order we can't use a regular slice. 223 var opCodeToString = map[OpCode]string{ 224 // 0x0 range - arithmetic ops. 225 STOP: "STOP", 226 ADD: "ADD", 227 MUL: "MUL", 228 SUB: "SUB", 229 DIV: "DIV", 230 SDIV: "SDIV", 231 MOD: "MOD", 232 SMOD: "SMOD", 233 EXP: "EXP", 234 NOT: "NOT", 235 LT: "LT", 236 GT: "GT", 237 SLT: "SLT", 238 SGT: "SGT", 239 EQ: "EQ", 240 ISZERO: "ISZERO", 241 SIGNEXTEND: "SIGNEXTEND", 242 243 // 0x10 range - bit ops. 244 AND: "AND", 245 OR: "OR", 246 XOR: "XOR", 247 BYTE: "BYTE", 248 SHL: "SHL", 249 SHR: "SHR", 250 SAR: "SAR", 251 ADDMOD: "ADDMOD", 252 MULMOD: "MULMOD", 253 254 // 0x20 range - crypto. 255 KECCAK256: "KECCAK256", 256 257 // 0x30 range - closure state. 258 ADDRESS: "ADDRESS", 259 BALANCE: "BALANCE", 260 ORIGIN: "ORIGIN", 261 CALLER: "CALLER", 262 CALLVALUE: "CALLVALUE", 263 CALLDATALOAD: "CALLDATALOAD", 264 CALLDATASIZE: "CALLDATASIZE", 265 CALLDATACOPY: "CALLDATACOPY", 266 CODESIZE: "CODESIZE", 267 CODECOPY: "CODECOPY", 268 GASPRICE: "GASPRICE", 269 EXTCODESIZE: "EXTCODESIZE", 270 EXTCODECOPY: "EXTCODECOPY", 271 RETURNDATASIZE: "RETURNDATASIZE", 272 RETURNDATACOPY: "RETURNDATACOPY", 273 EXTCODEHASH: "EXTCODEHASH", 274 275 // 0x40 range - block operations. 276 BLOCKHASH: "BLOCKHASH", 277 COINBASE: "COINBASE", 278 TIMESTAMP: "TIMESTAMP", 279 NUMBER: "NUMBER", 280 DIFFICULTY: "DIFFICULTY", // TODO (MariusVanDerWijden) rename to PREVRANDAO post merge 281 GASLIMIT: "GASLIMIT", 282 CHAINID: "CHAINID", 283 SELFBALANCE: "SELFBALANCE", 284 BASEFEE: "BASEFEE", 285 286 // 0x50 range - 'storage' and execution. 287 POP: "POP", 288 //DUP: "DUP", 289 //SWAP: "SWAP", 290 MLOAD: "MLOAD", 291 MSTORE: "MSTORE", 292 MSTORE8: "MSTORE8", 293 SLOAD: "SLOAD", 294 SSTORE: "SSTORE", 295 JUMP: "JUMP", 296 JUMPI: "JUMPI", 297 PC: "PC", 298 MSIZE: "MSIZE", 299 GAS: "GAS", 300 JUMPDEST: "JUMPDEST", 301 PUSH0: "PUSH0", 302 303 // 0x60 range - push. 304 PUSH1: "PUSH1", 305 PUSH2: "PUSH2", 306 PUSH3: "PUSH3", 307 PUSH4: "PUSH4", 308 PUSH5: "PUSH5", 309 PUSH6: "PUSH6", 310 PUSH7: "PUSH7", 311 PUSH8: "PUSH8", 312 PUSH9: "PUSH9", 313 PUSH10: "PUSH10", 314 PUSH11: "PUSH11", 315 PUSH12: "PUSH12", 316 PUSH13: "PUSH13", 317 PUSH14: "PUSH14", 318 PUSH15: "PUSH15", 319 PUSH16: "PUSH16", 320 PUSH17: "PUSH17", 321 PUSH18: "PUSH18", 322 PUSH19: "PUSH19", 323 PUSH20: "PUSH20", 324 PUSH21: "PUSH21", 325 PUSH22: "PUSH22", 326 PUSH23: "PUSH23", 327 PUSH24: "PUSH24", 328 PUSH25: "PUSH25", 329 PUSH26: "PUSH26", 330 PUSH27: "PUSH27", 331 PUSH28: "PUSH28", 332 PUSH29: "PUSH29", 333 PUSH30: "PUSH30", 334 PUSH31: "PUSH31", 335 PUSH32: "PUSH32", 336 337 DUP1: "DUP1", 338 DUP2: "DUP2", 339 DUP3: "DUP3", 340 DUP4: "DUP4", 341 DUP5: "DUP5", 342 DUP6: "DUP6", 343 DUP7: "DUP7", 344 DUP8: "DUP8", 345 DUP9: "DUP9", 346 DUP10: "DUP10", 347 DUP11: "DUP11", 348 DUP12: "DUP12", 349 DUP13: "DUP13", 350 DUP14: "DUP14", 351 DUP15: "DUP15", 352 DUP16: "DUP16", 353 354 SWAP1: "SWAP1", 355 SWAP2: "SWAP2", 356 SWAP3: "SWAP3", 357 SWAP4: "SWAP4", 358 SWAP5: "SWAP5", 359 SWAP6: "SWAP6", 360 SWAP7: "SWAP7", 361 SWAP8: "SWAP8", 362 SWAP9: "SWAP9", 363 SWAP10: "SWAP10", 364 SWAP11: "SWAP11", 365 SWAP12: "SWAP12", 366 SWAP13: "SWAP13", 367 SWAP14: "SWAP14", 368 SWAP15: "SWAP15", 369 SWAP16: "SWAP16", 370 LOG0: "LOG0", 371 LOG1: "LOG1", 372 LOG2: "LOG2", 373 LOG3: "LOG3", 374 LOG4: "LOG4", 375 376 // 0xf0 range. 377 CREATE: "CREATE", 378 CALL: "CALL", 379 RETURN: "RETURN", 380 CALLCODE: "CALLCODE", 381 DELEGATECALL: "DELEGATECALL", 382 CREATE2: "CREATE2", 383 STATICCALL: "STATICCALL", 384 REVERT: "REVERT", 385 INVALID: "INVALID", 386 SELFDESTRUCT: "SELFDESTRUCT", 387 } 388 389 func (op OpCode) String() string { 390 str := opCodeToString[op] 391 if len(str) == 0 { 392 return fmt.Sprintf("opcode %#x not defined", int(op)) 393 } 394 395 return str 396 } 397 398 var stringToOp = map[string]OpCode{ 399 "STOP": STOP, 400 "ADD": ADD, 401 "MUL": MUL, 402 "SUB": SUB, 403 "DIV": DIV, 404 "SDIV": SDIV, 405 "MOD": MOD, 406 "SMOD": SMOD, 407 "EXP": EXP, 408 "NOT": NOT, 409 "LT": LT, 410 "GT": GT, 411 "SLT": SLT, 412 "SGT": SGT, 413 "EQ": EQ, 414 "ISZERO": ISZERO, 415 "SIGNEXTEND": SIGNEXTEND, 416 "AND": AND, 417 "OR": OR, 418 "XOR": XOR, 419 "BYTE": BYTE, 420 "SHL": SHL, 421 "SHR": SHR, 422 "SAR": SAR, 423 "ADDMOD": ADDMOD, 424 "MULMOD": MULMOD, 425 "KECCAK256": KECCAK256, 426 "ADDRESS": ADDRESS, 427 "BALANCE": BALANCE, 428 "ORIGIN": ORIGIN, 429 "CALLER": CALLER, 430 "CALLVALUE": CALLVALUE, 431 "CALLDATALOAD": CALLDATALOAD, 432 "CALLDATASIZE": CALLDATASIZE, 433 "CALLDATACOPY": CALLDATACOPY, 434 "CHAINID": CHAINID, 435 "BASEFEE": BASEFEE, 436 "DELEGATECALL": DELEGATECALL, 437 "STATICCALL": STATICCALL, 438 "CODESIZE": CODESIZE, 439 "CODECOPY": CODECOPY, 440 "GASPRICE": GASPRICE, 441 "EXTCODESIZE": EXTCODESIZE, 442 "EXTCODECOPY": EXTCODECOPY, 443 "RETURNDATASIZE": RETURNDATASIZE, 444 "RETURNDATACOPY": RETURNDATACOPY, 445 "EXTCODEHASH": EXTCODEHASH, 446 "BLOCKHASH": BLOCKHASH, 447 "COINBASE": COINBASE, 448 "TIMESTAMP": TIMESTAMP, 449 "NUMBER": NUMBER, 450 "DIFFICULTY": DIFFICULTY, 451 "GASLIMIT": GASLIMIT, 452 "SELFBALANCE": SELFBALANCE, 453 "POP": POP, 454 "MLOAD": MLOAD, 455 "MSTORE": MSTORE, 456 "MSTORE8": MSTORE8, 457 "SLOAD": SLOAD, 458 "SSTORE": SSTORE, 459 "JUMP": JUMP, 460 "JUMPI": JUMPI, 461 "PC": PC, 462 "MSIZE": MSIZE, 463 "GAS": GAS, 464 "JUMPDEST": JUMPDEST, 465 "PUSH0": PUSH0, 466 "PUSH1": PUSH1, 467 "PUSH2": PUSH2, 468 "PUSH3": PUSH3, 469 "PUSH4": PUSH4, 470 "PUSH5": PUSH5, 471 "PUSH6": PUSH6, 472 "PUSH7": PUSH7, 473 "PUSH8": PUSH8, 474 "PUSH9": PUSH9, 475 "PUSH10": PUSH10, 476 "PUSH11": PUSH11, 477 "PUSH12": PUSH12, 478 "PUSH13": PUSH13, 479 "PUSH14": PUSH14, 480 "PUSH15": PUSH15, 481 "PUSH16": PUSH16, 482 "PUSH17": PUSH17, 483 "PUSH18": PUSH18, 484 "PUSH19": PUSH19, 485 "PUSH20": PUSH20, 486 "PUSH21": PUSH21, 487 "PUSH22": PUSH22, 488 "PUSH23": PUSH23, 489 "PUSH24": PUSH24, 490 "PUSH25": PUSH25, 491 "PUSH26": PUSH26, 492 "PUSH27": PUSH27, 493 "PUSH28": PUSH28, 494 "PUSH29": PUSH29, 495 "PUSH30": PUSH30, 496 "PUSH31": PUSH31, 497 "PUSH32": PUSH32, 498 "DUP1": DUP1, 499 "DUP2": DUP2, 500 "DUP3": DUP3, 501 "DUP4": DUP4, 502 "DUP5": DUP5, 503 "DUP6": DUP6, 504 "DUP7": DUP7, 505 "DUP8": DUP8, 506 "DUP9": DUP9, 507 "DUP10": DUP10, 508 "DUP11": DUP11, 509 "DUP12": DUP12, 510 "DUP13": DUP13, 511 "DUP14": DUP14, 512 "DUP15": DUP15, 513 "DUP16": DUP16, 514 "SWAP1": SWAP1, 515 "SWAP2": SWAP2, 516 "SWAP3": SWAP3, 517 "SWAP4": SWAP4, 518 "SWAP5": SWAP5, 519 "SWAP6": SWAP6, 520 "SWAP7": SWAP7, 521 "SWAP8": SWAP8, 522 "SWAP9": SWAP9, 523 "SWAP10": SWAP10, 524 "SWAP11": SWAP11, 525 "SWAP12": SWAP12, 526 "SWAP13": SWAP13, 527 "SWAP14": SWAP14, 528 "SWAP15": SWAP15, 529 "SWAP16": SWAP16, 530 "LOG0": LOG0, 531 "LOG1": LOG1, 532 "LOG2": LOG2, 533 "LOG3": LOG3, 534 "LOG4": LOG4, 535 "CREATE": CREATE, 536 "CREATE2": CREATE2, 537 "CALL": CALL, 538 "RETURN": RETURN, 539 "CALLCODE": CALLCODE, 540 "REVERT": REVERT, 541 "INVALID": INVALID, 542 "SELFDESTRUCT": SELFDESTRUCT, 543 } 544 545 // StringToOp finds the opcode whose name is stored in `str`. 546 func StringToOp(str string) OpCode { 547 return stringToOp[str] 548 }