github.com/klaytn/klaytn@v1.10.2/blockchain/vm/opcodes.go (about) 1 // Modifications Copyright 2018 The klaytn Authors 2 // Copyright 2015 The go-ethereum Authors 3 // This file is part of the go-ethereum library. 4 // 5 // The go-ethereum library is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Lesser General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // The go-ethereum library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Lesser General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public License 16 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 17 // 18 // This file is derived from core/vm/opcodes.go (2018/06/04). 19 // Modified and improved for the klaytn development. 20 21 package vm 22 23 import "fmt" 24 25 // OpCode is an EVM opcode 26 type OpCode byte 27 28 // IsPush specifies if an opcode is a PUSH opcode. 29 func (op OpCode) IsPush() bool { 30 switch op { 31 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: 32 return true 33 } 34 return false 35 } 36 37 // IsStaticJump specifies if an opcode is JUMP. 38 func (op OpCode) IsStaticJump() bool { 39 return op == JUMP 40 } 41 42 // 0x0 range - arithmetic ops. 43 const ( 44 STOP OpCode = iota 45 ADD 46 MUL 47 SUB 48 DIV 49 SDIV 50 MOD 51 SMOD 52 ADDMOD 53 MULMOD 54 EXP 55 SIGNEXTEND 56 ) 57 58 // 0x10 range - comparison ops. 59 const ( 60 LT OpCode = iota + 0x10 61 GT 62 SLT 63 SGT 64 EQ 65 ISZERO 66 AND 67 OR 68 XOR 69 NOT 70 BYTE 71 SHL 72 SHR 73 SAR 74 75 SHA3 = 0x20 76 ) 77 78 // 0x30 range - closure state. 79 const ( 80 ADDRESS OpCode = 0x30 + iota 81 BALANCE 82 ORIGIN 83 CALLER 84 CALLVALUE 85 CALLDATALOAD 86 CALLDATASIZE 87 CALLDATACOPY 88 CODESIZE 89 CODECOPY 90 GASPRICE 91 EXTCODESIZE 92 EXTCODECOPY 93 RETURNDATASIZE 94 RETURNDATACOPY 95 EXTCODEHASH 96 ) 97 98 // 0x40 range - block operations. 99 const ( 100 BLOCKHASH OpCode = 0x40 + iota 101 COINBASE 102 TIMESTAMP 103 NUMBER 104 DIFFICULTY OpCode = 0x44 105 PREVRANDAO OpCode = 0x44 106 GASLIMIT OpCode = 0x45 107 CHAINID OpCode = 0x46 108 SELFBALANCE OpCode = 0x47 109 BASEFEE OpCode = 0x48 110 ) 111 112 // 0x50 range - 'storage' and execution. 113 const ( 114 POP OpCode = 0x50 + iota 115 MLOAD 116 MSTORE 117 MSTORE8 118 SLOAD 119 SSTORE 120 JUMP 121 JUMPI 122 PC 123 MSIZE 124 GAS 125 JUMPDEST 126 ) 127 128 // 0x60 range. 129 const ( 130 PUSH1 OpCode = 0x60 + iota 131 PUSH2 132 PUSH3 133 PUSH4 134 PUSH5 135 PUSH6 136 PUSH7 137 PUSH8 138 PUSH9 139 PUSH10 140 PUSH11 141 PUSH12 142 PUSH13 143 PUSH14 144 PUSH15 145 PUSH16 146 PUSH17 147 PUSH18 148 PUSH19 149 PUSH20 150 PUSH21 151 PUSH22 152 PUSH23 153 PUSH24 154 PUSH25 155 PUSH26 156 PUSH27 157 PUSH28 158 PUSH29 159 PUSH30 160 PUSH31 161 PUSH32 162 DUP1 163 DUP2 164 DUP3 165 DUP4 166 DUP5 167 DUP6 168 DUP7 169 DUP8 170 DUP9 171 DUP10 172 DUP11 173 DUP12 174 DUP13 175 DUP14 176 DUP15 177 DUP16 178 SWAP1 179 SWAP2 180 SWAP3 181 SWAP4 182 SWAP5 183 SWAP6 184 SWAP7 185 SWAP8 186 SWAP9 187 SWAP10 188 SWAP11 189 SWAP12 190 SWAP13 191 SWAP14 192 SWAP15 193 SWAP16 194 ) 195 196 // 0xa0 range - logging ops. 197 const ( 198 LOG0 OpCode = 0xa0 + iota 199 LOG1 200 LOG2 201 LOG3 202 LOG4 203 ) 204 205 // unofficial opcodes used for parsing. 206 const ( 207 PUSH OpCode = 0xb0 + iota 208 DUP 209 SWAP 210 ) 211 212 // 0xf0 range - closures. 213 const ( 214 CREATE OpCode = 0xf0 + iota 215 CALL 216 CALLCODE 217 RETURN 218 DELEGATECALL 219 CREATE2 220 STATICCALL = 0xfa 221 222 REVERT = 0xfd 223 SELFDESTRUCT = 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 306 // 0x60 range - push. 307 PUSH1: "PUSH1", 308 PUSH2: "PUSH2", 309 PUSH3: "PUSH3", 310 PUSH4: "PUSH4", 311 PUSH5: "PUSH5", 312 PUSH6: "PUSH6", 313 PUSH7: "PUSH7", 314 PUSH8: "PUSH8", 315 PUSH9: "PUSH9", 316 PUSH10: "PUSH10", 317 PUSH11: "PUSH11", 318 PUSH12: "PUSH12", 319 PUSH13: "PUSH13", 320 PUSH14: "PUSH14", 321 PUSH15: "PUSH15", 322 PUSH16: "PUSH16", 323 PUSH17: "PUSH17", 324 PUSH18: "PUSH18", 325 PUSH19: "PUSH19", 326 PUSH20: "PUSH20", 327 PUSH21: "PUSH21", 328 PUSH22: "PUSH22", 329 PUSH23: "PUSH23", 330 PUSH24: "PUSH24", 331 PUSH25: "PUSH25", 332 PUSH26: "PUSH26", 333 PUSH27: "PUSH27", 334 PUSH28: "PUSH28", 335 PUSH29: "PUSH29", 336 PUSH30: "PUSH30", 337 PUSH31: "PUSH31", 338 PUSH32: "PUSH32", 339 340 DUP1: "DUP1", 341 DUP2: "DUP2", 342 DUP3: "DUP3", 343 DUP4: "DUP4", 344 DUP5: "DUP5", 345 DUP6: "DUP6", 346 DUP7: "DUP7", 347 DUP8: "DUP8", 348 DUP9: "DUP9", 349 DUP10: "DUP10", 350 DUP11: "DUP11", 351 DUP12: "DUP12", 352 DUP13: "DUP13", 353 DUP14: "DUP14", 354 DUP15: "DUP15", 355 DUP16: "DUP16", 356 357 SWAP1: "SWAP1", 358 SWAP2: "SWAP2", 359 SWAP3: "SWAP3", 360 SWAP4: "SWAP4", 361 SWAP5: "SWAP5", 362 SWAP6: "SWAP6", 363 SWAP7: "SWAP7", 364 SWAP8: "SWAP8", 365 SWAP9: "SWAP9", 366 SWAP10: "SWAP10", 367 SWAP11: "SWAP11", 368 SWAP12: "SWAP12", 369 SWAP13: "SWAP13", 370 SWAP14: "SWAP14", 371 SWAP15: "SWAP15", 372 SWAP16: "SWAP16", 373 LOG0: "LOG0", 374 LOG1: "LOG1", 375 LOG2: "LOG2", 376 LOG3: "LOG3", 377 LOG4: "LOG4", 378 379 // 0xf0 range. 380 CREATE: "CREATE", 381 CALL: "CALL", 382 RETURN: "RETURN", 383 CALLCODE: "CALLCODE", 384 DELEGATECALL: "DELEGATECALL", 385 CREATE2: "CREATE2", 386 STATICCALL: "STATICCALL", 387 REVERT: "REVERT", 388 SELFDESTRUCT: "SELFDESTRUCT", 389 390 PUSH: "PUSH", 391 DUP: "DUP", 392 SWAP: "SWAP", 393 } 394 395 func (op OpCode) String() string { 396 str := opCodeToString[op] 397 if len(str) == 0 { 398 return fmt.Sprintf("Missing opcode 0x%x", int(op)) 399 } 400 401 return str 402 } 403 404 var stringToOp = map[string]OpCode{ 405 "STOP": STOP, 406 "ADD": ADD, 407 "MUL": MUL, 408 "SUB": SUB, 409 "DIV": DIV, 410 "SDIV": SDIV, 411 "MOD": MOD, 412 "SMOD": SMOD, 413 "EXP": EXP, 414 "NOT": NOT, 415 "LT": LT, 416 "GT": GT, 417 "SLT": SLT, 418 "SGT": SGT, 419 "EQ": EQ, 420 "ISZERO": ISZERO, 421 "SIGNEXTEND": SIGNEXTEND, 422 "AND": AND, 423 "OR": OR, 424 "XOR": XOR, 425 "BYTE": BYTE, 426 "SHL": SHL, 427 "SHR": SHR, 428 "SAR": SAR, 429 "ADDMOD": ADDMOD, 430 "MULMOD": MULMOD, 431 "SHA3": SHA3, 432 "ADDRESS": ADDRESS, 433 "BALANCE": BALANCE, 434 "ORIGIN": ORIGIN, 435 "CALLER": CALLER, 436 "CALLVALUE": CALLVALUE, 437 "CALLDATALOAD": CALLDATALOAD, 438 "CALLDATASIZE": CALLDATASIZE, 439 "CALLDATACOPY": CALLDATACOPY, 440 "CHAINID": CHAINID, 441 "BASEFEE": BASEFEE, 442 "DELEGATECALL": DELEGATECALL, 443 "STATICCALL": STATICCALL, 444 "CODESIZE": CODESIZE, 445 "CODECOPY": CODECOPY, 446 "GASPRICE": GASPRICE, 447 "EXTCODESIZE": EXTCODESIZE, 448 "EXTCODECOPY": EXTCODECOPY, 449 "RETURNDATASIZE": RETURNDATASIZE, 450 "RETURNDATACOPY": RETURNDATACOPY, 451 "EXTCODEHASH": EXTCODEHASH, 452 "BLOCKHASH": BLOCKHASH, 453 "COINBASE": COINBASE, 454 "TIMESTAMP": TIMESTAMP, 455 "NUMBER": NUMBER, 456 "DIFFICULTY": DIFFICULTY, 457 "GASLIMIT": GASLIMIT, 458 "SELFBALANCE": SELFBALANCE, 459 "POP": POP, 460 "MLOAD": MLOAD, 461 "MSTORE": MSTORE, 462 "MSTORE8": MSTORE8, 463 "SLOAD": SLOAD, 464 "SSTORE": SSTORE, 465 "JUMP": JUMP, 466 "JUMPI": JUMPI, 467 "PC": PC, 468 "MSIZE": MSIZE, 469 "GAS": GAS, 470 "JUMPDEST": JUMPDEST, 471 "PUSH1": PUSH1, 472 "PUSH2": PUSH2, 473 "PUSH3": PUSH3, 474 "PUSH4": PUSH4, 475 "PUSH5": PUSH5, 476 "PUSH6": PUSH6, 477 "PUSH7": PUSH7, 478 "PUSH8": PUSH8, 479 "PUSH9": PUSH9, 480 "PUSH10": PUSH10, 481 "PUSH11": PUSH11, 482 "PUSH12": PUSH12, 483 "PUSH13": PUSH13, 484 "PUSH14": PUSH14, 485 "PUSH15": PUSH15, 486 "PUSH16": PUSH16, 487 "PUSH17": PUSH17, 488 "PUSH18": PUSH18, 489 "PUSH19": PUSH19, 490 "PUSH20": PUSH20, 491 "PUSH21": PUSH21, 492 "PUSH22": PUSH22, 493 "PUSH23": PUSH23, 494 "PUSH24": PUSH24, 495 "PUSH25": PUSH25, 496 "PUSH26": PUSH26, 497 "PUSH27": PUSH27, 498 "PUSH28": PUSH28, 499 "PUSH29": PUSH29, 500 "PUSH30": PUSH30, 501 "PUSH31": PUSH31, 502 "PUSH32": PUSH32, 503 "DUP1": DUP1, 504 "DUP2": DUP2, 505 "DUP3": DUP3, 506 "DUP4": DUP4, 507 "DUP5": DUP5, 508 "DUP6": DUP6, 509 "DUP7": DUP7, 510 "DUP8": DUP8, 511 "DUP9": DUP9, 512 "DUP10": DUP10, 513 "DUP11": DUP11, 514 "DUP12": DUP12, 515 "DUP13": DUP13, 516 "DUP14": DUP14, 517 "DUP15": DUP15, 518 "DUP16": DUP16, 519 "SWAP1": SWAP1, 520 "SWAP2": SWAP2, 521 "SWAP3": SWAP3, 522 "SWAP4": SWAP4, 523 "SWAP5": SWAP5, 524 "SWAP6": SWAP6, 525 "SWAP7": SWAP7, 526 "SWAP8": SWAP8, 527 "SWAP9": SWAP9, 528 "SWAP10": SWAP10, 529 "SWAP11": SWAP11, 530 "SWAP12": SWAP12, 531 "SWAP13": SWAP13, 532 "SWAP14": SWAP14, 533 "SWAP15": SWAP15, 534 "SWAP16": SWAP16, 535 "LOG0": LOG0, 536 "LOG1": LOG1, 537 "LOG2": LOG2, 538 "LOG3": LOG3, 539 "LOG4": LOG4, 540 "CREATE": CREATE, 541 "CREATE2": CREATE2, 542 "CALL": CALL, 543 "RETURN": RETURN, 544 "CALLCODE": CALLCODE, 545 "REVERT": REVERT, 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 }