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