github.com/luckypickle/go-ethereum-vet@v1.14.2/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 // 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 SHA3: "SHA3", 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 281 // 0x50 range - 'storage' and execution. 282 POP: "POP", 283 //DUP: "DUP", 284 //SWAP: "SWAP", 285 MLOAD: "MLOAD", 286 MSTORE: "MSTORE", 287 MSTORE8: "MSTORE8", 288 SLOAD: "SLOAD", 289 SSTORE: "SSTORE", 290 JUMP: "JUMP", 291 JUMPI: "JUMPI", 292 PC: "PC", 293 MSIZE: "MSIZE", 294 GAS: "GAS", 295 JUMPDEST: "JUMPDEST", 296 297 // 0x60 range - push. 298 PUSH1: "PUSH1", 299 PUSH2: "PUSH2", 300 PUSH3: "PUSH3", 301 PUSH4: "PUSH4", 302 PUSH5: "PUSH5", 303 PUSH6: "PUSH6", 304 PUSH7: "PUSH7", 305 PUSH8: "PUSH8", 306 PUSH9: "PUSH9", 307 PUSH10: "PUSH10", 308 PUSH11: "PUSH11", 309 PUSH12: "PUSH12", 310 PUSH13: "PUSH13", 311 PUSH14: "PUSH14", 312 PUSH15: "PUSH15", 313 PUSH16: "PUSH16", 314 PUSH17: "PUSH17", 315 PUSH18: "PUSH18", 316 PUSH19: "PUSH19", 317 PUSH20: "PUSH20", 318 PUSH21: "PUSH21", 319 PUSH22: "PUSH22", 320 PUSH23: "PUSH23", 321 PUSH24: "PUSH24", 322 PUSH25: "PUSH25", 323 PUSH26: "PUSH26", 324 PUSH27: "PUSH27", 325 PUSH28: "PUSH28", 326 PUSH29: "PUSH29", 327 PUSH30: "PUSH30", 328 PUSH31: "PUSH31", 329 PUSH32: "PUSH32", 330 331 DUP1: "DUP1", 332 DUP2: "DUP2", 333 DUP3: "DUP3", 334 DUP4: "DUP4", 335 DUP5: "DUP5", 336 DUP6: "DUP6", 337 DUP7: "DUP7", 338 DUP8: "DUP8", 339 DUP9: "DUP9", 340 DUP10: "DUP10", 341 DUP11: "DUP11", 342 DUP12: "DUP12", 343 DUP13: "DUP13", 344 DUP14: "DUP14", 345 DUP15: "DUP15", 346 DUP16: "DUP16", 347 348 SWAP1: "SWAP1", 349 SWAP2: "SWAP2", 350 SWAP3: "SWAP3", 351 SWAP4: "SWAP4", 352 SWAP5: "SWAP5", 353 SWAP6: "SWAP6", 354 SWAP7: "SWAP7", 355 SWAP8: "SWAP8", 356 SWAP9: "SWAP9", 357 SWAP10: "SWAP10", 358 SWAP11: "SWAP11", 359 SWAP12: "SWAP12", 360 SWAP13: "SWAP13", 361 SWAP14: "SWAP14", 362 SWAP15: "SWAP15", 363 SWAP16: "SWAP16", 364 LOG0: "LOG0", 365 LOG1: "LOG1", 366 LOG2: "LOG2", 367 LOG3: "LOG3", 368 LOG4: "LOG4", 369 370 // 0xf0 range. 371 CREATE: "CREATE", 372 CALL: "CALL", 373 RETURN: "RETURN", 374 CALLCODE: "CALLCODE", 375 DELEGATECALL: "DELEGATECALL", 376 CREATE2: "CREATE2", 377 STATICCALL: "STATICCALL", 378 REVERT: "REVERT", 379 SELFDESTRUCT: "SELFDESTRUCT", 380 381 PUSH: "PUSH", 382 DUP: "DUP", 383 SWAP: "SWAP", 384 } 385 386 func (op OpCode) String() string { 387 str := opCodeToString[op] 388 if len(str) == 0 { 389 return fmt.Sprintf("Missing opcode 0x%x", 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 "SHA3": SHA3, 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 "DELEGATECALL": DELEGATECALL, 432 "STATICCALL": STATICCALL, 433 "CODESIZE": CODESIZE, 434 "CODECOPY": CODECOPY, 435 "GASPRICE": GASPRICE, 436 "EXTCODESIZE": EXTCODESIZE, 437 "EXTCODECOPY": EXTCODECOPY, 438 "RETURNDATASIZE": RETURNDATASIZE, 439 "RETURNDATACOPY": RETURNDATACOPY, 440 "EXTCODEHASH": EXTCODEHASH, 441 "BLOCKHASH": BLOCKHASH, 442 "COINBASE": COINBASE, 443 "TIMESTAMP": TIMESTAMP, 444 "NUMBER": NUMBER, 445 "DIFFICULTY": DIFFICULTY, 446 "GASLIMIT": GASLIMIT, 447 "POP": POP, 448 "MLOAD": MLOAD, 449 "MSTORE": MSTORE, 450 "MSTORE8": MSTORE8, 451 "SLOAD": SLOAD, 452 "SSTORE": SSTORE, 453 "JUMP": JUMP, 454 "JUMPI": JUMPI, 455 "PC": PC, 456 "MSIZE": MSIZE, 457 "GAS": GAS, 458 "JUMPDEST": JUMPDEST, 459 "PUSH1": PUSH1, 460 "PUSH2": PUSH2, 461 "PUSH3": PUSH3, 462 "PUSH4": PUSH4, 463 "PUSH5": PUSH5, 464 "PUSH6": PUSH6, 465 "PUSH7": PUSH7, 466 "PUSH8": PUSH8, 467 "PUSH9": PUSH9, 468 "PUSH10": PUSH10, 469 "PUSH11": PUSH11, 470 "PUSH12": PUSH12, 471 "PUSH13": PUSH13, 472 "PUSH14": PUSH14, 473 "PUSH15": PUSH15, 474 "PUSH16": PUSH16, 475 "PUSH17": PUSH17, 476 "PUSH18": PUSH18, 477 "PUSH19": PUSH19, 478 "PUSH20": PUSH20, 479 "PUSH21": PUSH21, 480 "PUSH22": PUSH22, 481 "PUSH23": PUSH23, 482 "PUSH24": PUSH24, 483 "PUSH25": PUSH25, 484 "PUSH26": PUSH26, 485 "PUSH27": PUSH27, 486 "PUSH28": PUSH28, 487 "PUSH29": PUSH29, 488 "PUSH30": PUSH30, 489 "PUSH31": PUSH31, 490 "PUSH32": PUSH32, 491 "DUP1": DUP1, 492 "DUP2": DUP2, 493 "DUP3": DUP3, 494 "DUP4": DUP4, 495 "DUP5": DUP5, 496 "DUP6": DUP6, 497 "DUP7": DUP7, 498 "DUP8": DUP8, 499 "DUP9": DUP9, 500 "DUP10": DUP10, 501 "DUP11": DUP11, 502 "DUP12": DUP12, 503 "DUP13": DUP13, 504 "DUP14": DUP14, 505 "DUP15": DUP15, 506 "DUP16": DUP16, 507 "SWAP1": SWAP1, 508 "SWAP2": SWAP2, 509 "SWAP3": SWAP3, 510 "SWAP4": SWAP4, 511 "SWAP5": SWAP5, 512 "SWAP6": SWAP6, 513 "SWAP7": SWAP7, 514 "SWAP8": SWAP8, 515 "SWAP9": SWAP9, 516 "SWAP10": SWAP10, 517 "SWAP11": SWAP11, 518 "SWAP12": SWAP12, 519 "SWAP13": SWAP13, 520 "SWAP14": SWAP14, 521 "SWAP15": SWAP15, 522 "SWAP16": SWAP16, 523 "LOG0": LOG0, 524 "LOG1": LOG1, 525 "LOG2": LOG2, 526 "LOG3": LOG3, 527 "LOG4": LOG4, 528 "CREATE": CREATE, 529 "CREATE2": CREATE2, 530 "CALL": CALL, 531 "RETURN": RETURN, 532 "CALLCODE": CALLCODE, 533 "REVERT": REVERT, 534 "SELFDESTRUCT": SELFDESTRUCT, 535 } 536 537 // StringToOp finds the opcode whose name is stored in `str`. 538 func StringToOp(str string) OpCode { 539 return stringToOp[str] 540 }