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