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