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