github.com/theQRL/go-zond@v0.2.1/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 ZVM opcode 24 type OpCode byte 25 26 // IsPush specifies if an opcode is a PUSH opcode. 27 func (op OpCode) IsPush() bool { 28 return PUSH0 <= op && op <= PUSH32 29 } 30 31 // 0x0 range - arithmetic ops. 32 const ( 33 STOP OpCode = 0x0 34 ADD OpCode = 0x1 35 MUL OpCode = 0x2 36 SUB OpCode = 0x3 37 DIV OpCode = 0x4 38 SDIV OpCode = 0x5 39 MOD OpCode = 0x6 40 SMOD OpCode = 0x7 41 ADDMOD OpCode = 0x8 42 MULMOD OpCode = 0x9 43 EXP OpCode = 0xa 44 SIGNEXTEND OpCode = 0xb 45 ) 46 47 // 0x10 range - comparison ops. 48 const ( 49 LT OpCode = 0x10 50 GT OpCode = 0x11 51 SLT OpCode = 0x12 52 SGT OpCode = 0x13 53 EQ OpCode = 0x14 54 ISZERO OpCode = 0x15 55 AND OpCode = 0x16 56 OR OpCode = 0x17 57 XOR OpCode = 0x18 58 NOT OpCode = 0x19 59 BYTE OpCode = 0x1a 60 SHL OpCode = 0x1b 61 SHR OpCode = 0x1c 62 SAR OpCode = 0x1d 63 ) 64 65 // 0x20 range - crypto. 66 const ( 67 KECCAK256 OpCode = 0x20 68 ) 69 70 // 0x30 range - closure state. 71 const ( 72 ADDRESS OpCode = 0x30 73 BALANCE OpCode = 0x31 74 ORIGIN OpCode = 0x32 75 CALLER OpCode = 0x33 76 CALLVALUE OpCode = 0x34 77 CALLDATALOAD OpCode = 0x35 78 CALLDATASIZE OpCode = 0x36 79 CALLDATACOPY OpCode = 0x37 80 CODESIZE OpCode = 0x38 81 CODECOPY OpCode = 0x39 82 GASPRICE OpCode = 0x3a 83 EXTCODESIZE OpCode = 0x3b 84 EXTCODECOPY OpCode = 0x3c 85 RETURNDATASIZE OpCode = 0x3d 86 RETURNDATACOPY OpCode = 0x3e 87 EXTCODEHASH OpCode = 0x3f 88 ) 89 90 // 0x40 range - block operations. 91 const ( 92 BLOCKHASH OpCode = 0x40 93 COINBASE OpCode = 0x41 94 TIMESTAMP OpCode = 0x42 95 NUMBER OpCode = 0x43 96 RANDOM OpCode = 0x44 97 PREVRANDAO 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 PUSH0 OpCode = 0x5f 119 ) 120 121 // 0x60 range - pushes. 122 const ( 123 PUSH1 OpCode = 0x60 + iota 124 PUSH2 125 PUSH3 126 PUSH4 127 PUSH5 128 PUSH6 129 PUSH7 130 PUSH8 131 PUSH9 132 PUSH10 133 PUSH11 134 PUSH12 135 PUSH13 136 PUSH14 137 PUSH15 138 PUSH16 139 PUSH17 140 PUSH18 141 PUSH19 142 PUSH20 143 PUSH21 144 PUSH22 145 PUSH23 146 PUSH24 147 PUSH25 148 PUSH26 149 PUSH27 150 PUSH28 151 PUSH29 152 PUSH30 153 PUSH31 154 PUSH32 155 ) 156 157 // 0x80 range - dups. 158 const ( 159 DUP1 = 0x80 + iota 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 ) 176 177 // 0x90 range - swaps. 178 const ( 179 SWAP1 = 0x90 + iota 180 SWAP2 181 SWAP3 182 SWAP4 183 SWAP5 184 SWAP6 185 SWAP7 186 SWAP8 187 SWAP9 188 SWAP10 189 SWAP11 190 SWAP12 191 SWAP13 192 SWAP14 193 SWAP15 194 SWAP16 195 ) 196 197 // 0xa0 range - logging ops. 198 const ( 199 LOG0 OpCode = 0xa0 + iota 200 LOG1 201 LOG2 202 LOG3 203 LOG4 204 ) 205 206 // 0xf0 range - closures. 207 const ( 208 CREATE OpCode = 0xf0 209 CALL OpCode = 0xf1 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 ) 218 219 // Since the opcodes aren't all in order we can't use a regular slice. 220 var opCodeToString = map[OpCode]string{ 221 // 0x0 range - arithmetic ops. 222 STOP: "STOP", 223 ADD: "ADD", 224 MUL: "MUL", 225 SUB: "SUB", 226 DIV: "DIV", 227 SDIV: "SDIV", 228 MOD: "MOD", 229 SMOD: "SMOD", 230 EXP: "EXP", 231 NOT: "NOT", 232 LT: "LT", 233 GT: "GT", 234 SLT: "SLT", 235 SGT: "SGT", 236 EQ: "EQ", 237 ISZERO: "ISZERO", 238 SIGNEXTEND: "SIGNEXTEND", 239 240 // 0x10 range - bit ops. 241 AND: "AND", 242 OR: "OR", 243 XOR: "XOR", 244 BYTE: "BYTE", 245 SHL: "SHL", 246 SHR: "SHR", 247 SAR: "SAR", 248 ADDMOD: "ADDMOD", 249 MULMOD: "MULMOD", 250 251 // 0x20 range - crypto. 252 KECCAK256: "KECCAK256", 253 254 // 0x30 range - closure state. 255 ADDRESS: "ADDRESS", 256 BALANCE: "BALANCE", 257 ORIGIN: "ORIGIN", 258 CALLER: "CALLER", 259 CALLVALUE: "CALLVALUE", 260 CALLDATALOAD: "CALLDATALOAD", 261 CALLDATASIZE: "CALLDATASIZE", 262 CALLDATACOPY: "CALLDATACOPY", 263 CODESIZE: "CODESIZE", 264 CODECOPY: "CODECOPY", 265 GASPRICE: "GASPRICE", 266 EXTCODESIZE: "EXTCODESIZE", 267 EXTCODECOPY: "EXTCODECOPY", 268 RETURNDATASIZE: "RETURNDATASIZE", 269 RETURNDATACOPY: "RETURNDATACOPY", 270 EXTCODEHASH: "EXTCODEHASH", 271 272 // 0x40 range - block operations. 273 BLOCKHASH: "BLOCKHASH", 274 COINBASE: "COINBASE", 275 TIMESTAMP: "TIMESTAMP", 276 NUMBER: "NUMBER", 277 PREVRANDAO: "PREVRANDAO", 278 GASLIMIT: "GASLIMIT", 279 CHAINID: "CHAINID", 280 SELFBALANCE: "SELFBALANCE", 281 BASEFEE: "BASEFEE", 282 283 // 0x50 range - 'storage' and execution. 284 POP: "POP", 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 PUSH0: "PUSH0", 297 298 // 0x60 range - pushes. 299 PUSH1: "PUSH1", 300 PUSH2: "PUSH2", 301 PUSH3: "PUSH3", 302 PUSH4: "PUSH4", 303 PUSH5: "PUSH5", 304 PUSH6: "PUSH6", 305 PUSH7: "PUSH7", 306 PUSH8: "PUSH8", 307 PUSH9: "PUSH9", 308 PUSH10: "PUSH10", 309 PUSH11: "PUSH11", 310 PUSH12: "PUSH12", 311 PUSH13: "PUSH13", 312 PUSH14: "PUSH14", 313 PUSH15: "PUSH15", 314 PUSH16: "PUSH16", 315 PUSH17: "PUSH17", 316 PUSH18: "PUSH18", 317 PUSH19: "PUSH19", 318 PUSH20: "PUSH20", 319 PUSH21: "PUSH21", 320 PUSH22: "PUSH22", 321 PUSH23: "PUSH23", 322 PUSH24: "PUSH24", 323 PUSH25: "PUSH25", 324 PUSH26: "PUSH26", 325 PUSH27: "PUSH27", 326 PUSH28: "PUSH28", 327 PUSH29: "PUSH29", 328 PUSH30: "PUSH30", 329 PUSH31: "PUSH31", 330 PUSH32: "PUSH32", 331 332 // 0x80 - dups. 333 DUP1: "DUP1", 334 DUP2: "DUP2", 335 DUP3: "DUP3", 336 DUP4: "DUP4", 337 DUP5: "DUP5", 338 DUP6: "DUP6", 339 DUP7: "DUP7", 340 DUP8: "DUP8", 341 DUP9: "DUP9", 342 DUP10: "DUP10", 343 DUP11: "DUP11", 344 DUP12: "DUP12", 345 DUP13: "DUP13", 346 DUP14: "DUP14", 347 DUP15: "DUP15", 348 DUP16: "DUP16", 349 350 // 0x90 - swaps. 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 368 // 0xa0 range - logging ops. 369 LOG0: "LOG0", 370 LOG1: "LOG1", 371 LOG2: "LOG2", 372 LOG3: "LOG3", 373 LOG4: "LOG4", 374 375 // 0xf0 range - closures. 376 CREATE: "CREATE", 377 CALL: "CALL", 378 RETURN: "RETURN", 379 DELEGATECALL: "DELEGATECALL", 380 CREATE2: "CREATE2", 381 STATICCALL: "STATICCALL", 382 REVERT: "REVERT", 383 INVALID: "INVALID", 384 } 385 386 func (op OpCode) String() string { 387 str := opCodeToString[op] 388 if len(str) == 0 { 389 return fmt.Sprintf("opcode %#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 "PREVRANDAO": PREVRANDAO, 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 "PUSH0": PUSH0, 463 "PUSH1": PUSH1, 464 "PUSH2": PUSH2, 465 "PUSH3": PUSH3, 466 "PUSH4": PUSH4, 467 "PUSH5": PUSH5, 468 "PUSH6": PUSH6, 469 "PUSH7": PUSH7, 470 "PUSH8": PUSH8, 471 "PUSH9": PUSH9, 472 "PUSH10": PUSH10, 473 "PUSH11": PUSH11, 474 "PUSH12": PUSH12, 475 "PUSH13": PUSH13, 476 "PUSH14": PUSH14, 477 "PUSH15": PUSH15, 478 "PUSH16": PUSH16, 479 "PUSH17": PUSH17, 480 "PUSH18": PUSH18, 481 "PUSH19": PUSH19, 482 "PUSH20": PUSH20, 483 "PUSH21": PUSH21, 484 "PUSH22": PUSH22, 485 "PUSH23": PUSH23, 486 "PUSH24": PUSH24, 487 "PUSH25": PUSH25, 488 "PUSH26": PUSH26, 489 "PUSH27": PUSH27, 490 "PUSH28": PUSH28, 491 "PUSH29": PUSH29, 492 "PUSH30": PUSH30, 493 "PUSH31": PUSH31, 494 "PUSH32": PUSH32, 495 "DUP1": DUP1, 496 "DUP2": DUP2, 497 "DUP3": DUP3, 498 "DUP4": DUP4, 499 "DUP5": DUP5, 500 "DUP6": DUP6, 501 "DUP7": DUP7, 502 "DUP8": DUP8, 503 "DUP9": DUP9, 504 "DUP10": DUP10, 505 "DUP11": DUP11, 506 "DUP12": DUP12, 507 "DUP13": DUP13, 508 "DUP14": DUP14, 509 "DUP15": DUP15, 510 "DUP16": DUP16, 511 "SWAP1": SWAP1, 512 "SWAP2": SWAP2, 513 "SWAP3": SWAP3, 514 "SWAP4": SWAP4, 515 "SWAP5": SWAP5, 516 "SWAP6": SWAP6, 517 "SWAP7": SWAP7, 518 "SWAP8": SWAP8, 519 "SWAP9": SWAP9, 520 "SWAP10": SWAP10, 521 "SWAP11": SWAP11, 522 "SWAP12": SWAP12, 523 "SWAP13": SWAP13, 524 "SWAP14": SWAP14, 525 "SWAP15": SWAP15, 526 "SWAP16": SWAP16, 527 "LOG0": LOG0, 528 "LOG1": LOG1, 529 "LOG2": LOG2, 530 "LOG3": LOG3, 531 "LOG4": LOG4, 532 "CREATE": CREATE, 533 "CREATE2": CREATE2, 534 "CALL": CALL, 535 "RETURN": RETURN, 536 "REVERT": REVERT, 537 "INVALID": INVALID, 538 } 539 540 // StringToOp finds the opcode whose name is stored in `str`. 541 func StringToOp(str string) OpCode { 542 return stringToOp[str] 543 }