123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952 |
- // Copyright 2015 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- package vm
- import (
- "errors"
- "math/big"
- "github.com/ethereum/go-ethereum/params"
- )
- type (
- executionFunc func(pc *uint64, env *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error)
- gasFunc func(params.GasTable, *EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64
- stackValidationFunc func(*Stack) error
- memorySizeFunc func(*Stack) *big.Int
- )
- var errGasUintOverflow = errors.New("gas uint64 overflow")
- type operation struct {
- // execute is the operation function
- execute executionFunc
- // gasCost is the gas function and returns the gas required for execution
- gasCost gasFunc
- // validateStack validates the stack (size) for the operation
- validateStack stackValidationFunc
- // memorySize returns the memory size required for the operation
- memorySize memorySizeFunc
- halts bool // indicates whether the operation should halt further execution
- jumps bool // indicates whether the program counter should not increment
- writes bool // determines whether this a state modifying operation
- valid bool // indication whether the retrieved operation is valid and known
- reverts bool // determines whether the operation reverts state (implicitly halts)
- returns bool // determines whether the operations sets the return data content
- }
- var (
- frontierInstructionSet = NewFrontierInstructionSet()
- homesteadInstructionSet = NewHomesteadInstructionSet()
- byzantiumInstructionSet = NewByzantiumInstructionSet()
- constantinopleInstructionSet = NewConstantinopleInstructionSet()
- )
- // NewConstantinopleInstructionSet returns the frontier, homestead
- // byzantium and contantinople instructions.
- func NewConstantinopleInstructionSet() [256]operation {
- // instructions that can be executed during the byzantium phase.
- instructionSet := NewByzantiumInstructionSet()
- instructionSet[SHL] = operation{
- execute: opSHL,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- }
- instructionSet[SHR] = operation{
- execute: opSHR,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- }
- instructionSet[SAR] = operation{
- execute: opSAR,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- }
- return instructionSet
- }
- // NewByzantiumInstructionSet returns the frontier, homestead and
- // byzantium instructions.
- func NewByzantiumInstructionSet() [256]operation {
- // instructions that can be executed during the homestead phase.
- instructionSet := NewHomesteadInstructionSet()
- instructionSet[STATICCALL] = operation{
- execute: opStaticCall,
- gasCost: gasStaticCall,
- validateStack: makeStackFunc(6, 1),
- memorySize: memoryStaticCall,
- valid: true,
- returns: true,
- }
- instructionSet[RETURNDATASIZE] = operation{
- execute: opReturnDataSize,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- }
- instructionSet[RETURNDATACOPY] = operation{
- execute: opReturnDataCopy,
- gasCost: gasReturnDataCopy,
- validateStack: makeStackFunc(3, 0),
- memorySize: memoryReturnDataCopy,
- valid: true,
- }
- instructionSet[REVERT] = operation{
- execute: opRevert,
- gasCost: gasRevert,
- validateStack: makeStackFunc(2, 0),
- memorySize: memoryRevert,
- valid: true,
- reverts: true,
- returns: true,
- }
- return instructionSet
- }
- // NewHomesteadInstructionSet returns the frontier and homestead
- // instructions that can be executed during the homestead phase.
- func NewHomesteadInstructionSet() [256]operation {
- instructionSet := NewFrontierInstructionSet()
- instructionSet[DELEGATECALL] = operation{
- execute: opDelegateCall,
- gasCost: gasDelegateCall,
- validateStack: makeStackFunc(6, 1),
- memorySize: memoryDelegateCall,
- valid: true,
- returns: true,
- }
- return instructionSet
- }
- // NewFrontierInstructionSet returns the frontier instructions
- // that can be executed during the frontier phase.
- func NewFrontierInstructionSet() [256]operation {
- return [256]operation{
- STOP: {
- execute: opStop,
- gasCost: constGasFunc(0),
- validateStack: makeStackFunc(0, 0),
- halts: true,
- valid: true,
- },
- ADD: {
- execute: opAdd,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- MUL: {
- execute: opMul,
- gasCost: constGasFunc(GasFastStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- SUB: {
- execute: opSub,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- DIV: {
- execute: opDiv,
- gasCost: constGasFunc(GasFastStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- SDIV: {
- execute: opSdiv,
- gasCost: constGasFunc(GasFastStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- MOD: {
- execute: opMod,
- gasCost: constGasFunc(GasFastStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- SMOD: {
- execute: opSmod,
- gasCost: constGasFunc(GasFastStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- ADDMOD: {
- execute: opAddmod,
- gasCost: constGasFunc(GasMidStep),
- validateStack: makeStackFunc(3, 1),
- valid: true,
- },
- MULMOD: {
- execute: opMulmod,
- gasCost: constGasFunc(GasMidStep),
- validateStack: makeStackFunc(3, 1),
- valid: true,
- },
- EXP: {
- execute: opExp,
- gasCost: gasExp,
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- SIGNEXTEND: {
- execute: opSignExtend,
- gasCost: constGasFunc(GasFastStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- LT: {
- execute: opLt,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- GT: {
- execute: opGt,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- SLT: {
- execute: opSlt,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- SGT: {
- execute: opSgt,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- EQ: {
- execute: opEq,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- ISZERO: {
- execute: opIszero,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(1, 1),
- valid: true,
- },
- AND: {
- execute: opAnd,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- XOR: {
- execute: opXor,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- OR: {
- execute: opOr,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- NOT: {
- execute: opNot,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(1, 1),
- valid: true,
- },
- BYTE: {
- execute: opByte,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(2, 1),
- valid: true,
- },
- SHA3: {
- execute: opSha3,
- gasCost: gasSha3,
- validateStack: makeStackFunc(2, 1),
- memorySize: memorySha3,
- valid: true,
- },
- ADDRESS: {
- execute: opAddress,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- BALANCE: {
- execute: opBalance,
- gasCost: gasBalance,
- validateStack: makeStackFunc(1, 1),
- valid: true,
- },
- ORIGIN: {
- execute: opOrigin,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- CALLER: {
- execute: opCaller,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- CALLVALUE: {
- execute: opCallValue,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- CALLDATALOAD: {
- execute: opCallDataLoad,
- gasCost: constGasFunc(GasFastestStep),
- validateStack: makeStackFunc(1, 1),
- valid: true,
- },
- CALLDATASIZE: {
- execute: opCallDataSize,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- CALLDATACOPY: {
- execute: opCallDataCopy,
- gasCost: gasCallDataCopy,
- validateStack: makeStackFunc(3, 0),
- memorySize: memoryCallDataCopy,
- valid: true,
- },
- CODESIZE: {
- execute: opCodeSize,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- CODECOPY: {
- execute: opCodeCopy,
- gasCost: gasCodeCopy,
- validateStack: makeStackFunc(3, 0),
- memorySize: memoryCodeCopy,
- valid: true,
- },
- GASPRICE: {
- execute: opGasprice,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- EXTCODESIZE: {
- execute: opExtCodeSize,
- gasCost: gasExtCodeSize,
- validateStack: makeStackFunc(1, 1),
- valid: true,
- },
- EXTCODECOPY: {
- execute: opExtCodeCopy,
- gasCost: gasExtCodeCopy,
- validateStack: makeStackFunc(4, 0),
- memorySize: memoryExtCodeCopy,
- valid: true,
- },
- BLOCKHASH: {
- execute: opBlockhash,
- gasCost: constGasFunc(GasExtStep),
- validateStack: makeStackFunc(1, 1),
- valid: true,
- },
- COINBASE: {
- execute: opCoinbase,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- TIMESTAMP: {
- execute: opTimestamp,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- NUMBER: {
- execute: opNumber,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- DIFFICULTY: {
- execute: opDifficulty,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- GASLIMIT: {
- execute: opGasLimit,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- POP: {
- execute: opPop,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(1, 0),
- valid: true,
- },
- MLOAD: {
- execute: opMload,
- gasCost: gasMLoad,
- validateStack: makeStackFunc(1, 1),
- memorySize: memoryMLoad,
- valid: true,
- },
- MSTORE: {
- execute: opMstore,
- gasCost: gasMStore,
- validateStack: makeStackFunc(2, 0),
- memorySize: memoryMStore,
- valid: true,
- },
- MSTORE8: {
- execute: opMstore8,
- gasCost: gasMStore8,
- memorySize: memoryMStore8,
- validateStack: makeStackFunc(2, 0),
- valid: true,
- },
- SLOAD: {
- execute: opSload,
- gasCost: gasSLoad,
- validateStack: makeStackFunc(1, 1),
- valid: true,
- },
- SSTORE: {
- execute: opSstore,
- gasCost: gasSStore,
- validateStack: makeStackFunc(2, 0),
- valid: true,
- writes: true,
- },
- JUMP: {
- execute: opJump,
- gasCost: constGasFunc(GasMidStep),
- validateStack: makeStackFunc(1, 0),
- jumps: true,
- valid: true,
- },
- JUMPI: {
- execute: opJumpi,
- gasCost: constGasFunc(GasSlowStep),
- validateStack: makeStackFunc(2, 0),
- jumps: true,
- valid: true,
- },
- PC: {
- execute: opPc,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- MSIZE: {
- execute: opMsize,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- GAS: {
- execute: opGas,
- gasCost: constGasFunc(GasQuickStep),
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- JUMPDEST: {
- execute: opJumpdest,
- gasCost: constGasFunc(params.JumpdestGas),
- validateStack: makeStackFunc(0, 0),
- valid: true,
- },
- PUSH1: {
- execute: makePush(1, 1),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH2: {
- execute: makePush(2, 2),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH3: {
- execute: makePush(3, 3),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH4: {
- execute: makePush(4, 4),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH5: {
- execute: makePush(5, 5),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH6: {
- execute: makePush(6, 6),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH7: {
- execute: makePush(7, 7),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH8: {
- execute: makePush(8, 8),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH9: {
- execute: makePush(9, 9),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH10: {
- execute: makePush(10, 10),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH11: {
- execute: makePush(11, 11),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH12: {
- execute: makePush(12, 12),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH13: {
- execute: makePush(13, 13),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH14: {
- execute: makePush(14, 14),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH15: {
- execute: makePush(15, 15),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH16: {
- execute: makePush(16, 16),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH17: {
- execute: makePush(17, 17),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH18: {
- execute: makePush(18, 18),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH19: {
- execute: makePush(19, 19),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH20: {
- execute: makePush(20, 20),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH21: {
- execute: makePush(21, 21),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH22: {
- execute: makePush(22, 22),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH23: {
- execute: makePush(23, 23),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH24: {
- execute: makePush(24, 24),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH25: {
- execute: makePush(25, 25),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH26: {
- execute: makePush(26, 26),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH27: {
- execute: makePush(27, 27),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH28: {
- execute: makePush(28, 28),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH29: {
- execute: makePush(29, 29),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH30: {
- execute: makePush(30, 30),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH31: {
- execute: makePush(31, 31),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- PUSH32: {
- execute: makePush(32, 32),
- gasCost: gasPush,
- validateStack: makeStackFunc(0, 1),
- valid: true,
- },
- DUP1: {
- execute: makeDup(1),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(1),
- valid: true,
- },
- DUP2: {
- execute: makeDup(2),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(2),
- valid: true,
- },
- DUP3: {
- execute: makeDup(3),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(3),
- valid: true,
- },
- DUP4: {
- execute: makeDup(4),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(4),
- valid: true,
- },
- DUP5: {
- execute: makeDup(5),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(5),
- valid: true,
- },
- DUP6: {
- execute: makeDup(6),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(6),
- valid: true,
- },
- DUP7: {
- execute: makeDup(7),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(7),
- valid: true,
- },
- DUP8: {
- execute: makeDup(8),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(8),
- valid: true,
- },
- DUP9: {
- execute: makeDup(9),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(9),
- valid: true,
- },
- DUP10: {
- execute: makeDup(10),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(10),
- valid: true,
- },
- DUP11: {
- execute: makeDup(11),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(11),
- valid: true,
- },
- DUP12: {
- execute: makeDup(12),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(12),
- valid: true,
- },
- DUP13: {
- execute: makeDup(13),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(13),
- valid: true,
- },
- DUP14: {
- execute: makeDup(14),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(14),
- valid: true,
- },
- DUP15: {
- execute: makeDup(15),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(15),
- valid: true,
- },
- DUP16: {
- execute: makeDup(16),
- gasCost: gasDup,
- validateStack: makeDupStackFunc(16),
- valid: true,
- },
- SWAP1: {
- execute: makeSwap(1),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(2),
- valid: true,
- },
- SWAP2: {
- execute: makeSwap(2),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(3),
- valid: true,
- },
- SWAP3: {
- execute: makeSwap(3),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(4),
- valid: true,
- },
- SWAP4: {
- execute: makeSwap(4),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(5),
- valid: true,
- },
- SWAP5: {
- execute: makeSwap(5),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(6),
- valid: true,
- },
- SWAP6: {
- execute: makeSwap(6),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(7),
- valid: true,
- },
- SWAP7: {
- execute: makeSwap(7),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(8),
- valid: true,
- },
- SWAP8: {
- execute: makeSwap(8),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(9),
- valid: true,
- },
- SWAP9: {
- execute: makeSwap(9),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(10),
- valid: true,
- },
- SWAP10: {
- execute: makeSwap(10),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(11),
- valid: true,
- },
- SWAP11: {
- execute: makeSwap(11),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(12),
- valid: true,
- },
- SWAP12: {
- execute: makeSwap(12),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(13),
- valid: true,
- },
- SWAP13: {
- execute: makeSwap(13),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(14),
- valid: true,
- },
- SWAP14: {
- execute: makeSwap(14),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(15),
- valid: true,
- },
- SWAP15: {
- execute: makeSwap(15),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(16),
- valid: true,
- },
- SWAP16: {
- execute: makeSwap(16),
- gasCost: gasSwap,
- validateStack: makeSwapStackFunc(17),
- valid: true,
- },
- LOG0: {
- execute: makeLog(0),
- gasCost: makeGasLog(0),
- validateStack: makeStackFunc(2, 0),
- memorySize: memoryLog,
- valid: true,
- writes: true,
- },
- LOG1: {
- execute: makeLog(1),
- gasCost: makeGasLog(1),
- validateStack: makeStackFunc(3, 0),
- memorySize: memoryLog,
- valid: true,
- writes: true,
- },
- LOG2: {
- execute: makeLog(2),
- gasCost: makeGasLog(2),
- validateStack: makeStackFunc(4, 0),
- memorySize: memoryLog,
- valid: true,
- writes: true,
- },
- LOG3: {
- execute: makeLog(3),
- gasCost: makeGasLog(3),
- validateStack: makeStackFunc(5, 0),
- memorySize: memoryLog,
- valid: true,
- writes: true,
- },
- LOG4: {
- execute: makeLog(4),
- gasCost: makeGasLog(4),
- validateStack: makeStackFunc(6, 0),
- memorySize: memoryLog,
- valid: true,
- writes: true,
- },
- CREATE: {
- execute: opCreate,
- gasCost: gasCreate,
- validateStack: makeStackFunc(3, 1),
- memorySize: memoryCreate,
- valid: true,
- writes: true,
- returns: true,
- },
- CALL: {
- execute: opCall,
- gasCost: gasCall,
- validateStack: makeStackFunc(7, 1),
- memorySize: memoryCall,
- valid: true,
- returns: true,
- },
- CALLCODE: {
- execute: opCallCode,
- gasCost: gasCallCode,
- validateStack: makeStackFunc(7, 1),
- memorySize: memoryCall,
- valid: true,
- returns: true,
- },
- RETURN: {
- execute: opReturn,
- gasCost: gasReturn,
- validateStack: makeStackFunc(2, 0),
- memorySize: memoryReturn,
- halts: true,
- valid: true,
- },
- SELFDESTRUCT: {
- execute: opSuicide,
- gasCost: gasSuicide,
- validateStack: makeStackFunc(1, 0),
- halts: true,
- valid: true,
- writes: true,
- },
- }
- }
|