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