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