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