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