core/vm: use pointers to operations vs. copy by value

parent 9e88224e
...@@ -68,12 +68,11 @@ func enable1884(jt *JumpTable) { ...@@ -68,12 +68,11 @@ func enable1884(jt *JumpTable) {
jt[EXTCODEHASH].constantGas = params.ExtcodeHashGasEIP1884 jt[EXTCODEHASH].constantGas = params.ExtcodeHashGasEIP1884
// New opcode // New opcode
jt[SELFBALANCE] = operation{ jt[SELFBALANCE] = &operation{
execute: opSelfBalance, execute: opSelfBalance,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
} }
} }
...@@ -87,12 +86,11 @@ func opSelfBalance(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx ...@@ -87,12 +86,11 @@ func opSelfBalance(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx
// - Adds an opcode that returns the current chain’s EIP-155 unique identifier // - Adds an opcode that returns the current chain’s EIP-155 unique identifier
func enable1344(jt *JumpTable) { func enable1344(jt *JumpTable) {
// New opcode // New opcode
jt[CHAINID] = operation{ jt[CHAINID] = &operation{
execute: opChainID, execute: opChainID,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
} }
} }
...@@ -113,29 +111,26 @@ func enable2200(jt *JumpTable) { ...@@ -113,29 +111,26 @@ func enable2200(jt *JumpTable) {
// - Adds opcodes that jump to and return from subroutines // - Adds opcodes that jump to and return from subroutines
func enable2315(jt *JumpTable) { func enable2315(jt *JumpTable) {
// New opcode // New opcode
jt[BEGINSUB] = operation{ jt[BEGINSUB] = &operation{
execute: opBeginSub, execute: opBeginSub,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 0), minStack: minStack(0, 0),
maxStack: maxStack(0, 0), maxStack: maxStack(0, 0),
valid: true,
} }
// New opcode // New opcode
jt[JUMPSUB] = operation{ jt[JUMPSUB] = &operation{
execute: opJumpSub, execute: opJumpSub,
constantGas: GasSlowStep, constantGas: GasSlowStep,
minStack: minStack(1, 0), minStack: minStack(1, 0),
maxStack: maxStack(1, 0), maxStack: maxStack(1, 0),
jumps: true, jumps: true,
valid: true,
} }
// New opcode // New opcode
jt[RETURNSUB] = operation{ jt[RETURNSUB] = &operation{
execute: opReturnSub, execute: opReturnSub,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(0, 0), minStack: minStack(0, 0),
maxStack: maxStack(0, 0), maxStack: maxStack(0, 0),
valid: true,
jumps: true, jumps: true,
} }
} }
...@@ -32,7 +32,7 @@ type Config struct { ...@@ -32,7 +32,7 @@ type Config struct {
NoRecursion bool // Disables call, callcode, delegate call and create NoRecursion bool // Disables call, callcode, delegate call and create
EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages
JumpTable [256]operation // EVM instruction table, automatically populated if unset JumpTable [256]*operation // EVM instruction table, automatically populated if unset
EWASMInterpreter string // External EWASM interpreter options EWASMInterpreter string // External EWASM interpreter options
EVMInterpreter string // External EVM interpreter options EVMInterpreter string // External EVM interpreter options
...@@ -96,7 +96,7 @@ func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { ...@@ -96,7 +96,7 @@ func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter {
// We use the STOP instruction whether to see // We use the STOP instruction whether to see
// the jump table was initialised. If it was not // the jump table was initialised. If it was not
// we'll set the default jump table. // we'll set the default jump table.
if !cfg.JumpTable[STOP].valid { if cfg.JumpTable[STOP] == nil {
var jt JumpTable var jt JumpTable
switch { switch {
case evm.chainRules.IsYoloV1: case evm.chainRules.IsYoloV1:
...@@ -221,7 +221,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( ...@@ -221,7 +221,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) (
// enough stack items available to perform the operation. // enough stack items available to perform the operation.
op = contract.GetOp(pc) op = contract.GetOp(pc)
operation := in.cfg.JumpTable[op] operation := in.cfg.JumpTable[op]
if !operation.valid { if operation == nil {
return nil, &ErrInvalidOpCode{opcode: op} return nil, &ErrInvalidOpCode{opcode: op}
} }
// Validate stack // Validate stack
......
...@@ -44,7 +44,6 @@ type operation struct { ...@@ -44,7 +44,6 @@ type operation struct {
halts bool // indicates whether the operation should halt further execution halts bool // indicates whether the operation should halt further execution
jumps bool // indicates whether the program counter should not increment jumps bool // indicates whether the program counter should not increment
writes bool // determines whether this a state modifying operation 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) reverts bool // determines whether the operation reverts state (implicitly halts)
returns bool // determines whether the operations sets the return data content returns bool // determines whether the operations sets the return data content
} }
...@@ -61,7 +60,7 @@ var ( ...@@ -61,7 +60,7 @@ var (
) )
// JumpTable contains the EVM opcodes supported at a given fork. // JumpTable contains the EVM opcodes supported at a given fork.
type JumpTable [256]operation type JumpTable [256]*operation
func newYoloV1InstructionSet() JumpTable { func newYoloV1InstructionSet() JumpTable {
instructionSet := newIstanbulInstructionSet() instructionSet := newIstanbulInstructionSet()
...@@ -87,42 +86,37 @@ func newIstanbulInstructionSet() JumpTable { ...@@ -87,42 +86,37 @@ func newIstanbulInstructionSet() JumpTable {
// byzantium and contantinople instructions. // byzantium and contantinople instructions.
func newConstantinopleInstructionSet() JumpTable { func newConstantinopleInstructionSet() JumpTable {
instructionSet := newByzantiumInstructionSet() instructionSet := newByzantiumInstructionSet()
instructionSet[SHL] = operation{ instructionSet[SHL] = &operation{
execute: opSHL, execute: opSHL,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
} }
instructionSet[SHR] = operation{ instructionSet[SHR] = &operation{
execute: opSHR, execute: opSHR,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
} }
instructionSet[SAR] = operation{ instructionSet[SAR] = &operation{
execute: opSAR, execute: opSAR,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
} }
instructionSet[EXTCODEHASH] = operation{ instructionSet[EXTCODEHASH] = &operation{
execute: opExtCodeHash, execute: opExtCodeHash,
constantGas: params.ExtcodeHashGasConstantinople, constantGas: params.ExtcodeHashGasConstantinople,
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
valid: true,
} }
instructionSet[CREATE2] = operation{ instructionSet[CREATE2] = &operation{
execute: opCreate2, execute: opCreate2,
constantGas: params.Create2Gas, constantGas: params.Create2Gas,
dynamicGas: gasCreate2, dynamicGas: gasCreate2,
minStack: minStack(4, 1), minStack: minStack(4, 1),
maxStack: maxStack(4, 1), maxStack: maxStack(4, 1),
memorySize: memoryCreate2, memorySize: memoryCreate2,
valid: true,
writes: true, writes: true,
returns: true, returns: true,
} }
...@@ -133,39 +127,35 @@ func newConstantinopleInstructionSet() JumpTable { ...@@ -133,39 +127,35 @@ func newConstantinopleInstructionSet() JumpTable {
// byzantium instructions. // byzantium instructions.
func newByzantiumInstructionSet() JumpTable { func newByzantiumInstructionSet() JumpTable {
instructionSet := newSpuriousDragonInstructionSet() instructionSet := newSpuriousDragonInstructionSet()
instructionSet[STATICCALL] = operation{ instructionSet[STATICCALL] = &operation{
execute: opStaticCall, execute: opStaticCall,
constantGas: params.CallGasEIP150, constantGas: params.CallGasEIP150,
dynamicGas: gasStaticCall, dynamicGas: gasStaticCall,
minStack: minStack(6, 1), minStack: minStack(6, 1),
maxStack: maxStack(6, 1), maxStack: maxStack(6, 1),
memorySize: memoryStaticCall, memorySize: memoryStaticCall,
valid: true,
returns: true, returns: true,
} }
instructionSet[RETURNDATASIZE] = operation{ instructionSet[RETURNDATASIZE] = &operation{
execute: opReturnDataSize, execute: opReturnDataSize,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
} }
instructionSet[RETURNDATACOPY] = operation{ instructionSet[RETURNDATACOPY] = &operation{
execute: opReturnDataCopy, execute: opReturnDataCopy,
constantGas: GasFastestStep, constantGas: GasFastestStep,
dynamicGas: gasReturnDataCopy, dynamicGas: gasReturnDataCopy,
minStack: minStack(3, 0), minStack: minStack(3, 0),
maxStack: maxStack(3, 0), maxStack: maxStack(3, 0),
memorySize: memoryReturnDataCopy, memorySize: memoryReturnDataCopy,
valid: true,
} }
instructionSet[REVERT] = operation{ instructionSet[REVERT] = &operation{
execute: opRevert, execute: opRevert,
dynamicGas: gasRevert, dynamicGas: gasRevert,
minStack: minStack(2, 0), minStack: minStack(2, 0),
maxStack: maxStack(2, 0), maxStack: maxStack(2, 0),
memorySize: memoryRevert, memorySize: memoryRevert,
valid: true,
reverts: true, reverts: true,
returns: true, returns: true,
} }
...@@ -197,14 +187,13 @@ func newTangerineWhistleInstructionSet() JumpTable { ...@@ -197,14 +187,13 @@ func newTangerineWhistleInstructionSet() JumpTable {
// instructions that can be executed during the homestead phase. // instructions that can be executed during the homestead phase.
func newHomesteadInstructionSet() JumpTable { func newHomesteadInstructionSet() JumpTable {
instructionSet := newFrontierInstructionSet() instructionSet := newFrontierInstructionSet()
instructionSet[DELEGATECALL] = operation{ instructionSet[DELEGATECALL] = &operation{
execute: opDelegateCall, execute: opDelegateCall,
dynamicGas: gasDelegateCall, dynamicGas: gasDelegateCall,
constantGas: params.CallGasFrontier, constantGas: params.CallGasFrontier,
minStack: minStack(6, 1), minStack: minStack(6, 1),
maxStack: maxStack(6, 1), maxStack: maxStack(6, 1),
memorySize: memoryDelegateCall, memorySize: memoryDelegateCall,
valid: true,
returns: true, returns: true,
} }
return instructionSet return instructionSet
...@@ -220,161 +209,138 @@ func newFrontierInstructionSet() JumpTable { ...@@ -220,161 +209,138 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(0, 0), minStack: minStack(0, 0),
maxStack: maxStack(0, 0), maxStack: maxStack(0, 0),
halts: true, halts: true,
valid: true,
}, },
ADD: { ADD: {
execute: opAdd, execute: opAdd,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
MUL: { MUL: {
execute: opMul, execute: opMul,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
SUB: { SUB: {
execute: opSub, execute: opSub,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
DIV: { DIV: {
execute: opDiv, execute: opDiv,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
SDIV: { SDIV: {
execute: opSdiv, execute: opSdiv,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
MOD: { MOD: {
execute: opMod, execute: opMod,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
SMOD: { SMOD: {
execute: opSmod, execute: opSmod,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
ADDMOD: { ADDMOD: {
execute: opAddmod, execute: opAddmod,
constantGas: GasMidStep, constantGas: GasMidStep,
minStack: minStack(3, 1), minStack: minStack(3, 1),
maxStack: maxStack(3, 1), maxStack: maxStack(3, 1),
valid: true,
}, },
MULMOD: { MULMOD: {
execute: opMulmod, execute: opMulmod,
constantGas: GasMidStep, constantGas: GasMidStep,
minStack: minStack(3, 1), minStack: minStack(3, 1),
maxStack: maxStack(3, 1), maxStack: maxStack(3, 1),
valid: true,
}, },
EXP: { EXP: {
execute: opExp, execute: opExp,
dynamicGas: gasExpFrontier, dynamicGas: gasExpFrontier,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
SIGNEXTEND: { SIGNEXTEND: {
execute: opSignExtend, execute: opSignExtend,
constantGas: GasFastStep, constantGas: GasFastStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
LT: { LT: {
execute: opLt, execute: opLt,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
GT: { GT: {
execute: opGt, execute: opGt,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
SLT: { SLT: {
execute: opSlt, execute: opSlt,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
SGT: { SGT: {
execute: opSgt, execute: opSgt,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
EQ: { EQ: {
execute: opEq, execute: opEq,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
ISZERO: { ISZERO: {
execute: opIszero, execute: opIszero,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
valid: true,
}, },
AND: { AND: {
execute: opAnd, execute: opAnd,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
XOR: { XOR: {
execute: opXor, execute: opXor,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
OR: { OR: {
execute: opOr, execute: opOr,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
NOT: { NOT: {
execute: opNot, execute: opNot,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
valid: true,
}, },
BYTE: { BYTE: {
execute: opByte, execute: opByte,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
valid: true,
}, },
SHA3: { SHA3: {
execute: opSha3, execute: opSha3,
...@@ -383,56 +349,48 @@ func newFrontierInstructionSet() JumpTable { ...@@ -383,56 +349,48 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(2, 1), minStack: minStack(2, 1),
maxStack: maxStack(2, 1), maxStack: maxStack(2, 1),
memorySize: memorySha3, memorySize: memorySha3,
valid: true,
}, },
ADDRESS: { ADDRESS: {
execute: opAddress, execute: opAddress,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
BALANCE: { BALANCE: {
execute: opBalance, execute: opBalance,
constantGas: params.BalanceGasFrontier, constantGas: params.BalanceGasFrontier,
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
valid: true,
}, },
ORIGIN: { ORIGIN: {
execute: opOrigin, execute: opOrigin,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
CALLER: { CALLER: {
execute: opCaller, execute: opCaller,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
CALLVALUE: { CALLVALUE: {
execute: opCallValue, execute: opCallValue,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
CALLDATALOAD: { CALLDATALOAD: {
execute: opCallDataLoad, execute: opCallDataLoad,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
valid: true,
}, },
CALLDATASIZE: { CALLDATASIZE: {
execute: opCallDataSize, execute: opCallDataSize,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
CALLDATACOPY: { CALLDATACOPY: {
execute: opCallDataCopy, execute: opCallDataCopy,
...@@ -441,14 +399,12 @@ func newFrontierInstructionSet() JumpTable { ...@@ -441,14 +399,12 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(3, 0), minStack: minStack(3, 0),
maxStack: maxStack(3, 0), maxStack: maxStack(3, 0),
memorySize: memoryCallDataCopy, memorySize: memoryCallDataCopy,
valid: true,
}, },
CODESIZE: { CODESIZE: {
execute: opCodeSize, execute: opCodeSize,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
CODECOPY: { CODECOPY: {
execute: opCodeCopy, execute: opCodeCopy,
...@@ -457,21 +413,18 @@ func newFrontierInstructionSet() JumpTable { ...@@ -457,21 +413,18 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(3, 0), minStack: minStack(3, 0),
maxStack: maxStack(3, 0), maxStack: maxStack(3, 0),
memorySize: memoryCodeCopy, memorySize: memoryCodeCopy,
valid: true,
}, },
GASPRICE: { GASPRICE: {
execute: opGasprice, execute: opGasprice,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
EXTCODESIZE: { EXTCODESIZE: {
execute: opExtCodeSize, execute: opExtCodeSize,
constantGas: params.ExtcodeSizeGasFrontier, constantGas: params.ExtcodeSizeGasFrontier,
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
valid: true,
}, },
EXTCODECOPY: { EXTCODECOPY: {
execute: opExtCodeCopy, execute: opExtCodeCopy,
...@@ -480,56 +433,48 @@ func newFrontierInstructionSet() JumpTable { ...@@ -480,56 +433,48 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(4, 0), minStack: minStack(4, 0),
maxStack: maxStack(4, 0), maxStack: maxStack(4, 0),
memorySize: memoryExtCodeCopy, memorySize: memoryExtCodeCopy,
valid: true,
}, },
BLOCKHASH: { BLOCKHASH: {
execute: opBlockhash, execute: opBlockhash,
constantGas: GasExtStep, constantGas: GasExtStep,
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
valid: true,
}, },
COINBASE: { COINBASE: {
execute: opCoinbase, execute: opCoinbase,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
TIMESTAMP: { TIMESTAMP: {
execute: opTimestamp, execute: opTimestamp,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
NUMBER: { NUMBER: {
execute: opNumber, execute: opNumber,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
DIFFICULTY: { DIFFICULTY: {
execute: opDifficulty, execute: opDifficulty,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
GASLIMIT: { GASLIMIT: {
execute: opGasLimit, execute: opGasLimit,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
POP: { POP: {
execute: opPop, execute: opPop,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(1, 0), minStack: minStack(1, 0),
maxStack: maxStack(1, 0), maxStack: maxStack(1, 0),
valid: true,
}, },
MLOAD: { MLOAD: {
execute: opMload, execute: opMload,
...@@ -538,7 +483,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -538,7 +483,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
memorySize: memoryMLoad, memorySize: memoryMLoad,
valid: true,
}, },
MSTORE: { MSTORE: {
execute: opMstore, execute: opMstore,
...@@ -547,7 +491,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -547,7 +491,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(2, 0), minStack: minStack(2, 0),
maxStack: maxStack(2, 0), maxStack: maxStack(2, 0),
memorySize: memoryMStore, memorySize: memoryMStore,
valid: true,
}, },
MSTORE8: { MSTORE8: {
execute: opMstore8, execute: opMstore8,
...@@ -556,22 +499,18 @@ func newFrontierInstructionSet() JumpTable { ...@@ -556,22 +499,18 @@ func newFrontierInstructionSet() JumpTable {
memorySize: memoryMStore8, memorySize: memoryMStore8,
minStack: minStack(2, 0), minStack: minStack(2, 0),
maxStack: maxStack(2, 0), maxStack: maxStack(2, 0),
valid: true,
}, },
SLOAD: { SLOAD: {
execute: opSload, execute: opSload,
constantGas: params.SloadGasFrontier, constantGas: params.SloadGasFrontier,
minStack: minStack(1, 1), minStack: minStack(1, 1),
maxStack: maxStack(1, 1), maxStack: maxStack(1, 1),
valid: true,
}, },
SSTORE: { SSTORE: {
execute: opSstore, execute: opSstore,
dynamicGas: gasSStore, dynamicGas: gasSStore,
minStack: minStack(2, 0), minStack: minStack(2, 0),
maxStack: maxStack(2, 0), maxStack: maxStack(2, 0),
valid: true,
writes: true, writes: true,
}, },
JUMP: { JUMP: {
...@@ -580,7 +519,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -580,7 +519,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(1, 0), minStack: minStack(1, 0),
maxStack: maxStack(1, 0), maxStack: maxStack(1, 0),
jumps: true, jumps: true,
valid: true,
}, },
JUMPI: { JUMPI: {
execute: opJumpi, execute: opJumpi,
...@@ -588,483 +526,414 @@ func newFrontierInstructionSet() JumpTable { ...@@ -588,483 +526,414 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(2, 0), minStack: minStack(2, 0),
maxStack: maxStack(2, 0), maxStack: maxStack(2, 0),
jumps: true, jumps: true,
valid: true,
}, },
PC: { PC: {
execute: opPc, execute: opPc,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
MSIZE: { MSIZE: {
execute: opMsize, execute: opMsize,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
GAS: { GAS: {
execute: opGas, execute: opGas,
constantGas: GasQuickStep, constantGas: GasQuickStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
JUMPDEST: { JUMPDEST: {
execute: opJumpdest, execute: opJumpdest,
constantGas: params.JumpdestGas, constantGas: params.JumpdestGas,
minStack: minStack(0, 0), minStack: minStack(0, 0),
maxStack: maxStack(0, 0), maxStack: maxStack(0, 0),
valid: true,
}, },
PUSH1: { PUSH1: {
execute: opPush1, execute: opPush1,
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH2: { PUSH2: {
execute: makePush(2, 2), execute: makePush(2, 2),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH3: { PUSH3: {
execute: makePush(3, 3), execute: makePush(3, 3),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH4: { PUSH4: {
execute: makePush(4, 4), execute: makePush(4, 4),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH5: { PUSH5: {
execute: makePush(5, 5), execute: makePush(5, 5),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH6: { PUSH6: {
execute: makePush(6, 6), execute: makePush(6, 6),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH7: { PUSH7: {
execute: makePush(7, 7), execute: makePush(7, 7),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH8: { PUSH8: {
execute: makePush(8, 8), execute: makePush(8, 8),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH9: { PUSH9: {
execute: makePush(9, 9), execute: makePush(9, 9),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH10: { PUSH10: {
execute: makePush(10, 10), execute: makePush(10, 10),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH11: { PUSH11: {
execute: makePush(11, 11), execute: makePush(11, 11),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH12: { PUSH12: {
execute: makePush(12, 12), execute: makePush(12, 12),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH13: { PUSH13: {
execute: makePush(13, 13), execute: makePush(13, 13),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH14: { PUSH14: {
execute: makePush(14, 14), execute: makePush(14, 14),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH15: { PUSH15: {
execute: makePush(15, 15), execute: makePush(15, 15),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH16: { PUSH16: {
execute: makePush(16, 16), execute: makePush(16, 16),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH17: { PUSH17: {
execute: makePush(17, 17), execute: makePush(17, 17),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH18: { PUSH18: {
execute: makePush(18, 18), execute: makePush(18, 18),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH19: { PUSH19: {
execute: makePush(19, 19), execute: makePush(19, 19),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH20: { PUSH20: {
execute: makePush(20, 20), execute: makePush(20, 20),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH21: { PUSH21: {
execute: makePush(21, 21), execute: makePush(21, 21),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH22: { PUSH22: {
execute: makePush(22, 22), execute: makePush(22, 22),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH23: { PUSH23: {
execute: makePush(23, 23), execute: makePush(23, 23),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH24: { PUSH24: {
execute: makePush(24, 24), execute: makePush(24, 24),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH25: { PUSH25: {
execute: makePush(25, 25), execute: makePush(25, 25),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH26: { PUSH26: {
execute: makePush(26, 26), execute: makePush(26, 26),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH27: { PUSH27: {
execute: makePush(27, 27), execute: makePush(27, 27),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH28: { PUSH28: {
execute: makePush(28, 28), execute: makePush(28, 28),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH29: { PUSH29: {
execute: makePush(29, 29), execute: makePush(29, 29),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH30: { PUSH30: {
execute: makePush(30, 30), execute: makePush(30, 30),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH31: { PUSH31: {
execute: makePush(31, 31), execute: makePush(31, 31),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
PUSH32: { PUSH32: {
execute: makePush(32, 32), execute: makePush(32, 32),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minStack(0, 1), minStack: minStack(0, 1),
maxStack: maxStack(0, 1), maxStack: maxStack(0, 1),
valid: true,
}, },
DUP1: { DUP1: {
execute: makeDup(1), execute: makeDup(1),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(1), minStack: minDupStack(1),
maxStack: maxDupStack(1), maxStack: maxDupStack(1),
valid: true,
}, },
DUP2: { DUP2: {
execute: makeDup(2), execute: makeDup(2),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(2), minStack: minDupStack(2),
maxStack: maxDupStack(2), maxStack: maxDupStack(2),
valid: true,
}, },
DUP3: { DUP3: {
execute: makeDup(3), execute: makeDup(3),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(3), minStack: minDupStack(3),
maxStack: maxDupStack(3), maxStack: maxDupStack(3),
valid: true,
}, },
DUP4: { DUP4: {
execute: makeDup(4), execute: makeDup(4),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(4), minStack: minDupStack(4),
maxStack: maxDupStack(4), maxStack: maxDupStack(4),
valid: true,
}, },
DUP5: { DUP5: {
execute: makeDup(5), execute: makeDup(5),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(5), minStack: minDupStack(5),
maxStack: maxDupStack(5), maxStack: maxDupStack(5),
valid: true,
}, },
DUP6: { DUP6: {
execute: makeDup(6), execute: makeDup(6),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(6), minStack: minDupStack(6),
maxStack: maxDupStack(6), maxStack: maxDupStack(6),
valid: true,
}, },
DUP7: { DUP7: {
execute: makeDup(7), execute: makeDup(7),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(7), minStack: minDupStack(7),
maxStack: maxDupStack(7), maxStack: maxDupStack(7),
valid: true,
}, },
DUP8: { DUP8: {
execute: makeDup(8), execute: makeDup(8),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(8), minStack: minDupStack(8),
maxStack: maxDupStack(8), maxStack: maxDupStack(8),
valid: true,
}, },
DUP9: { DUP9: {
execute: makeDup(9), execute: makeDup(9),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(9), minStack: minDupStack(9),
maxStack: maxDupStack(9), maxStack: maxDupStack(9),
valid: true,
}, },
DUP10: { DUP10: {
execute: makeDup(10), execute: makeDup(10),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(10), minStack: minDupStack(10),
maxStack: maxDupStack(10), maxStack: maxDupStack(10),
valid: true,
}, },
DUP11: { DUP11: {
execute: makeDup(11), execute: makeDup(11),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(11), minStack: minDupStack(11),
maxStack: maxDupStack(11), maxStack: maxDupStack(11),
valid: true,
}, },
DUP12: { DUP12: {
execute: makeDup(12), execute: makeDup(12),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(12), minStack: minDupStack(12),
maxStack: maxDupStack(12), maxStack: maxDupStack(12),
valid: true,
}, },
DUP13: { DUP13: {
execute: makeDup(13), execute: makeDup(13),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(13), minStack: minDupStack(13),
maxStack: maxDupStack(13), maxStack: maxDupStack(13),
valid: true,
}, },
DUP14: { DUP14: {
execute: makeDup(14), execute: makeDup(14),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(14), minStack: minDupStack(14),
maxStack: maxDupStack(14), maxStack: maxDupStack(14),
valid: true,
}, },
DUP15: { DUP15: {
execute: makeDup(15), execute: makeDup(15),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(15), minStack: minDupStack(15),
maxStack: maxDupStack(15), maxStack: maxDupStack(15),
valid: true,
}, },
DUP16: { DUP16: {
execute: makeDup(16), execute: makeDup(16),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minDupStack(16), minStack: minDupStack(16),
maxStack: maxDupStack(16), maxStack: maxDupStack(16),
valid: true,
}, },
SWAP1: { SWAP1: {
execute: makeSwap(1), execute: makeSwap(1),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(2), minStack: minSwapStack(2),
maxStack: maxSwapStack(2), maxStack: maxSwapStack(2),
valid: true,
}, },
SWAP2: { SWAP2: {
execute: makeSwap(2), execute: makeSwap(2),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(3), minStack: minSwapStack(3),
maxStack: maxSwapStack(3), maxStack: maxSwapStack(3),
valid: true,
}, },
SWAP3: { SWAP3: {
execute: makeSwap(3), execute: makeSwap(3),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(4), minStack: minSwapStack(4),
maxStack: maxSwapStack(4), maxStack: maxSwapStack(4),
valid: true,
}, },
SWAP4: { SWAP4: {
execute: makeSwap(4), execute: makeSwap(4),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(5), minStack: minSwapStack(5),
maxStack: maxSwapStack(5), maxStack: maxSwapStack(5),
valid: true,
}, },
SWAP5: { SWAP5: {
execute: makeSwap(5), execute: makeSwap(5),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(6), minStack: minSwapStack(6),
maxStack: maxSwapStack(6), maxStack: maxSwapStack(6),
valid: true,
}, },
SWAP6: { SWAP6: {
execute: makeSwap(6), execute: makeSwap(6),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(7), minStack: minSwapStack(7),
maxStack: maxSwapStack(7), maxStack: maxSwapStack(7),
valid: true,
}, },
SWAP7: { SWAP7: {
execute: makeSwap(7), execute: makeSwap(7),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(8), minStack: minSwapStack(8),
maxStack: maxSwapStack(8), maxStack: maxSwapStack(8),
valid: true,
}, },
SWAP8: { SWAP8: {
execute: makeSwap(8), execute: makeSwap(8),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(9), minStack: minSwapStack(9),
maxStack: maxSwapStack(9), maxStack: maxSwapStack(9),
valid: true,
}, },
SWAP9: { SWAP9: {
execute: makeSwap(9), execute: makeSwap(9),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(10), minStack: minSwapStack(10),
maxStack: maxSwapStack(10), maxStack: maxSwapStack(10),
valid: true,
}, },
SWAP10: { SWAP10: {
execute: makeSwap(10), execute: makeSwap(10),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(11), minStack: minSwapStack(11),
maxStack: maxSwapStack(11), maxStack: maxSwapStack(11),
valid: true,
}, },
SWAP11: { SWAP11: {
execute: makeSwap(11), execute: makeSwap(11),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(12), minStack: minSwapStack(12),
maxStack: maxSwapStack(12), maxStack: maxSwapStack(12),
valid: true,
}, },
SWAP12: { SWAP12: {
execute: makeSwap(12), execute: makeSwap(12),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(13), minStack: minSwapStack(13),
maxStack: maxSwapStack(13), maxStack: maxSwapStack(13),
valid: true,
}, },
SWAP13: { SWAP13: {
execute: makeSwap(13), execute: makeSwap(13),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(14), minStack: minSwapStack(14),
maxStack: maxSwapStack(14), maxStack: maxSwapStack(14),
valid: true,
}, },
SWAP14: { SWAP14: {
execute: makeSwap(14), execute: makeSwap(14),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(15), minStack: minSwapStack(15),
maxStack: maxSwapStack(15), maxStack: maxSwapStack(15),
valid: true,
}, },
SWAP15: { SWAP15: {
execute: makeSwap(15), execute: makeSwap(15),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(16), minStack: minSwapStack(16),
maxStack: maxSwapStack(16), maxStack: maxSwapStack(16),
valid: true,
}, },
SWAP16: { SWAP16: {
execute: makeSwap(16), execute: makeSwap(16),
constantGas: GasFastestStep, constantGas: GasFastestStep,
minStack: minSwapStack(17), minStack: minSwapStack(17),
maxStack: maxSwapStack(17), maxStack: maxSwapStack(17),
valid: true,
}, },
LOG0: { LOG0: {
execute: makeLog(0), execute: makeLog(0),
...@@ -1072,7 +941,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1072,7 +941,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(2, 0), minStack: minStack(2, 0),
maxStack: maxStack(2, 0), maxStack: maxStack(2, 0),
memorySize: memoryLog, memorySize: memoryLog,
valid: true,
writes: true, writes: true,
}, },
LOG1: { LOG1: {
...@@ -1081,7 +949,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1081,7 +949,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(3, 0), minStack: minStack(3, 0),
maxStack: maxStack(3, 0), maxStack: maxStack(3, 0),
memorySize: memoryLog, memorySize: memoryLog,
valid: true,
writes: true, writes: true,
}, },
LOG2: { LOG2: {
...@@ -1090,7 +957,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1090,7 +957,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(4, 0), minStack: minStack(4, 0),
maxStack: maxStack(4, 0), maxStack: maxStack(4, 0),
memorySize: memoryLog, memorySize: memoryLog,
valid: true,
writes: true, writes: true,
}, },
LOG3: { LOG3: {
...@@ -1099,7 +965,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1099,7 +965,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(5, 0), minStack: minStack(5, 0),
maxStack: maxStack(5, 0), maxStack: maxStack(5, 0),
memorySize: memoryLog, memorySize: memoryLog,
valid: true,
writes: true, writes: true,
}, },
LOG4: { LOG4: {
...@@ -1108,7 +973,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1108,7 +973,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(6, 0), minStack: minStack(6, 0),
maxStack: maxStack(6, 0), maxStack: maxStack(6, 0),
memorySize: memoryLog, memorySize: memoryLog,
valid: true,
writes: true, writes: true,
}, },
CREATE: { CREATE: {
...@@ -1118,7 +982,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1118,7 +982,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(3, 1), minStack: minStack(3, 1),
maxStack: maxStack(3, 1), maxStack: maxStack(3, 1),
memorySize: memoryCreate, memorySize: memoryCreate,
valid: true,
writes: true, writes: true,
returns: true, returns: true,
}, },
...@@ -1129,7 +992,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1129,7 +992,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(7, 1), minStack: minStack(7, 1),
maxStack: maxStack(7, 1), maxStack: maxStack(7, 1),
memorySize: memoryCall, memorySize: memoryCall,
valid: true,
returns: true, returns: true,
}, },
CALLCODE: { CALLCODE: {
...@@ -1139,7 +1001,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1139,7 +1001,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(7, 1), minStack: minStack(7, 1),
maxStack: maxStack(7, 1), maxStack: maxStack(7, 1),
memorySize: memoryCall, memorySize: memoryCall,
valid: true,
returns: true, returns: true,
}, },
RETURN: { RETURN: {
...@@ -1149,7 +1010,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1149,7 +1010,6 @@ func newFrontierInstructionSet() JumpTable {
maxStack: maxStack(2, 0), maxStack: maxStack(2, 0),
memorySize: memoryReturn, memorySize: memoryReturn,
halts: true, halts: true,
valid: true,
}, },
SELFDESTRUCT: { SELFDESTRUCT: {
execute: opSuicide, execute: opSuicide,
...@@ -1157,7 +1017,6 @@ func newFrontierInstructionSet() JumpTable { ...@@ -1157,7 +1017,6 @@ func newFrontierInstructionSet() JumpTable {
minStack: minStack(1, 0), minStack: minStack(1, 0),
maxStack: maxStack(1, 0), maxStack: maxStack(1, 0),
halts: true, halts: true,
valid: true,
writes: true, writes: true,
}, },
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment