github.com/pfcoder/quorum@v2.0.3-0.20180501191142-d4a1b0958135+incompatible/core/vm/jump_table.go (about) 1 // Copyright 2015 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 "errors" 21 "math/big" 22 23 "github.com/ethereum/go-ethereum/params" 24 ) 25 26 type ( 27 executionFunc func(pc *uint64, env *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) 28 gasFunc func(params.GasTable, *EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64 29 stackValidationFunc func(*Stack) error 30 memorySizeFunc func(*Stack) *big.Int 31 ) 32 33 var errGasUintOverflow = errors.New("gas uint64 overflow") 34 35 type operation struct { 36 // op is the operation function 37 execute executionFunc 38 // gasCost is the gas function and returns the gas required for execution 39 gasCost gasFunc 40 // validateStack validates the stack (size) for the operation 41 validateStack stackValidationFunc 42 // memorySize returns the memory size required for the operation 43 memorySize memorySizeFunc 44 45 halts bool // indicates whether the operation shoult halt further execution 46 jumps bool // indicates whether the program counter should not increment 47 writes bool // determines whether this a state modifying operation 48 valid bool // indication whether the retrieved operation is valid and known 49 reverts bool // determines whether the operation reverts state (implicitly halts) 50 returns bool // determines whether the opertions sets the return data content 51 } 52 53 var ( 54 frontierInstructionSet = NewFrontierInstructionSet() 55 homesteadInstructionSet = NewHomesteadInstructionSet() 56 byzantiumInstructionSet = NewByzantiumInstructionSet() 57 ) 58 59 // NewByzantiumInstructionSet returns the frontier, homestead and 60 // byzantium instructions. 61 func NewByzantiumInstructionSet() [256]operation { 62 // instructions that can be executed during the homestead phase. 63 instructionSet := NewHomesteadInstructionSet() 64 instructionSet[STATICCALL] = operation{ 65 execute: opStaticCall, 66 gasCost: gasStaticCall, 67 validateStack: makeStackFunc(6, 1), 68 memorySize: memoryStaticCall, 69 valid: true, 70 returns: true, 71 } 72 instructionSet[RETURNDATASIZE] = operation{ 73 execute: opReturnDataSize, 74 gasCost: constGasFunc(GasQuickStep), 75 validateStack: makeStackFunc(0, 1), 76 valid: true, 77 } 78 instructionSet[RETURNDATACOPY] = operation{ 79 execute: opReturnDataCopy, 80 gasCost: gasReturnDataCopy, 81 validateStack: makeStackFunc(3, 0), 82 memorySize: memoryReturnDataCopy, 83 valid: true, 84 } 85 instructionSet[REVERT] = operation{ 86 execute: opRevert, 87 gasCost: gasRevert, 88 validateStack: makeStackFunc(2, 0), 89 memorySize: memoryRevert, 90 valid: true, 91 reverts: true, 92 returns: true, 93 } 94 return instructionSet 95 } 96 97 // NewHomesteadInstructionSet returns the frontier and homestead 98 // instructions that can be executed during the homestead phase. 99 func NewHomesteadInstructionSet() [256]operation { 100 instructionSet := NewFrontierInstructionSet() 101 instructionSet[DELEGATECALL] = operation{ 102 execute: opDelegateCall, 103 gasCost: gasDelegateCall, 104 validateStack: makeStackFunc(6, 1), 105 memorySize: memoryDelegateCall, 106 valid: true, 107 returns: true, 108 } 109 return instructionSet 110 } 111 112 // NewFrontierInstructionSet returns the frontier instructions 113 // that can be executed during the frontier phase. 114 func NewFrontierInstructionSet() [256]operation { 115 return [256]operation{ 116 STOP: { 117 execute: opStop, 118 gasCost: constGasFunc(0), 119 validateStack: makeStackFunc(0, 0), 120 halts: true, 121 valid: true, 122 }, 123 ADD: { 124 execute: opAdd, 125 gasCost: constGasFunc(GasFastestStep), 126 validateStack: makeStackFunc(2, 1), 127 valid: true, 128 }, 129 MUL: { 130 execute: opMul, 131 gasCost: constGasFunc(GasFastStep), 132 validateStack: makeStackFunc(2, 1), 133 valid: true, 134 }, 135 SUB: { 136 execute: opSub, 137 gasCost: constGasFunc(GasFastestStep), 138 validateStack: makeStackFunc(2, 1), 139 valid: true, 140 }, 141 DIV: { 142 execute: opDiv, 143 gasCost: constGasFunc(GasFastStep), 144 validateStack: makeStackFunc(2, 1), 145 valid: true, 146 }, 147 SDIV: { 148 execute: opSdiv, 149 gasCost: constGasFunc(GasFastStep), 150 validateStack: makeStackFunc(2, 1), 151 valid: true, 152 }, 153 MOD: { 154 execute: opMod, 155 gasCost: constGasFunc(GasFastStep), 156 validateStack: makeStackFunc(2, 1), 157 valid: true, 158 }, 159 SMOD: { 160 execute: opSmod, 161 gasCost: constGasFunc(GasFastStep), 162 validateStack: makeStackFunc(2, 1), 163 valid: true, 164 }, 165 ADDMOD: { 166 execute: opAddmod, 167 gasCost: constGasFunc(GasMidStep), 168 validateStack: makeStackFunc(3, 1), 169 valid: true, 170 }, 171 MULMOD: { 172 execute: opMulmod, 173 gasCost: constGasFunc(GasMidStep), 174 validateStack: makeStackFunc(3, 1), 175 valid: true, 176 }, 177 EXP: { 178 execute: opExp, 179 gasCost: gasExp, 180 validateStack: makeStackFunc(2, 1), 181 valid: true, 182 }, 183 SIGNEXTEND: { 184 execute: opSignExtend, 185 gasCost: constGasFunc(GasFastStep), 186 validateStack: makeStackFunc(2, 1), 187 valid: true, 188 }, 189 LT: { 190 execute: opLt, 191 gasCost: constGasFunc(GasFastestStep), 192 validateStack: makeStackFunc(2, 1), 193 valid: true, 194 }, 195 GT: { 196 execute: opGt, 197 gasCost: constGasFunc(GasFastestStep), 198 validateStack: makeStackFunc(2, 1), 199 valid: true, 200 }, 201 SLT: { 202 execute: opSlt, 203 gasCost: constGasFunc(GasFastestStep), 204 validateStack: makeStackFunc(2, 1), 205 valid: true, 206 }, 207 SGT: { 208 execute: opSgt, 209 gasCost: constGasFunc(GasFastestStep), 210 validateStack: makeStackFunc(2, 1), 211 valid: true, 212 }, 213 EQ: { 214 execute: opEq, 215 gasCost: constGasFunc(GasFastestStep), 216 validateStack: makeStackFunc(2, 1), 217 valid: true, 218 }, 219 ISZERO: { 220 execute: opIszero, 221 gasCost: constGasFunc(GasFastestStep), 222 validateStack: makeStackFunc(1, 1), 223 valid: true, 224 }, 225 AND: { 226 execute: opAnd, 227 gasCost: constGasFunc(GasFastestStep), 228 validateStack: makeStackFunc(2, 1), 229 valid: true, 230 }, 231 XOR: { 232 execute: opXor, 233 gasCost: constGasFunc(GasFastestStep), 234 validateStack: makeStackFunc(2, 1), 235 valid: true, 236 }, 237 OR: { 238 execute: opOr, 239 gasCost: constGasFunc(GasFastestStep), 240 validateStack: makeStackFunc(2, 1), 241 valid: true, 242 }, 243 NOT: { 244 execute: opNot, 245 gasCost: constGasFunc(GasFastestStep), 246 validateStack: makeStackFunc(1, 1), 247 valid: true, 248 }, 249 BYTE: { 250 execute: opByte, 251 gasCost: constGasFunc(GasFastestStep), 252 validateStack: makeStackFunc(2, 1), 253 valid: true, 254 }, 255 SHA3: { 256 execute: opSha3, 257 gasCost: gasSha3, 258 validateStack: makeStackFunc(2, 1), 259 memorySize: memorySha3, 260 valid: true, 261 }, 262 ADDRESS: { 263 execute: opAddress, 264 gasCost: constGasFunc(GasQuickStep), 265 validateStack: makeStackFunc(0, 1), 266 valid: true, 267 }, 268 BALANCE: { 269 execute: opBalance, 270 gasCost: gasBalance, 271 validateStack: makeStackFunc(1, 1), 272 valid: true, 273 }, 274 ORIGIN: { 275 execute: opOrigin, 276 gasCost: constGasFunc(GasQuickStep), 277 validateStack: makeStackFunc(0, 1), 278 valid: true, 279 }, 280 CALLER: { 281 execute: opCaller, 282 gasCost: constGasFunc(GasQuickStep), 283 validateStack: makeStackFunc(0, 1), 284 valid: true, 285 }, 286 CALLVALUE: { 287 execute: opCallValue, 288 gasCost: constGasFunc(GasQuickStep), 289 validateStack: makeStackFunc(0, 1), 290 valid: true, 291 }, 292 CALLDATALOAD: { 293 execute: opCallDataLoad, 294 gasCost: constGasFunc(GasFastestStep), 295 validateStack: makeStackFunc(1, 1), 296 valid: true, 297 }, 298 CALLDATASIZE: { 299 execute: opCallDataSize, 300 gasCost: constGasFunc(GasQuickStep), 301 validateStack: makeStackFunc(0, 1), 302 valid: true, 303 }, 304 CALLDATACOPY: { 305 execute: opCallDataCopy, 306 gasCost: gasCallDataCopy, 307 validateStack: makeStackFunc(3, 0), 308 memorySize: memoryCallDataCopy, 309 valid: true, 310 }, 311 CODESIZE: { 312 execute: opCodeSize, 313 gasCost: constGasFunc(GasQuickStep), 314 validateStack: makeStackFunc(0, 1), 315 valid: true, 316 }, 317 CODECOPY: { 318 execute: opCodeCopy, 319 gasCost: gasCodeCopy, 320 validateStack: makeStackFunc(3, 0), 321 memorySize: memoryCodeCopy, 322 valid: true, 323 }, 324 GASPRICE: { 325 execute: opGasprice, 326 gasCost: constGasFunc(GasQuickStep), 327 validateStack: makeStackFunc(0, 1), 328 valid: true, 329 }, 330 EXTCODESIZE: { 331 execute: opExtCodeSize, 332 gasCost: gasExtCodeSize, 333 validateStack: makeStackFunc(1, 1), 334 valid: true, 335 }, 336 EXTCODECOPY: { 337 execute: opExtCodeCopy, 338 gasCost: gasExtCodeCopy, 339 validateStack: makeStackFunc(4, 0), 340 memorySize: memoryExtCodeCopy, 341 valid: true, 342 }, 343 BLOCKHASH: { 344 execute: opBlockhash, 345 gasCost: constGasFunc(GasExtStep), 346 validateStack: makeStackFunc(1, 1), 347 valid: true, 348 }, 349 COINBASE: { 350 execute: opCoinbase, 351 gasCost: constGasFunc(GasQuickStep), 352 validateStack: makeStackFunc(0, 1), 353 valid: true, 354 }, 355 TIMESTAMP: { 356 execute: opTimestamp, 357 gasCost: constGasFunc(GasQuickStep), 358 validateStack: makeStackFunc(0, 1), 359 valid: true, 360 }, 361 NUMBER: { 362 execute: opNumber, 363 gasCost: constGasFunc(GasQuickStep), 364 validateStack: makeStackFunc(0, 1), 365 valid: true, 366 }, 367 DIFFICULTY: { 368 execute: opDifficulty, 369 gasCost: constGasFunc(GasQuickStep), 370 validateStack: makeStackFunc(0, 1), 371 valid: true, 372 }, 373 GASLIMIT: { 374 execute: opGasLimit, 375 gasCost: constGasFunc(GasQuickStep), 376 validateStack: makeStackFunc(0, 1), 377 valid: true, 378 }, 379 POP: { 380 execute: opPop, 381 gasCost: constGasFunc(GasQuickStep), 382 validateStack: makeStackFunc(1, 0), 383 valid: true, 384 }, 385 MLOAD: { 386 execute: opMload, 387 gasCost: gasMLoad, 388 validateStack: makeStackFunc(1, 1), 389 memorySize: memoryMLoad, 390 valid: true, 391 }, 392 MSTORE: { 393 execute: opMstore, 394 gasCost: gasMStore, 395 validateStack: makeStackFunc(2, 0), 396 memorySize: memoryMStore, 397 valid: true, 398 }, 399 MSTORE8: { 400 execute: opMstore8, 401 gasCost: gasMStore8, 402 memorySize: memoryMStore8, 403 validateStack: makeStackFunc(2, 0), 404 405 valid: true, 406 }, 407 SLOAD: { 408 execute: opSload, 409 gasCost: gasSLoad, 410 validateStack: makeStackFunc(1, 1), 411 valid: true, 412 }, 413 SSTORE: { 414 execute: opSstore, 415 gasCost: gasSStore, 416 validateStack: makeStackFunc(2, 0), 417 valid: true, 418 writes: true, 419 }, 420 JUMP: { 421 execute: opJump, 422 gasCost: constGasFunc(GasMidStep), 423 validateStack: makeStackFunc(1, 0), 424 jumps: true, 425 valid: true, 426 }, 427 JUMPI: { 428 execute: opJumpi, 429 gasCost: constGasFunc(GasSlowStep), 430 validateStack: makeStackFunc(2, 0), 431 jumps: true, 432 valid: true, 433 }, 434 PC: { 435 execute: opPc, 436 gasCost: constGasFunc(GasQuickStep), 437 validateStack: makeStackFunc(0, 1), 438 valid: true, 439 }, 440 MSIZE: { 441 execute: opMsize, 442 gasCost: constGasFunc(GasQuickStep), 443 validateStack: makeStackFunc(0, 1), 444 valid: true, 445 }, 446 GAS: { 447 execute: opGas, 448 gasCost: constGasFunc(GasQuickStep), 449 validateStack: makeStackFunc(0, 1), 450 valid: true, 451 }, 452 JUMPDEST: { 453 execute: opJumpdest, 454 gasCost: constGasFunc(params.JumpdestGas), 455 validateStack: makeStackFunc(0, 0), 456 valid: true, 457 }, 458 PUSH1: { 459 execute: makePush(1, 1), 460 gasCost: gasPush, 461 validateStack: makeStackFunc(0, 1), 462 valid: true, 463 }, 464 PUSH2: { 465 execute: makePush(2, 2), 466 gasCost: gasPush, 467 validateStack: makeStackFunc(0, 1), 468 valid: true, 469 }, 470 PUSH3: { 471 execute: makePush(3, 3), 472 gasCost: gasPush, 473 validateStack: makeStackFunc(0, 1), 474 valid: true, 475 }, 476 PUSH4: { 477 execute: makePush(4, 4), 478 gasCost: gasPush, 479 validateStack: makeStackFunc(0, 1), 480 valid: true, 481 }, 482 PUSH5: { 483 execute: makePush(5, 5), 484 gasCost: gasPush, 485 validateStack: makeStackFunc(0, 1), 486 valid: true, 487 }, 488 PUSH6: { 489 execute: makePush(6, 6), 490 gasCost: gasPush, 491 validateStack: makeStackFunc(0, 1), 492 valid: true, 493 }, 494 PUSH7: { 495 execute: makePush(7, 7), 496 gasCost: gasPush, 497 validateStack: makeStackFunc(0, 1), 498 valid: true, 499 }, 500 PUSH8: { 501 execute: makePush(8, 8), 502 gasCost: gasPush, 503 validateStack: makeStackFunc(0, 1), 504 valid: true, 505 }, 506 PUSH9: { 507 execute: makePush(9, 9), 508 gasCost: gasPush, 509 validateStack: makeStackFunc(0, 1), 510 valid: true, 511 }, 512 PUSH10: { 513 execute: makePush(10, 10), 514 gasCost: gasPush, 515 validateStack: makeStackFunc(0, 1), 516 valid: true, 517 }, 518 PUSH11: { 519 execute: makePush(11, 11), 520 gasCost: gasPush, 521 validateStack: makeStackFunc(0, 1), 522 valid: true, 523 }, 524 PUSH12: { 525 execute: makePush(12, 12), 526 gasCost: gasPush, 527 validateStack: makeStackFunc(0, 1), 528 valid: true, 529 }, 530 PUSH13: { 531 execute: makePush(13, 13), 532 gasCost: gasPush, 533 validateStack: makeStackFunc(0, 1), 534 valid: true, 535 }, 536 PUSH14: { 537 execute: makePush(14, 14), 538 gasCost: gasPush, 539 validateStack: makeStackFunc(0, 1), 540 valid: true, 541 }, 542 PUSH15: { 543 execute: makePush(15, 15), 544 gasCost: gasPush, 545 validateStack: makeStackFunc(0, 1), 546 valid: true, 547 }, 548 PUSH16: { 549 execute: makePush(16, 16), 550 gasCost: gasPush, 551 validateStack: makeStackFunc(0, 1), 552 valid: true, 553 }, 554 PUSH17: { 555 execute: makePush(17, 17), 556 gasCost: gasPush, 557 validateStack: makeStackFunc(0, 1), 558 valid: true, 559 }, 560 PUSH18: { 561 execute: makePush(18, 18), 562 gasCost: gasPush, 563 validateStack: makeStackFunc(0, 1), 564 valid: true, 565 }, 566 PUSH19: { 567 execute: makePush(19, 19), 568 gasCost: gasPush, 569 validateStack: makeStackFunc(0, 1), 570 valid: true, 571 }, 572 PUSH20: { 573 execute: makePush(20, 20), 574 gasCost: gasPush, 575 validateStack: makeStackFunc(0, 1), 576 valid: true, 577 }, 578 PUSH21: { 579 execute: makePush(21, 21), 580 gasCost: gasPush, 581 validateStack: makeStackFunc(0, 1), 582 valid: true, 583 }, 584 PUSH22: { 585 execute: makePush(22, 22), 586 gasCost: gasPush, 587 validateStack: makeStackFunc(0, 1), 588 valid: true, 589 }, 590 PUSH23: { 591 execute: makePush(23, 23), 592 gasCost: gasPush, 593 validateStack: makeStackFunc(0, 1), 594 valid: true, 595 }, 596 PUSH24: { 597 execute: makePush(24, 24), 598 gasCost: gasPush, 599 validateStack: makeStackFunc(0, 1), 600 valid: true, 601 }, 602 PUSH25: { 603 execute: makePush(25, 25), 604 gasCost: gasPush, 605 validateStack: makeStackFunc(0, 1), 606 valid: true, 607 }, 608 PUSH26: { 609 execute: makePush(26, 26), 610 gasCost: gasPush, 611 validateStack: makeStackFunc(0, 1), 612 valid: true, 613 }, 614 PUSH27: { 615 execute: makePush(27, 27), 616 gasCost: gasPush, 617 validateStack: makeStackFunc(0, 1), 618 valid: true, 619 }, 620 PUSH28: { 621 execute: makePush(28, 28), 622 gasCost: gasPush, 623 validateStack: makeStackFunc(0, 1), 624 valid: true, 625 }, 626 PUSH29: { 627 execute: makePush(29, 29), 628 gasCost: gasPush, 629 validateStack: makeStackFunc(0, 1), 630 valid: true, 631 }, 632 PUSH30: { 633 execute: makePush(30, 30), 634 gasCost: gasPush, 635 validateStack: makeStackFunc(0, 1), 636 valid: true, 637 }, 638 PUSH31: { 639 execute: makePush(31, 31), 640 gasCost: gasPush, 641 validateStack: makeStackFunc(0, 1), 642 valid: true, 643 }, 644 PUSH32: { 645 execute: makePush(32, 32), 646 gasCost: gasPush, 647 validateStack: makeStackFunc(0, 1), 648 valid: true, 649 }, 650 DUP1: { 651 execute: makeDup(1), 652 gasCost: gasDup, 653 validateStack: makeDupStackFunc(1), 654 valid: true, 655 }, 656 DUP2: { 657 execute: makeDup(2), 658 gasCost: gasDup, 659 validateStack: makeDupStackFunc(2), 660 valid: true, 661 }, 662 DUP3: { 663 execute: makeDup(3), 664 gasCost: gasDup, 665 validateStack: makeDupStackFunc(3), 666 valid: true, 667 }, 668 DUP4: { 669 execute: makeDup(4), 670 gasCost: gasDup, 671 validateStack: makeDupStackFunc(4), 672 valid: true, 673 }, 674 DUP5: { 675 execute: makeDup(5), 676 gasCost: gasDup, 677 validateStack: makeDupStackFunc(5), 678 valid: true, 679 }, 680 DUP6: { 681 execute: makeDup(6), 682 gasCost: gasDup, 683 validateStack: makeDupStackFunc(6), 684 valid: true, 685 }, 686 DUP7: { 687 execute: makeDup(7), 688 gasCost: gasDup, 689 validateStack: makeDupStackFunc(7), 690 valid: true, 691 }, 692 DUP8: { 693 execute: makeDup(8), 694 gasCost: gasDup, 695 validateStack: makeDupStackFunc(8), 696 valid: true, 697 }, 698 DUP9: { 699 execute: makeDup(9), 700 gasCost: gasDup, 701 validateStack: makeDupStackFunc(9), 702 valid: true, 703 }, 704 DUP10: { 705 execute: makeDup(10), 706 gasCost: gasDup, 707 validateStack: makeDupStackFunc(10), 708 valid: true, 709 }, 710 DUP11: { 711 execute: makeDup(11), 712 gasCost: gasDup, 713 validateStack: makeDupStackFunc(11), 714 valid: true, 715 }, 716 DUP12: { 717 execute: makeDup(12), 718 gasCost: gasDup, 719 validateStack: makeDupStackFunc(12), 720 valid: true, 721 }, 722 DUP13: { 723 execute: makeDup(13), 724 gasCost: gasDup, 725 validateStack: makeDupStackFunc(13), 726 valid: true, 727 }, 728 DUP14: { 729 execute: makeDup(14), 730 gasCost: gasDup, 731 validateStack: makeDupStackFunc(14), 732 valid: true, 733 }, 734 DUP15: { 735 execute: makeDup(15), 736 gasCost: gasDup, 737 validateStack: makeDupStackFunc(15), 738 valid: true, 739 }, 740 DUP16: { 741 execute: makeDup(16), 742 gasCost: gasDup, 743 validateStack: makeDupStackFunc(16), 744 valid: true, 745 }, 746 SWAP1: { 747 execute: makeSwap(1), 748 gasCost: gasSwap, 749 validateStack: makeSwapStackFunc(2), 750 valid: true, 751 }, 752 SWAP2: { 753 execute: makeSwap(2), 754 gasCost: gasSwap, 755 validateStack: makeSwapStackFunc(3), 756 valid: true, 757 }, 758 SWAP3: { 759 execute: makeSwap(3), 760 gasCost: gasSwap, 761 validateStack: makeSwapStackFunc(4), 762 valid: true, 763 }, 764 SWAP4: { 765 execute: makeSwap(4), 766 gasCost: gasSwap, 767 validateStack: makeSwapStackFunc(5), 768 valid: true, 769 }, 770 SWAP5: { 771 execute: makeSwap(5), 772 gasCost: gasSwap, 773 validateStack: makeSwapStackFunc(6), 774 valid: true, 775 }, 776 SWAP6: { 777 execute: makeSwap(6), 778 gasCost: gasSwap, 779 validateStack: makeSwapStackFunc(7), 780 valid: true, 781 }, 782 SWAP7: { 783 execute: makeSwap(7), 784 gasCost: gasSwap, 785 validateStack: makeSwapStackFunc(8), 786 valid: true, 787 }, 788 SWAP8: { 789 execute: makeSwap(8), 790 gasCost: gasSwap, 791 validateStack: makeSwapStackFunc(9), 792 valid: true, 793 }, 794 SWAP9: { 795 execute: makeSwap(9), 796 gasCost: gasSwap, 797 validateStack: makeSwapStackFunc(10), 798 valid: true, 799 }, 800 SWAP10: { 801 execute: makeSwap(10), 802 gasCost: gasSwap, 803 validateStack: makeSwapStackFunc(11), 804 valid: true, 805 }, 806 SWAP11: { 807 execute: makeSwap(11), 808 gasCost: gasSwap, 809 validateStack: makeSwapStackFunc(12), 810 valid: true, 811 }, 812 SWAP12: { 813 execute: makeSwap(12), 814 gasCost: gasSwap, 815 validateStack: makeSwapStackFunc(13), 816 valid: true, 817 }, 818 SWAP13: { 819 execute: makeSwap(13), 820 gasCost: gasSwap, 821 validateStack: makeSwapStackFunc(14), 822 valid: true, 823 }, 824 SWAP14: { 825 execute: makeSwap(14), 826 gasCost: gasSwap, 827 validateStack: makeSwapStackFunc(15), 828 valid: true, 829 }, 830 SWAP15: { 831 execute: makeSwap(15), 832 gasCost: gasSwap, 833 validateStack: makeSwapStackFunc(16), 834 valid: true, 835 }, 836 SWAP16: { 837 execute: makeSwap(16), 838 gasCost: gasSwap, 839 validateStack: makeSwapStackFunc(17), 840 valid: true, 841 }, 842 LOG0: { 843 execute: makeLog(0), 844 gasCost: makeGasLog(0), 845 validateStack: makeStackFunc(2, 0), 846 memorySize: memoryLog, 847 valid: true, 848 writes: true, 849 }, 850 LOG1: { 851 execute: makeLog(1), 852 gasCost: makeGasLog(1), 853 validateStack: makeStackFunc(3, 0), 854 memorySize: memoryLog, 855 valid: true, 856 writes: true, 857 }, 858 LOG2: { 859 execute: makeLog(2), 860 gasCost: makeGasLog(2), 861 validateStack: makeStackFunc(4, 0), 862 memorySize: memoryLog, 863 valid: true, 864 writes: true, 865 }, 866 LOG3: { 867 execute: makeLog(3), 868 gasCost: makeGasLog(3), 869 validateStack: makeStackFunc(5, 0), 870 memorySize: memoryLog, 871 valid: true, 872 writes: true, 873 }, 874 LOG4: { 875 execute: makeLog(4), 876 gasCost: makeGasLog(4), 877 validateStack: makeStackFunc(6, 0), 878 memorySize: memoryLog, 879 valid: true, 880 writes: true, 881 }, 882 CREATE: { 883 execute: opCreate, 884 gasCost: gasCreate, 885 validateStack: makeStackFunc(3, 1), 886 memorySize: memoryCreate, 887 valid: true, 888 writes: true, 889 returns: true, 890 }, 891 CALL: { 892 execute: opCall, 893 gasCost: gasCall, 894 validateStack: makeStackFunc(7, 1), 895 memorySize: memoryCall, 896 valid: true, 897 returns: true, 898 }, 899 CALLCODE: { 900 execute: opCallCode, 901 gasCost: gasCallCode, 902 validateStack: makeStackFunc(7, 1), 903 memorySize: memoryCall, 904 valid: true, 905 returns: true, 906 }, 907 RETURN: { 908 execute: opReturn, 909 gasCost: gasReturn, 910 validateStack: makeStackFunc(2, 0), 911 memorySize: memoryReturn, 912 halts: true, 913 valid: true, 914 }, 915 SELFDESTRUCT: { 916 execute: opSuicide, 917 gasCost: gasSuicide, 918 validateStack: makeStackFunc(1, 0), 919 halts: true, 920 valid: true, 921 writes: true, 922 }, 923 } 924 }