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