github.com/jeffallen/go-ethereum@v1.1.4-0.20150910155051-571d3236c49c/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 type OpCode byte 24 25 // Op codes 26 const ( 27 // 0x0 range - arithmetic ops 28 STOP OpCode = iota 29 ADD 30 MUL 31 SUB 32 DIV 33 SDIV 34 MOD 35 SMOD 36 ADDMOD 37 MULMOD 38 EXP 39 SIGNEXTEND 40 ) 41 42 const ( 43 LT OpCode = iota + 0x10 44 GT 45 SLT 46 SGT 47 EQ 48 ISZERO 49 AND 50 OR 51 XOR 52 NOT 53 BYTE 54 55 SHA3 = 0x20 56 ) 57 58 const ( 59 // 0x30 range - closure state 60 ADDRESS OpCode = 0x30 + iota 61 BALANCE 62 ORIGIN 63 CALLER 64 CALLVALUE 65 CALLDATALOAD 66 CALLDATASIZE 67 CALLDATACOPY 68 CODESIZE 69 CODECOPY 70 GASPRICE 71 EXTCODESIZE 72 EXTCODECOPY 73 ) 74 75 const ( 76 77 // 0x40 range - block operations 78 BLOCKHASH OpCode = 0x40 + iota 79 COINBASE 80 TIMESTAMP 81 NUMBER 82 DIFFICULTY 83 GASLIMIT 84 ) 85 86 const ( 87 // 0x50 range - 'storage' and execution 88 POP OpCode = 0x50 + iota 89 MLOAD 90 MSTORE 91 MSTORE8 92 SLOAD 93 SSTORE 94 JUMP 95 JUMPI 96 PC 97 MSIZE 98 GAS 99 JUMPDEST 100 ) 101 102 const ( 103 // 0x60 range 104 PUSH1 OpCode = 0x60 + iota 105 PUSH2 106 PUSH3 107 PUSH4 108 PUSH5 109 PUSH6 110 PUSH7 111 PUSH8 112 PUSH9 113 PUSH10 114 PUSH11 115 PUSH12 116 PUSH13 117 PUSH14 118 PUSH15 119 PUSH16 120 PUSH17 121 PUSH18 122 PUSH19 123 PUSH20 124 PUSH21 125 PUSH22 126 PUSH23 127 PUSH24 128 PUSH25 129 PUSH26 130 PUSH27 131 PUSH28 132 PUSH29 133 PUSH30 134 PUSH31 135 PUSH32 136 DUP1 137 DUP2 138 DUP3 139 DUP4 140 DUP5 141 DUP6 142 DUP7 143 DUP8 144 DUP9 145 DUP10 146 DUP11 147 DUP12 148 DUP13 149 DUP14 150 DUP15 151 DUP16 152 SWAP1 153 SWAP2 154 SWAP3 155 SWAP4 156 SWAP5 157 SWAP6 158 SWAP7 159 SWAP8 160 SWAP9 161 SWAP10 162 SWAP11 163 SWAP12 164 SWAP13 165 SWAP14 166 SWAP15 167 SWAP16 168 ) 169 170 const ( 171 LOG0 OpCode = 0xa0 + iota 172 LOG1 173 LOG2 174 LOG3 175 LOG4 176 ) 177 178 const ( 179 // 0xf0 range - closures 180 CREATE OpCode = 0xf0 + iota 181 CALL 182 CALLCODE 183 RETURN 184 185 // 0x70 range - other 186 SUICIDE = 0xff 187 ) 188 189 // Since the opcodes aren't all in order we can't use a regular slice 190 var opCodeToString = map[OpCode]string{ 191 // 0x0 range - arithmetic ops 192 STOP: "STOP", 193 ADD: "ADD", 194 MUL: "MUL", 195 SUB: "SUB", 196 DIV: "DIV", 197 SDIV: "SDIV", 198 MOD: "MOD", 199 SMOD: "SMOD", 200 EXP: "EXP", 201 NOT: "NOT", 202 LT: "LT", 203 GT: "GT", 204 SLT: "SLT", 205 SGT: "SGT", 206 EQ: "EQ", 207 ISZERO: "ISZERO", 208 SIGNEXTEND: "SIGNEXTEND", 209 210 // 0x10 range - bit ops 211 AND: "AND", 212 OR: "OR", 213 XOR: "XOR", 214 BYTE: "BYTE", 215 ADDMOD: "ADDMOD", 216 MULMOD: "MULMOD", 217 218 // 0x20 range - crypto 219 SHA3: "SHA3", 220 221 // 0x30 range - closure state 222 ADDRESS: "ADDRESS", 223 BALANCE: "BALANCE", 224 ORIGIN: "ORIGIN", 225 CALLER: "CALLER", 226 CALLVALUE: "CALLVALUE", 227 CALLDATALOAD: "CALLDATALOAD", 228 CALLDATASIZE: "CALLDATASIZE", 229 CALLDATACOPY: "CALLDATACOPY", 230 CODESIZE: "CODESIZE", 231 CODECOPY: "CODECOPY", 232 GASPRICE: "TXGASPRICE", 233 234 // 0x40 range - block operations 235 BLOCKHASH: "BLOCKHASH", 236 COINBASE: "COINBASE", 237 TIMESTAMP: "TIMESTAMP", 238 NUMBER: "NUMBER", 239 DIFFICULTY: "DIFFICULTY", 240 GASLIMIT: "GASLIMIT", 241 EXTCODESIZE: "EXTCODESIZE", 242 EXTCODECOPY: "EXTCODECOPY", 243 244 // 0x50 range - 'storage' and execution 245 POP: "POP", 246 //DUP: "DUP", 247 //SWAP: "SWAP", 248 MLOAD: "MLOAD", 249 MSTORE: "MSTORE", 250 MSTORE8: "MSTORE8", 251 SLOAD: "SLOAD", 252 SSTORE: "SSTORE", 253 JUMP: "JUMP", 254 JUMPI: "JUMPI", 255 PC: "PC", 256 MSIZE: "MSIZE", 257 GAS: "GAS", 258 JUMPDEST: "JUMPDEST", 259 260 // 0x60 range - push 261 PUSH1: "PUSH1", 262 PUSH2: "PUSH2", 263 PUSH3: "PUSH3", 264 PUSH4: "PUSH4", 265 PUSH5: "PUSH5", 266 PUSH6: "PUSH6", 267 PUSH7: "PUSH7", 268 PUSH8: "PUSH8", 269 PUSH9: "PUSH9", 270 PUSH10: "PUSH10", 271 PUSH11: "PUSH11", 272 PUSH12: "PUSH12", 273 PUSH13: "PUSH13", 274 PUSH14: "PUSH14", 275 PUSH15: "PUSH15", 276 PUSH16: "PUSH16", 277 PUSH17: "PUSH17", 278 PUSH18: "PUSH18", 279 PUSH19: "PUSH19", 280 PUSH20: "PUSH20", 281 PUSH21: "PUSH21", 282 PUSH22: "PUSH22", 283 PUSH23: "PUSH23", 284 PUSH24: "PUSH24", 285 PUSH25: "PUSH25", 286 PUSH26: "PUSH26", 287 PUSH27: "PUSH27", 288 PUSH28: "PUSH28", 289 PUSH29: "PUSH29", 290 PUSH30: "PUSH30", 291 PUSH31: "PUSH31", 292 PUSH32: "PUSH32", 293 294 DUP1: "DUP1", 295 DUP2: "DUP2", 296 DUP3: "DUP3", 297 DUP4: "DUP4", 298 DUP5: "DUP5", 299 DUP6: "DUP6", 300 DUP7: "DUP7", 301 DUP8: "DUP8", 302 DUP9: "DUP9", 303 DUP10: "DUP10", 304 DUP11: "DUP11", 305 DUP12: "DUP12", 306 DUP13: "DUP13", 307 DUP14: "DUP14", 308 DUP15: "DUP15", 309 DUP16: "DUP16", 310 311 SWAP1: "SWAP1", 312 SWAP2: "SWAP2", 313 SWAP3: "SWAP3", 314 SWAP4: "SWAP4", 315 SWAP5: "SWAP5", 316 SWAP6: "SWAP6", 317 SWAP7: "SWAP7", 318 SWAP8: "SWAP8", 319 SWAP9: "SWAP9", 320 SWAP10: "SWAP10", 321 SWAP11: "SWAP11", 322 SWAP12: "SWAP12", 323 SWAP13: "SWAP13", 324 SWAP14: "SWAP14", 325 SWAP15: "SWAP15", 326 SWAP16: "SWAP16", 327 LOG0: "LOG0", 328 LOG1: "LOG1", 329 LOG2: "LOG2", 330 LOG3: "LOG3", 331 LOG4: "LOG4", 332 333 // 0xf0 range 334 CREATE: "CREATE", 335 CALL: "CALL", 336 RETURN: "RETURN", 337 CALLCODE: "CALLCODE", 338 339 // 0x70 range - other 340 SUICIDE: "SUICIDE", 341 } 342 343 func (o OpCode) String() string { 344 str := opCodeToString[o] 345 if len(str) == 0 { 346 return fmt.Sprintf("Missing opcode 0x%x", int(o)) 347 } 348 349 return str 350 } 351 352 var stringToOp = map[string]OpCode{ 353 "STOP": STOP, 354 "ADD": ADD, 355 "MUL": MUL, 356 "SUB": SUB, 357 "DIV": DIV, 358 "SDIV": SDIV, 359 "MOD": MOD, 360 "SMOD": SMOD, 361 "EXP": EXP, 362 "NOT": NOT, 363 "LT": LT, 364 "GT": GT, 365 "SLT": SLT, 366 "SGT": SGT, 367 "EQ": EQ, 368 "ISZERO": ISZERO, 369 "SIGNEXTEND": SIGNEXTEND, 370 "AND": AND, 371 "OR": OR, 372 "XOR": XOR, 373 "BYTE": BYTE, 374 "ADDMOD": ADDMOD, 375 "MULMOD": MULMOD, 376 "SHA3": SHA3, 377 "ADDRESS": ADDRESS, 378 "BALANCE": BALANCE, 379 "ORIGIN": ORIGIN, 380 "CALLER": CALLER, 381 "CALLVALUE": CALLVALUE, 382 "CALLDATALOAD": CALLDATALOAD, 383 "CALLDATASIZE": CALLDATASIZE, 384 "CALLDATACOPY": CALLDATACOPY, 385 "CODESIZE": CODESIZE, 386 "CODECOPY": CODECOPY, 387 "GASPRICE": GASPRICE, 388 "BLOCKHASH": BLOCKHASH, 389 "COINBASE": COINBASE, 390 "TIMESTAMP": TIMESTAMP, 391 "NUMBER": NUMBER, 392 "DIFFICULTY": DIFFICULTY, 393 "GASLIMIT": GASLIMIT, 394 "EXTCODESIZE": EXTCODESIZE, 395 "EXTCODECOPY": EXTCODECOPY, 396 "POP": POP, 397 "MLOAD": MLOAD, 398 "MSTORE": MSTORE, 399 "MSTORE8": MSTORE8, 400 "SLOAD": SLOAD, 401 "SSTORE": SSTORE, 402 "JUMP": JUMP, 403 "JUMPI": JUMPI, 404 "PC": PC, 405 "MSIZE": MSIZE, 406 "GAS": GAS, 407 "JUMPDEST": JUMPDEST, 408 "PUSH1": PUSH1, 409 "PUSH2": PUSH2, 410 "PUSH3": PUSH3, 411 "PUSH4": PUSH4, 412 "PUSH5": PUSH5, 413 "PUSH6": PUSH6, 414 "PUSH7": PUSH7, 415 "PUSH8": PUSH8, 416 "PUSH9": PUSH9, 417 "PUSH10": PUSH10, 418 "PUSH11": PUSH11, 419 "PUSH12": PUSH12, 420 "PUSH13": PUSH13, 421 "PUSH14": PUSH14, 422 "PUSH15": PUSH15, 423 "PUSH16": PUSH16, 424 "PUSH17": PUSH17, 425 "PUSH18": PUSH18, 426 "PUSH19": PUSH19, 427 "PUSH20": PUSH20, 428 "PUSH21": PUSH21, 429 "PUSH22": PUSH22, 430 "PUSH23": PUSH23, 431 "PUSH24": PUSH24, 432 "PUSH25": PUSH25, 433 "PUSH26": PUSH26, 434 "PUSH27": PUSH27, 435 "PUSH28": PUSH28, 436 "PUSH29": PUSH29, 437 "PUSH30": PUSH30, 438 "PUSH31": PUSH31, 439 "PUSH32": PUSH32, 440 "DUP1": DUP1, 441 "DUP2": DUP2, 442 "DUP3": DUP3, 443 "DUP4": DUP4, 444 "DUP5": DUP5, 445 "DUP6": DUP6, 446 "DUP7": DUP7, 447 "DUP8": DUP8, 448 "DUP9": DUP9, 449 "DUP10": DUP10, 450 "DUP11": DUP11, 451 "DUP12": DUP12, 452 "DUP13": DUP13, 453 "DUP14": DUP14, 454 "DUP15": DUP15, 455 "DUP16": DUP16, 456 "SWAP1": SWAP1, 457 "SWAP2": SWAP2, 458 "SWAP3": SWAP3, 459 "SWAP4": SWAP4, 460 "SWAP5": SWAP5, 461 "SWAP6": SWAP6, 462 "SWAP7": SWAP7, 463 "SWAP8": SWAP8, 464 "SWAP9": SWAP9, 465 "SWAP10": SWAP10, 466 "SWAP11": SWAP11, 467 "SWAP12": SWAP12, 468 "SWAP13": SWAP13, 469 "SWAP14": SWAP14, 470 "SWAP15": SWAP15, 471 "SWAP16": SWAP16, 472 "LOG0": LOG0, 473 "LOG1": LOG1, 474 "LOG2": LOG2, 475 "LOG3": LOG3, 476 "LOG4": LOG4, 477 "CREATE": CREATE, 478 "CALL": CALL, 479 "RETURN": RETURN, 480 "CALLCODE": CALLCODE, 481 "SUICIDE": SUICIDE, 482 } 483 484 func StringToOp(str string) OpCode { 485 return stringToOp[str] 486 }