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