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