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