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