github.com/neatlab/neatio@v1.7.3-0.20220425043230-d903e92fcc75/chain/core/vm/jump_table.go (about) 1 package vm 2 3 import ( 4 "errors" 5 6 "github.com/neatlab/neatio/params" 7 ) 8 9 type ( 10 executionFunc func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) 11 gasFunc func(*EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) 12 13 memorySizeFunc func(*Stack) (size uint64, overflow bool) 14 ) 15 16 var errGasUintOverflow = errors.New("gas uint64 overflow") 17 18 type operation struct { 19 execute executionFunc 20 constantGas uint64 21 dynamicGas gasFunc 22 23 minStack int 24 25 maxStack int 26 27 memorySize memorySizeFunc 28 29 halts bool 30 jumps bool 31 writes bool 32 valid bool 33 reverts bool 34 returns bool 35 } 36 37 var ( 38 frontierInstructionSet = newFrontierInstructionSet() 39 homesteadInstructionSet = newHomesteadInstructionSet() 40 tangerineWhistleInstructionSet = newTangerineWhistleInstructionSet() 41 spuriousDragonInstructionSet = newSpuriousDragonInstructionSet() 42 byzantiumInstructionSet = newByzantiumInstructionSet() 43 constantinopleInstructionSet = newConstantinopleInstructionSet() 44 istanbulInstructionSet = newIstanbulInstructionSet() 45 ) 46 47 type JumpTable [256]operation 48 49 func newIstanbulInstructionSet() JumpTable { 50 instructionSet := newConstantinopleInstructionSet() 51 52 enable1344(&instructionSet) 53 enable1884(&instructionSet) 54 enable2200(&instructionSet) 55 56 return instructionSet 57 } 58 59 func newConstantinopleInstructionSet() JumpTable { 60 instructionSet := newByzantiumInstructionSet() 61 instructionSet[SHL] = operation{ 62 execute: opSHL, 63 constantGas: GasFastestStep, 64 minStack: minStack(2, 1), 65 maxStack: maxStack(2, 1), 66 valid: true, 67 } 68 instructionSet[SHR] = operation{ 69 execute: opSHR, 70 constantGas: GasFastestStep, 71 minStack: minStack(2, 1), 72 maxStack: maxStack(2, 1), 73 valid: true, 74 } 75 instructionSet[SAR] = operation{ 76 execute: opSAR, 77 constantGas: GasFastestStep, 78 minStack: minStack(2, 1), 79 maxStack: maxStack(2, 1), 80 valid: true, 81 } 82 instructionSet[EXTCODEHASH] = operation{ 83 execute: opExtCodeHash, 84 constantGas: params.ExtcodeHashGasConstantinople, 85 minStack: minStack(1, 1), 86 maxStack: maxStack(1, 1), 87 valid: true, 88 } 89 instructionSet[CREATE2] = operation{ 90 execute: opCreate2, 91 constantGas: params.Create2Gas, 92 dynamicGas: gasCreate2, 93 minStack: minStack(4, 1), 94 maxStack: maxStack(4, 1), 95 memorySize: memoryCreate2, 96 valid: true, 97 writes: true, 98 returns: true, 99 } 100 return instructionSet 101 } 102 103 func newByzantiumInstructionSet() JumpTable { 104 instructionSet := newSpuriousDragonInstructionSet() 105 instructionSet[STATICCALL] = operation{ 106 execute: opStaticCall, 107 constantGas: params.CallGasEIP150, 108 dynamicGas: gasStaticCall, 109 minStack: minStack(6, 1), 110 maxStack: maxStack(6, 1), 111 memorySize: memoryStaticCall, 112 valid: true, 113 returns: true, 114 } 115 instructionSet[RETURNDATASIZE] = operation{ 116 execute: opReturnDataSize, 117 constantGas: GasQuickStep, 118 minStack: minStack(0, 1), 119 maxStack: maxStack(0, 1), 120 valid: true, 121 } 122 instructionSet[RETURNDATACOPY] = operation{ 123 execute: opReturnDataCopy, 124 constantGas: GasFastestStep, 125 dynamicGas: gasReturnDataCopy, 126 minStack: minStack(3, 0), 127 maxStack: maxStack(3, 0), 128 memorySize: memoryReturnDataCopy, 129 valid: true, 130 } 131 instructionSet[REVERT] = operation{ 132 execute: opRevert, 133 dynamicGas: gasRevert, 134 minStack: minStack(2, 0), 135 maxStack: maxStack(2, 0), 136 memorySize: memoryRevert, 137 valid: true, 138 reverts: true, 139 returns: true, 140 } 141 return instructionSet 142 } 143 144 func newSpuriousDragonInstructionSet() JumpTable { 145 instructionSet := newTangerineWhistleInstructionSet() 146 instructionSet[EXP].dynamicGas = gasExpEIP158 147 return instructionSet 148 149 } 150 151 func newTangerineWhistleInstructionSet() JumpTable { 152 instructionSet := newHomesteadInstructionSet() 153 instructionSet[BALANCE].constantGas = params.BalanceGasEIP150 154 instructionSet[EXTCODESIZE].constantGas = params.ExtcodeSizeGasEIP150 155 instructionSet[SLOAD].constantGas = params.SloadGasEIP150 156 instructionSet[EXTCODECOPY].constantGas = params.ExtcodeCopyBaseEIP150 157 instructionSet[CALL].constantGas = params.CallGasEIP150 158 instructionSet[CALLCODE].constantGas = params.CallGasEIP150 159 instructionSet[DELEGATECALL].constantGas = params.CallGasEIP150 160 return instructionSet 161 } 162 163 func newHomesteadInstructionSet() JumpTable { 164 instructionSet := newFrontierInstructionSet() 165 instructionSet[DELEGATECALL] = operation{ 166 execute: opDelegateCall, 167 dynamicGas: gasDelegateCall, 168 constantGas: params.CallGasFrontier, 169 minStack: minStack(6, 1), 170 maxStack: maxStack(6, 1), 171 memorySize: memoryDelegateCall, 172 valid: true, 173 returns: true, 174 } 175 return instructionSet 176 } 177 178 func newFrontierInstructionSet() JumpTable { 179 return JumpTable{ 180 STOP: { 181 execute: opStop, 182 constantGas: 0, 183 minStack: minStack(0, 0), 184 maxStack: maxStack(0, 0), 185 halts: true, 186 valid: true, 187 }, 188 ADD: { 189 execute: opAdd, 190 constantGas: GasFastestStep, 191 minStack: minStack(2, 1), 192 maxStack: maxStack(2, 1), 193 valid: true, 194 }, 195 MUL: { 196 execute: opMul, 197 constantGas: GasFastStep, 198 minStack: minStack(2, 1), 199 maxStack: maxStack(2, 1), 200 valid: true, 201 }, 202 SUB: { 203 execute: opSub, 204 constantGas: GasFastestStep, 205 minStack: minStack(2, 1), 206 maxStack: maxStack(2, 1), 207 valid: true, 208 }, 209 DIV: { 210 execute: opDiv, 211 constantGas: GasFastStep, 212 minStack: minStack(2, 1), 213 maxStack: maxStack(2, 1), 214 valid: true, 215 }, 216 SDIV: { 217 execute: opSdiv, 218 constantGas: GasFastStep, 219 minStack: minStack(2, 1), 220 maxStack: maxStack(2, 1), 221 valid: true, 222 }, 223 MOD: { 224 execute: opMod, 225 constantGas: GasFastStep, 226 minStack: minStack(2, 1), 227 maxStack: maxStack(2, 1), 228 valid: true, 229 }, 230 SMOD: { 231 execute: opSmod, 232 constantGas: GasFastStep, 233 minStack: minStack(2, 1), 234 maxStack: maxStack(2, 1), 235 valid: true, 236 }, 237 ADDMOD: { 238 execute: opAddmod, 239 constantGas: GasMidStep, 240 minStack: minStack(3, 1), 241 maxStack: maxStack(3, 1), 242 valid: true, 243 }, 244 MULMOD: { 245 execute: opMulmod, 246 constantGas: GasMidStep, 247 minStack: minStack(3, 1), 248 maxStack: maxStack(3, 1), 249 valid: true, 250 }, 251 EXP: { 252 execute: opExp, 253 dynamicGas: gasExpFrontier, 254 minStack: minStack(2, 1), 255 maxStack: maxStack(2, 1), 256 valid: true, 257 }, 258 SIGNEXTEND: { 259 execute: opSignExtend, 260 constantGas: GasFastStep, 261 minStack: minStack(2, 1), 262 maxStack: maxStack(2, 1), 263 valid: true, 264 }, 265 LT: { 266 execute: opLt, 267 constantGas: GasFastestStep, 268 minStack: minStack(2, 1), 269 maxStack: maxStack(2, 1), 270 valid: true, 271 }, 272 GT: { 273 execute: opGt, 274 constantGas: GasFastestStep, 275 minStack: minStack(2, 1), 276 maxStack: maxStack(2, 1), 277 valid: true, 278 }, 279 SLT: { 280 execute: opSlt, 281 constantGas: GasFastestStep, 282 minStack: minStack(2, 1), 283 maxStack: maxStack(2, 1), 284 valid: true, 285 }, 286 SGT: { 287 execute: opSgt, 288 constantGas: GasFastestStep, 289 minStack: minStack(2, 1), 290 maxStack: maxStack(2, 1), 291 valid: true, 292 }, 293 EQ: { 294 execute: opEq, 295 constantGas: GasFastestStep, 296 minStack: minStack(2, 1), 297 maxStack: maxStack(2, 1), 298 valid: true, 299 }, 300 ISZERO: { 301 execute: opIszero, 302 constantGas: GasFastestStep, 303 minStack: minStack(1, 1), 304 maxStack: maxStack(1, 1), 305 valid: true, 306 }, 307 AND: { 308 execute: opAnd, 309 constantGas: GasFastestStep, 310 minStack: minStack(2, 1), 311 maxStack: maxStack(2, 1), 312 valid: true, 313 }, 314 XOR: { 315 execute: opXor, 316 constantGas: GasFastestStep, 317 minStack: minStack(2, 1), 318 maxStack: maxStack(2, 1), 319 valid: true, 320 }, 321 OR: { 322 execute: opOr, 323 constantGas: GasFastestStep, 324 minStack: minStack(2, 1), 325 maxStack: maxStack(2, 1), 326 valid: true, 327 }, 328 NOT: { 329 execute: opNot, 330 constantGas: GasFastestStep, 331 minStack: minStack(1, 1), 332 maxStack: maxStack(1, 1), 333 valid: true, 334 }, 335 BYTE: { 336 execute: opByte, 337 constantGas: GasFastestStep, 338 minStack: minStack(2, 1), 339 maxStack: maxStack(2, 1), 340 valid: true, 341 }, 342 SHA3: { 343 execute: opSha3, 344 constantGas: params.Sha3Gas, 345 dynamicGas: gasSha3, 346 minStack: minStack(2, 1), 347 maxStack: maxStack(2, 1), 348 memorySize: memorySha3, 349 valid: true, 350 }, 351 ADDRESS: { 352 execute: opAddress, 353 constantGas: GasQuickStep, 354 minStack: minStack(0, 1), 355 maxStack: maxStack(0, 1), 356 valid: true, 357 }, 358 BALANCE: { 359 execute: opBalance, 360 constantGas: params.BalanceGasFrontier, 361 minStack: minStack(1, 1), 362 maxStack: maxStack(1, 1), 363 valid: true, 364 }, 365 ORIGIN: { 366 execute: opOrigin, 367 constantGas: GasQuickStep, 368 minStack: minStack(0, 1), 369 maxStack: maxStack(0, 1), 370 valid: true, 371 }, 372 CALLER: { 373 execute: opCaller, 374 constantGas: GasQuickStep, 375 minStack: minStack(0, 1), 376 maxStack: maxStack(0, 1), 377 valid: true, 378 }, 379 CALLVALUE: { 380 execute: opCallValue, 381 constantGas: GasQuickStep, 382 minStack: minStack(0, 1), 383 maxStack: maxStack(0, 1), 384 valid: true, 385 }, 386 CALLDATALOAD: { 387 execute: opCallDataLoad, 388 constantGas: GasFastestStep, 389 minStack: minStack(1, 1), 390 maxStack: maxStack(1, 1), 391 valid: true, 392 }, 393 CALLDATASIZE: { 394 execute: opCallDataSize, 395 constantGas: GasQuickStep, 396 minStack: minStack(0, 1), 397 maxStack: maxStack(0, 1), 398 valid: true, 399 }, 400 CALLDATACOPY: { 401 execute: opCallDataCopy, 402 constantGas: GasFastestStep, 403 dynamicGas: gasCallDataCopy, 404 minStack: minStack(3, 0), 405 maxStack: maxStack(3, 0), 406 memorySize: memoryCallDataCopy, 407 valid: true, 408 }, 409 CODESIZE: { 410 execute: opCodeSize, 411 constantGas: GasQuickStep, 412 minStack: minStack(0, 1), 413 maxStack: maxStack(0, 1), 414 valid: true, 415 }, 416 CODECOPY: { 417 execute: opCodeCopy, 418 constantGas: GasFastestStep, 419 dynamicGas: gasCodeCopy, 420 minStack: minStack(3, 0), 421 maxStack: maxStack(3, 0), 422 memorySize: memoryCodeCopy, 423 valid: true, 424 }, 425 GASPRICE: { 426 execute: opGasprice, 427 constantGas: GasQuickStep, 428 minStack: minStack(0, 1), 429 maxStack: maxStack(0, 1), 430 valid: true, 431 }, 432 EXTCODESIZE: { 433 execute: opExtCodeSize, 434 constantGas: params.ExtcodeSizeGasFrontier, 435 minStack: minStack(1, 1), 436 maxStack: maxStack(1, 1), 437 valid: true, 438 }, 439 EXTCODECOPY: { 440 execute: opExtCodeCopy, 441 constantGas: params.ExtcodeCopyBaseFrontier, 442 dynamicGas: gasExtCodeCopy, 443 minStack: minStack(4, 0), 444 maxStack: maxStack(4, 0), 445 memorySize: memoryExtCodeCopy, 446 valid: true, 447 }, 448 BLOCKHASH: { 449 execute: opBlockhash, 450 constantGas: GasExtStep, 451 minStack: minStack(1, 1), 452 maxStack: maxStack(1, 1), 453 valid: true, 454 }, 455 COINBASE: { 456 execute: opCoinbase, 457 constantGas: GasQuickStep, 458 minStack: minStack(0, 1), 459 maxStack: maxStack(0, 1), 460 valid: true, 461 }, 462 TIMESTAMP: { 463 execute: opTimestamp, 464 constantGas: GasQuickStep, 465 minStack: minStack(0, 1), 466 maxStack: maxStack(0, 1), 467 valid: true, 468 }, 469 NUMBER: { 470 execute: opNumber, 471 constantGas: GasQuickStep, 472 minStack: minStack(0, 1), 473 maxStack: maxStack(0, 1), 474 valid: true, 475 }, 476 DIFFICULTY: { 477 execute: opDifficulty, 478 constantGas: GasQuickStep, 479 minStack: minStack(0, 1), 480 maxStack: maxStack(0, 1), 481 valid: true, 482 }, 483 GASLIMIT: { 484 execute: opGasLimit, 485 constantGas: GasQuickStep, 486 minStack: minStack(0, 1), 487 maxStack: maxStack(0, 1), 488 valid: true, 489 }, 490 POP: { 491 execute: opPop, 492 constantGas: GasQuickStep, 493 minStack: minStack(1, 0), 494 maxStack: maxStack(1, 0), 495 valid: true, 496 }, 497 MLOAD: { 498 execute: opMload, 499 constantGas: GasFastestStep, 500 dynamicGas: gasMLoad, 501 minStack: minStack(1, 1), 502 maxStack: maxStack(1, 1), 503 memorySize: memoryMLoad, 504 valid: true, 505 }, 506 MSTORE: { 507 execute: opMstore, 508 constantGas: GasFastestStep, 509 dynamicGas: gasMStore, 510 minStack: minStack(2, 0), 511 maxStack: maxStack(2, 0), 512 memorySize: memoryMStore, 513 valid: true, 514 }, 515 MSTORE8: { 516 execute: opMstore8, 517 constantGas: GasFastestStep, 518 dynamicGas: gasMStore8, 519 memorySize: memoryMStore8, 520 minStack: minStack(2, 0), 521 maxStack: maxStack(2, 0), 522 523 valid: true, 524 }, 525 SLOAD: { 526 execute: opSload, 527 constantGas: params.SloadGasFrontier, 528 minStack: minStack(1, 1), 529 maxStack: maxStack(1, 1), 530 valid: true, 531 }, 532 SSTORE: { 533 execute: opSstore, 534 dynamicGas: gasSStore, 535 minStack: minStack(2, 0), 536 maxStack: maxStack(2, 0), 537 valid: true, 538 writes: true, 539 }, 540 JUMP: { 541 execute: opJump, 542 constantGas: GasMidStep, 543 minStack: minStack(1, 0), 544 maxStack: maxStack(1, 0), 545 jumps: true, 546 valid: true, 547 }, 548 JUMPI: { 549 execute: opJumpi, 550 constantGas: GasSlowStep, 551 minStack: minStack(2, 0), 552 maxStack: maxStack(2, 0), 553 jumps: true, 554 valid: true, 555 }, 556 PC: { 557 execute: opPc, 558 constantGas: GasQuickStep, 559 minStack: minStack(0, 1), 560 maxStack: maxStack(0, 1), 561 valid: true, 562 }, 563 MSIZE: { 564 execute: opMsize, 565 constantGas: GasQuickStep, 566 minStack: minStack(0, 1), 567 maxStack: maxStack(0, 1), 568 valid: true, 569 }, 570 GAS: { 571 execute: opGas, 572 constantGas: GasQuickStep, 573 minStack: minStack(0, 1), 574 maxStack: maxStack(0, 1), 575 valid: true, 576 }, 577 JUMPDEST: { 578 execute: opJumpdest, 579 constantGas: params.JumpdestGas, 580 minStack: minStack(0, 0), 581 maxStack: maxStack(0, 0), 582 valid: true, 583 }, 584 PUSH1: { 585 execute: opPush1, 586 constantGas: GasFastestStep, 587 minStack: minStack(0, 1), 588 maxStack: maxStack(0, 1), 589 valid: true, 590 }, 591 PUSH2: { 592 execute: makePush(2, 2), 593 constantGas: GasFastestStep, 594 minStack: minStack(0, 1), 595 maxStack: maxStack(0, 1), 596 valid: true, 597 }, 598 PUSH3: { 599 execute: makePush(3, 3), 600 constantGas: GasFastestStep, 601 minStack: minStack(0, 1), 602 maxStack: maxStack(0, 1), 603 valid: true, 604 }, 605 PUSH4: { 606 execute: makePush(4, 4), 607 constantGas: GasFastestStep, 608 minStack: minStack(0, 1), 609 maxStack: maxStack(0, 1), 610 valid: true, 611 }, 612 PUSH5: { 613 execute: makePush(5, 5), 614 constantGas: GasFastestStep, 615 minStack: minStack(0, 1), 616 maxStack: maxStack(0, 1), 617 valid: true, 618 }, 619 PUSH6: { 620 execute: makePush(6, 6), 621 constantGas: GasFastestStep, 622 minStack: minStack(0, 1), 623 maxStack: maxStack(0, 1), 624 valid: true, 625 }, 626 PUSH7: { 627 execute: makePush(7, 7), 628 constantGas: GasFastestStep, 629 minStack: minStack(0, 1), 630 maxStack: maxStack(0, 1), 631 valid: true, 632 }, 633 PUSH8: { 634 execute: makePush(8, 8), 635 constantGas: GasFastestStep, 636 minStack: minStack(0, 1), 637 maxStack: maxStack(0, 1), 638 valid: true, 639 }, 640 PUSH9: { 641 execute: makePush(9, 9), 642 constantGas: GasFastestStep, 643 minStack: minStack(0, 1), 644 maxStack: maxStack(0, 1), 645 valid: true, 646 }, 647 PUSH10: { 648 execute: makePush(10, 10), 649 constantGas: GasFastestStep, 650 minStack: minStack(0, 1), 651 maxStack: maxStack(0, 1), 652 valid: true, 653 }, 654 PUSH11: { 655 execute: makePush(11, 11), 656 constantGas: GasFastestStep, 657 minStack: minStack(0, 1), 658 maxStack: maxStack(0, 1), 659 valid: true, 660 }, 661 PUSH12: { 662 execute: makePush(12, 12), 663 constantGas: GasFastestStep, 664 minStack: minStack(0, 1), 665 maxStack: maxStack(0, 1), 666 valid: true, 667 }, 668 PUSH13: { 669 execute: makePush(13, 13), 670 constantGas: GasFastestStep, 671 minStack: minStack(0, 1), 672 maxStack: maxStack(0, 1), 673 valid: true, 674 }, 675 PUSH14: { 676 execute: makePush(14, 14), 677 constantGas: GasFastestStep, 678 minStack: minStack(0, 1), 679 maxStack: maxStack(0, 1), 680 valid: true, 681 }, 682 PUSH15: { 683 execute: makePush(15, 15), 684 constantGas: GasFastestStep, 685 minStack: minStack(0, 1), 686 maxStack: maxStack(0, 1), 687 valid: true, 688 }, 689 PUSH16: { 690 execute: makePush(16, 16), 691 constantGas: GasFastestStep, 692 minStack: minStack(0, 1), 693 maxStack: maxStack(0, 1), 694 valid: true, 695 }, 696 PUSH17: { 697 execute: makePush(17, 17), 698 constantGas: GasFastestStep, 699 minStack: minStack(0, 1), 700 maxStack: maxStack(0, 1), 701 valid: true, 702 }, 703 PUSH18: { 704 execute: makePush(18, 18), 705 constantGas: GasFastestStep, 706 minStack: minStack(0, 1), 707 maxStack: maxStack(0, 1), 708 valid: true, 709 }, 710 PUSH19: { 711 execute: makePush(19, 19), 712 constantGas: GasFastestStep, 713 minStack: minStack(0, 1), 714 maxStack: maxStack(0, 1), 715 valid: true, 716 }, 717 PUSH20: { 718 execute: makePush(20, 20), 719 constantGas: GasFastestStep, 720 minStack: minStack(0, 1), 721 maxStack: maxStack(0, 1), 722 valid: true, 723 }, 724 PUSH21: { 725 execute: makePush(21, 21), 726 constantGas: GasFastestStep, 727 minStack: minStack(0, 1), 728 maxStack: maxStack(0, 1), 729 valid: true, 730 }, 731 PUSH22: { 732 execute: makePush(22, 22), 733 constantGas: GasFastestStep, 734 minStack: minStack(0, 1), 735 maxStack: maxStack(0, 1), 736 valid: true, 737 }, 738 PUSH23: { 739 execute: makePush(23, 23), 740 constantGas: GasFastestStep, 741 minStack: minStack(0, 1), 742 maxStack: maxStack(0, 1), 743 valid: true, 744 }, 745 PUSH24: { 746 execute: makePush(24, 24), 747 constantGas: GasFastestStep, 748 minStack: minStack(0, 1), 749 maxStack: maxStack(0, 1), 750 valid: true, 751 }, 752 PUSH25: { 753 execute: makePush(25, 25), 754 constantGas: GasFastestStep, 755 minStack: minStack(0, 1), 756 maxStack: maxStack(0, 1), 757 valid: true, 758 }, 759 PUSH26: { 760 execute: makePush(26, 26), 761 constantGas: GasFastestStep, 762 minStack: minStack(0, 1), 763 maxStack: maxStack(0, 1), 764 valid: true, 765 }, 766 PUSH27: { 767 execute: makePush(27, 27), 768 constantGas: GasFastestStep, 769 minStack: minStack(0, 1), 770 maxStack: maxStack(0, 1), 771 valid: true, 772 }, 773 PUSH28: { 774 execute: makePush(28, 28), 775 constantGas: GasFastestStep, 776 minStack: minStack(0, 1), 777 maxStack: maxStack(0, 1), 778 valid: true, 779 }, 780 PUSH29: { 781 execute: makePush(29, 29), 782 constantGas: GasFastestStep, 783 minStack: minStack(0, 1), 784 maxStack: maxStack(0, 1), 785 valid: true, 786 }, 787 PUSH30: { 788 execute: makePush(30, 30), 789 constantGas: GasFastestStep, 790 minStack: minStack(0, 1), 791 maxStack: maxStack(0, 1), 792 valid: true, 793 }, 794 PUSH31: { 795 execute: makePush(31, 31), 796 constantGas: GasFastestStep, 797 minStack: minStack(0, 1), 798 maxStack: maxStack(0, 1), 799 valid: true, 800 }, 801 PUSH32: { 802 execute: makePush(32, 32), 803 constantGas: GasFastestStep, 804 minStack: minStack(0, 1), 805 maxStack: maxStack(0, 1), 806 valid: true, 807 }, 808 DUP1: { 809 execute: makeDup(1), 810 constantGas: GasFastestStep, 811 minStack: minDupStack(1), 812 maxStack: maxDupStack(1), 813 valid: true, 814 }, 815 DUP2: { 816 execute: makeDup(2), 817 constantGas: GasFastestStep, 818 minStack: minDupStack(2), 819 maxStack: maxDupStack(2), 820 valid: true, 821 }, 822 DUP3: { 823 execute: makeDup(3), 824 constantGas: GasFastestStep, 825 minStack: minDupStack(3), 826 maxStack: maxDupStack(3), 827 valid: true, 828 }, 829 DUP4: { 830 execute: makeDup(4), 831 constantGas: GasFastestStep, 832 minStack: minDupStack(4), 833 maxStack: maxDupStack(4), 834 valid: true, 835 }, 836 DUP5: { 837 execute: makeDup(5), 838 constantGas: GasFastestStep, 839 minStack: minDupStack(5), 840 maxStack: maxDupStack(5), 841 valid: true, 842 }, 843 DUP6: { 844 execute: makeDup(6), 845 constantGas: GasFastestStep, 846 minStack: minDupStack(6), 847 maxStack: maxDupStack(6), 848 valid: true, 849 }, 850 DUP7: { 851 execute: makeDup(7), 852 constantGas: GasFastestStep, 853 minStack: minDupStack(7), 854 maxStack: maxDupStack(7), 855 valid: true, 856 }, 857 DUP8: { 858 execute: makeDup(8), 859 constantGas: GasFastestStep, 860 minStack: minDupStack(8), 861 maxStack: maxDupStack(8), 862 valid: true, 863 }, 864 DUP9: { 865 execute: makeDup(9), 866 constantGas: GasFastestStep, 867 minStack: minDupStack(9), 868 maxStack: maxDupStack(9), 869 valid: true, 870 }, 871 DUP10: { 872 execute: makeDup(10), 873 constantGas: GasFastestStep, 874 minStack: minDupStack(10), 875 maxStack: maxDupStack(10), 876 valid: true, 877 }, 878 DUP11: { 879 execute: makeDup(11), 880 constantGas: GasFastestStep, 881 minStack: minDupStack(11), 882 maxStack: maxDupStack(11), 883 valid: true, 884 }, 885 DUP12: { 886 execute: makeDup(12), 887 constantGas: GasFastestStep, 888 minStack: minDupStack(12), 889 maxStack: maxDupStack(12), 890 valid: true, 891 }, 892 DUP13: { 893 execute: makeDup(13), 894 constantGas: GasFastestStep, 895 minStack: minDupStack(13), 896 maxStack: maxDupStack(13), 897 valid: true, 898 }, 899 DUP14: { 900 execute: makeDup(14), 901 constantGas: GasFastestStep, 902 minStack: minDupStack(14), 903 maxStack: maxDupStack(14), 904 valid: true, 905 }, 906 DUP15: { 907 execute: makeDup(15), 908 constantGas: GasFastestStep, 909 minStack: minDupStack(15), 910 maxStack: maxDupStack(15), 911 valid: true, 912 }, 913 DUP16: { 914 execute: makeDup(16), 915 constantGas: GasFastestStep, 916 minStack: minDupStack(16), 917 maxStack: maxDupStack(16), 918 valid: true, 919 }, 920 SWAP1: { 921 execute: makeSwap(1), 922 constantGas: GasFastestStep, 923 minStack: minSwapStack(2), 924 maxStack: maxSwapStack(2), 925 valid: true, 926 }, 927 SWAP2: { 928 execute: makeSwap(2), 929 constantGas: GasFastestStep, 930 minStack: minSwapStack(3), 931 maxStack: maxSwapStack(3), 932 valid: true, 933 }, 934 SWAP3: { 935 execute: makeSwap(3), 936 constantGas: GasFastestStep, 937 minStack: minSwapStack(4), 938 maxStack: maxSwapStack(4), 939 valid: true, 940 }, 941 SWAP4: { 942 execute: makeSwap(4), 943 constantGas: GasFastestStep, 944 minStack: minSwapStack(5), 945 maxStack: maxSwapStack(5), 946 valid: true, 947 }, 948 SWAP5: { 949 execute: makeSwap(5), 950 constantGas: GasFastestStep, 951 minStack: minSwapStack(6), 952 maxStack: maxSwapStack(6), 953 valid: true, 954 }, 955 SWAP6: { 956 execute: makeSwap(6), 957 constantGas: GasFastestStep, 958 minStack: minSwapStack(7), 959 maxStack: maxSwapStack(7), 960 valid: true, 961 }, 962 SWAP7: { 963 execute: makeSwap(7), 964 constantGas: GasFastestStep, 965 minStack: minSwapStack(8), 966 maxStack: maxSwapStack(8), 967 valid: true, 968 }, 969 SWAP8: { 970 execute: makeSwap(8), 971 constantGas: GasFastestStep, 972 minStack: minSwapStack(9), 973 maxStack: maxSwapStack(9), 974 valid: true, 975 }, 976 SWAP9: { 977 execute: makeSwap(9), 978 constantGas: GasFastestStep, 979 minStack: minSwapStack(10), 980 maxStack: maxSwapStack(10), 981 valid: true, 982 }, 983 SWAP10: { 984 execute: makeSwap(10), 985 constantGas: GasFastestStep, 986 minStack: minSwapStack(11), 987 maxStack: maxSwapStack(11), 988 valid: true, 989 }, 990 SWAP11: { 991 execute: makeSwap(11), 992 constantGas: GasFastestStep, 993 minStack: minSwapStack(12), 994 maxStack: maxSwapStack(12), 995 valid: true, 996 }, 997 SWAP12: { 998 execute: makeSwap(12), 999 constantGas: GasFastestStep, 1000 minStack: minSwapStack(13), 1001 maxStack: maxSwapStack(13), 1002 valid: true, 1003 }, 1004 SWAP13: { 1005 execute: makeSwap(13), 1006 constantGas: GasFastestStep, 1007 minStack: minSwapStack(14), 1008 maxStack: maxSwapStack(14), 1009 valid: true, 1010 }, 1011 SWAP14: { 1012 execute: makeSwap(14), 1013 constantGas: GasFastestStep, 1014 minStack: minSwapStack(15), 1015 maxStack: maxSwapStack(15), 1016 valid: true, 1017 }, 1018 SWAP15: { 1019 execute: makeSwap(15), 1020 constantGas: GasFastestStep, 1021 minStack: minSwapStack(16), 1022 maxStack: maxSwapStack(16), 1023 valid: true, 1024 }, 1025 SWAP16: { 1026 execute: makeSwap(16), 1027 constantGas: GasFastestStep, 1028 minStack: minSwapStack(17), 1029 maxStack: maxSwapStack(17), 1030 valid: true, 1031 }, 1032 LOG0: { 1033 execute: makeLog(0), 1034 dynamicGas: makeGasLog(0), 1035 minStack: minStack(2, 0), 1036 maxStack: maxStack(2, 0), 1037 memorySize: memoryLog, 1038 valid: true, 1039 writes: true, 1040 }, 1041 LOG1: { 1042 execute: makeLog(1), 1043 dynamicGas: makeGasLog(1), 1044 minStack: minStack(3, 0), 1045 maxStack: maxStack(3, 0), 1046 memorySize: memoryLog, 1047 valid: true, 1048 writes: true, 1049 }, 1050 LOG2: { 1051 execute: makeLog(2), 1052 dynamicGas: makeGasLog(2), 1053 minStack: minStack(4, 0), 1054 maxStack: maxStack(4, 0), 1055 memorySize: memoryLog, 1056 valid: true, 1057 writes: true, 1058 }, 1059 LOG3: { 1060 execute: makeLog(3), 1061 dynamicGas: makeGasLog(3), 1062 minStack: minStack(5, 0), 1063 maxStack: maxStack(5, 0), 1064 memorySize: memoryLog, 1065 valid: true, 1066 writes: true, 1067 }, 1068 LOG4: { 1069 execute: makeLog(4), 1070 dynamicGas: makeGasLog(4), 1071 minStack: minStack(6, 0), 1072 maxStack: maxStack(6, 0), 1073 memorySize: memoryLog, 1074 valid: true, 1075 writes: true, 1076 }, 1077 CREATE: { 1078 execute: opCreate, 1079 constantGas: params.CreateGas, 1080 dynamicGas: gasCreate, 1081 minStack: minStack(3, 1), 1082 maxStack: maxStack(3, 1), 1083 memorySize: memoryCreate, 1084 valid: true, 1085 writes: true, 1086 returns: true, 1087 }, 1088 CALL: { 1089 execute: opCall, 1090 constantGas: params.CallGasFrontier, 1091 dynamicGas: gasCall, 1092 minStack: minStack(7, 1), 1093 maxStack: maxStack(7, 1), 1094 memorySize: memoryCall, 1095 valid: true, 1096 returns: true, 1097 }, 1098 CALLCODE: { 1099 execute: opCallCode, 1100 constantGas: params.CallGasFrontier, 1101 dynamicGas: gasCallCode, 1102 minStack: minStack(7, 1), 1103 maxStack: maxStack(7, 1), 1104 memorySize: memoryCall, 1105 valid: true, 1106 returns: true, 1107 }, 1108 RETURN: { 1109 execute: opReturn, 1110 dynamicGas: gasReturn, 1111 minStack: minStack(2, 0), 1112 maxStack: maxStack(2, 0), 1113 memorySize: memoryReturn, 1114 halts: true, 1115 valid: true, 1116 }, 1117 SELFDESTRUCT: { 1118 execute: opSuicide, 1119 dynamicGas: gasSelfdestruct, 1120 minStack: minStack(1, 0), 1121 maxStack: maxStack(1, 0), 1122 halts: true, 1123 valid: true, 1124 writes: true, 1125 }, 1126 } 1127 }