Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
508891e6
Unverified
Commit
508891e6
authored
Jul 16, 2020
by
Péter Szilágyi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
core/vm: use pointers to operations vs. copy by value
parent
9e88224e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
19 additions
and
165 deletions
+19
-165
eips.go
core/vm/eips.go
+5
-10
interpreter.go
core/vm/interpreter.go
+3
-3
jump_table.go
core/vm/jump_table.go
+11
-152
No files found.
core/vm/eips.go
View file @
508891e6
...
...
@@ -68,12 +68,11 @@ func enable1884(jt *JumpTable) {
jt
[
EXTCODEHASH
]
.
constantGas
=
params
.
ExtcodeHashGasEIP1884
// New opcode
jt
[
SELFBALANCE
]
=
operation
{
jt
[
SELFBALANCE
]
=
&
operation
{
execute
:
opSelfBalance
,
constantGas
:
GasFastStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
}
}
...
...
@@ -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
func
enable1344
(
jt
*
JumpTable
)
{
// New opcode
jt
[
CHAINID
]
=
operation
{
jt
[
CHAINID
]
=
&
operation
{
execute
:
opChainID
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
}
}
...
...
@@ -113,29 +111,26 @@ func enable2200(jt *JumpTable) {
// - Adds opcodes that jump to and return from subroutines
func
enable2315
(
jt
*
JumpTable
)
{
// New opcode
jt
[
BEGINSUB
]
=
operation
{
jt
[
BEGINSUB
]
=
&
operation
{
execute
:
opBeginSub
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
0
),
maxStack
:
maxStack
(
0
,
0
),
valid
:
true
,
}
// New opcode
jt
[
JUMPSUB
]
=
operation
{
jt
[
JUMPSUB
]
=
&
operation
{
execute
:
opJumpSub
,
constantGas
:
GasSlowStep
,
minStack
:
minStack
(
1
,
0
),
maxStack
:
maxStack
(
1
,
0
),
jumps
:
true
,
valid
:
true
,
}
// New opcode
jt
[
RETURNSUB
]
=
operation
{
jt
[
RETURNSUB
]
=
&
operation
{
execute
:
opReturnSub
,
constantGas
:
GasFastStep
,
minStack
:
minStack
(
0
,
0
),
maxStack
:
maxStack
(
0
,
0
),
valid
:
true
,
jumps
:
true
,
}
}
core/vm/interpreter.go
View file @
508891e6
...
...
@@ -32,7 +32,7 @@ type Config struct {
NoRecursion
bool
// Disables call, callcode, delegate call and create
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
EVMInterpreter
string
// External EVM interpreter options
...
...
@@ -96,7 +96,7 @@ func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter {
// We use the STOP instruction whether to see
// the jump table was initialised. If it was not
// we'll set the default jump table.
if
!
cfg
.
JumpTable
[
STOP
]
.
valid
{
if
cfg
.
JumpTable
[
STOP
]
==
nil
{
var
jt
JumpTable
switch
{
case
evm
.
chainRules
.
IsYoloV1
:
...
...
@@ -221,7 +221,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) (
// enough stack items available to perform the operation.
op
=
contract
.
GetOp
(
pc
)
operation
:=
in
.
cfg
.
JumpTable
[
op
]
if
!
operation
.
valid
{
if
operation
==
nil
{
return
nil
,
&
ErrInvalidOpCode
{
opcode
:
op
}
}
// Validate stack
...
...
core/vm/jump_table.go
View file @
508891e6
...
...
@@ -44,7 +44,6 @@ type operation struct {
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
}
...
...
@@ -61,7 +60,7 @@ var (
)
// JumpTable contains the EVM opcodes supported at a given fork.
type
JumpTable
[
256
]
operation
type
JumpTable
[
256
]
*
operation
func
newYoloV1InstructionSet
()
JumpTable
{
instructionSet
:=
newIstanbulInstructionSet
()
...
...
@@ -87,42 +86,37 @@ func newIstanbulInstructionSet() JumpTable {
// byzantium and contantinople instructions.
func
newConstantinopleInstructionSet
()
JumpTable
{
instructionSet
:=
newByzantiumInstructionSet
()
instructionSet
[
SHL
]
=
operation
{
instructionSet
[
SHL
]
=
&
operation
{
execute
:
opSHL
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
}
instructionSet
[
SHR
]
=
operation
{
instructionSet
[
SHR
]
=
&
operation
{
execute
:
opSHR
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
}
instructionSet
[
SAR
]
=
operation
{
instructionSet
[
SAR
]
=
&
operation
{
execute
:
opSAR
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
}
instructionSet
[
EXTCODEHASH
]
=
operation
{
instructionSet
[
EXTCODEHASH
]
=
&
operation
{
execute
:
opExtCodeHash
,
constantGas
:
params
.
ExtcodeHashGasConstantinople
,
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
valid
:
true
,
}
instructionSet
[
CREATE2
]
=
operation
{
instructionSet
[
CREATE2
]
=
&
operation
{
execute
:
opCreate2
,
constantGas
:
params
.
Create2Gas
,
dynamicGas
:
gasCreate2
,
minStack
:
minStack
(
4
,
1
),
maxStack
:
maxStack
(
4
,
1
),
memorySize
:
memoryCreate2
,
valid
:
true
,
writes
:
true
,
returns
:
true
,
}
...
...
@@ -133,39 +127,35 @@ func newConstantinopleInstructionSet() JumpTable {
// byzantium instructions.
func
newByzantiumInstructionSet
()
JumpTable
{
instructionSet
:=
newSpuriousDragonInstructionSet
()
instructionSet
[
STATICCALL
]
=
operation
{
instructionSet
[
STATICCALL
]
=
&
operation
{
execute
:
opStaticCall
,
constantGas
:
params
.
CallGasEIP150
,
dynamicGas
:
gasStaticCall
,
minStack
:
minStack
(
6
,
1
),
maxStack
:
maxStack
(
6
,
1
),
memorySize
:
memoryStaticCall
,
valid
:
true
,
returns
:
true
,
}
instructionSet
[
RETURNDATASIZE
]
=
operation
{
instructionSet
[
RETURNDATASIZE
]
=
&
operation
{
execute
:
opReturnDataSize
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
}
instructionSet
[
RETURNDATACOPY
]
=
operation
{
instructionSet
[
RETURNDATACOPY
]
=
&
operation
{
execute
:
opReturnDataCopy
,
constantGas
:
GasFastestStep
,
dynamicGas
:
gasReturnDataCopy
,
minStack
:
minStack
(
3
,
0
),
maxStack
:
maxStack
(
3
,
0
),
memorySize
:
memoryReturnDataCopy
,
valid
:
true
,
}
instructionSet
[
REVERT
]
=
operation
{
instructionSet
[
REVERT
]
=
&
operation
{
execute
:
opRevert
,
dynamicGas
:
gasRevert
,
minStack
:
minStack
(
2
,
0
),
maxStack
:
maxStack
(
2
,
0
),
memorySize
:
memoryRevert
,
valid
:
true
,
reverts
:
true
,
returns
:
true
,
}
...
...
@@ -197,14 +187,13 @@ func newTangerineWhistleInstructionSet() JumpTable {
// instructions that can be executed during the homestead phase.
func
newHomesteadInstructionSet
()
JumpTable
{
instructionSet
:=
newFrontierInstructionSet
()
instructionSet
[
DELEGATECALL
]
=
operation
{
instructionSet
[
DELEGATECALL
]
=
&
operation
{
execute
:
opDelegateCall
,
dynamicGas
:
gasDelegateCall
,
constantGas
:
params
.
CallGasFrontier
,
minStack
:
minStack
(
6
,
1
),
maxStack
:
maxStack
(
6
,
1
),
memorySize
:
memoryDelegateCall
,
valid
:
true
,
returns
:
true
,
}
return
instructionSet
...
...
@@ -220,161 +209,138 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
0
,
0
),
maxStack
:
maxStack
(
0
,
0
),
halts
:
true
,
valid
:
true
,
},
ADD
:
{
execute
:
opAdd
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
MUL
:
{
execute
:
opMul
,
constantGas
:
GasFastStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
SUB
:
{
execute
:
opSub
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
DIV
:
{
execute
:
opDiv
,
constantGas
:
GasFastStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
SDIV
:
{
execute
:
opSdiv
,
constantGas
:
GasFastStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
MOD
:
{
execute
:
opMod
,
constantGas
:
GasFastStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
SMOD
:
{
execute
:
opSmod
,
constantGas
:
GasFastStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
ADDMOD
:
{
execute
:
opAddmod
,
constantGas
:
GasMidStep
,
minStack
:
minStack
(
3
,
1
),
maxStack
:
maxStack
(
3
,
1
),
valid
:
true
,
},
MULMOD
:
{
execute
:
opMulmod
,
constantGas
:
GasMidStep
,
minStack
:
minStack
(
3
,
1
),
maxStack
:
maxStack
(
3
,
1
),
valid
:
true
,
},
EXP
:
{
execute
:
opExp
,
dynamicGas
:
gasExpFrontier
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
SIGNEXTEND
:
{
execute
:
opSignExtend
,
constantGas
:
GasFastStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
LT
:
{
execute
:
opLt
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
GT
:
{
execute
:
opGt
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
SLT
:
{
execute
:
opSlt
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
SGT
:
{
execute
:
opSgt
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
EQ
:
{
execute
:
opEq
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
ISZERO
:
{
execute
:
opIszero
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
valid
:
true
,
},
AND
:
{
execute
:
opAnd
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
XOR
:
{
execute
:
opXor
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
OR
:
{
execute
:
opOr
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
NOT
:
{
execute
:
opNot
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
valid
:
true
,
},
BYTE
:
{
execute
:
opByte
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
valid
:
true
,
},
SHA3
:
{
execute
:
opSha3
,
...
...
@@ -383,56 +349,48 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
2
,
1
),
maxStack
:
maxStack
(
2
,
1
),
memorySize
:
memorySha3
,
valid
:
true
,
},
ADDRESS
:
{
execute
:
opAddress
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
BALANCE
:
{
execute
:
opBalance
,
constantGas
:
params
.
BalanceGasFrontier
,
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
valid
:
true
,
},
ORIGIN
:
{
execute
:
opOrigin
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
CALLER
:
{
execute
:
opCaller
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
CALLVALUE
:
{
execute
:
opCallValue
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
CALLDATALOAD
:
{
execute
:
opCallDataLoad
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
valid
:
true
,
},
CALLDATASIZE
:
{
execute
:
opCallDataSize
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
CALLDATACOPY
:
{
execute
:
opCallDataCopy
,
...
...
@@ -441,14 +399,12 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
3
,
0
),
maxStack
:
maxStack
(
3
,
0
),
memorySize
:
memoryCallDataCopy
,
valid
:
true
,
},
CODESIZE
:
{
execute
:
opCodeSize
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
CODECOPY
:
{
execute
:
opCodeCopy
,
...
...
@@ -457,21 +413,18 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
3
,
0
),
maxStack
:
maxStack
(
3
,
0
),
memorySize
:
memoryCodeCopy
,
valid
:
true
,
},
GASPRICE
:
{
execute
:
opGasprice
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
EXTCODESIZE
:
{
execute
:
opExtCodeSize
,
constantGas
:
params
.
ExtcodeSizeGasFrontier
,
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
valid
:
true
,
},
EXTCODECOPY
:
{
execute
:
opExtCodeCopy
,
...
...
@@ -480,56 +433,48 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
4
,
0
),
maxStack
:
maxStack
(
4
,
0
),
memorySize
:
memoryExtCodeCopy
,
valid
:
true
,
},
BLOCKHASH
:
{
execute
:
opBlockhash
,
constantGas
:
GasExtStep
,
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
valid
:
true
,
},
COINBASE
:
{
execute
:
opCoinbase
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
TIMESTAMP
:
{
execute
:
opTimestamp
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
NUMBER
:
{
execute
:
opNumber
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
DIFFICULTY
:
{
execute
:
opDifficulty
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
GASLIMIT
:
{
execute
:
opGasLimit
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
POP
:
{
execute
:
opPop
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
1
,
0
),
maxStack
:
maxStack
(
1
,
0
),
valid
:
true
,
},
MLOAD
:
{
execute
:
opMload
,
...
...
@@ -538,7 +483,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
memorySize
:
memoryMLoad
,
valid
:
true
,
},
MSTORE
:
{
execute
:
opMstore
,
...
...
@@ -547,7 +491,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
2
,
0
),
maxStack
:
maxStack
(
2
,
0
),
memorySize
:
memoryMStore
,
valid
:
true
,
},
MSTORE8
:
{
execute
:
opMstore8
,
...
...
@@ -556,22 +499,18 @@ func newFrontierInstructionSet() JumpTable {
memorySize
:
memoryMStore8
,
minStack
:
minStack
(
2
,
0
),
maxStack
:
maxStack
(
2
,
0
),
valid
:
true
,
},
SLOAD
:
{
execute
:
opSload
,
constantGas
:
params
.
SloadGasFrontier
,
minStack
:
minStack
(
1
,
1
),
maxStack
:
maxStack
(
1
,
1
),
valid
:
true
,
},
SSTORE
:
{
execute
:
opSstore
,
dynamicGas
:
gasSStore
,
minStack
:
minStack
(
2
,
0
),
maxStack
:
maxStack
(
2
,
0
),
valid
:
true
,
writes
:
true
,
},
JUMP
:
{
...
...
@@ -580,7 +519,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
1
,
0
),
maxStack
:
maxStack
(
1
,
0
),
jumps
:
true
,
valid
:
true
,
},
JUMPI
:
{
execute
:
opJumpi
,
...
...
@@ -588,483 +526,414 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
2
,
0
),
maxStack
:
maxStack
(
2
,
0
),
jumps
:
true
,
valid
:
true
,
},
PC
:
{
execute
:
opPc
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
MSIZE
:
{
execute
:
opMsize
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
GAS
:
{
execute
:
opGas
,
constantGas
:
GasQuickStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
JUMPDEST
:
{
execute
:
opJumpdest
,
constantGas
:
params
.
JumpdestGas
,
minStack
:
minStack
(
0
,
0
),
maxStack
:
maxStack
(
0
,
0
),
valid
:
true
,
},
PUSH1
:
{
execute
:
opPush1
,
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH2
:
{
execute
:
makePush
(
2
,
2
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH3
:
{
execute
:
makePush
(
3
,
3
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH4
:
{
execute
:
makePush
(
4
,
4
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH5
:
{
execute
:
makePush
(
5
,
5
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH6
:
{
execute
:
makePush
(
6
,
6
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH7
:
{
execute
:
makePush
(
7
,
7
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH8
:
{
execute
:
makePush
(
8
,
8
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH9
:
{
execute
:
makePush
(
9
,
9
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH10
:
{
execute
:
makePush
(
10
,
10
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH11
:
{
execute
:
makePush
(
11
,
11
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH12
:
{
execute
:
makePush
(
12
,
12
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH13
:
{
execute
:
makePush
(
13
,
13
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH14
:
{
execute
:
makePush
(
14
,
14
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH15
:
{
execute
:
makePush
(
15
,
15
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH16
:
{
execute
:
makePush
(
16
,
16
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH17
:
{
execute
:
makePush
(
17
,
17
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH18
:
{
execute
:
makePush
(
18
,
18
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH19
:
{
execute
:
makePush
(
19
,
19
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH20
:
{
execute
:
makePush
(
20
,
20
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH21
:
{
execute
:
makePush
(
21
,
21
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH22
:
{
execute
:
makePush
(
22
,
22
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH23
:
{
execute
:
makePush
(
23
,
23
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH24
:
{
execute
:
makePush
(
24
,
24
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH25
:
{
execute
:
makePush
(
25
,
25
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH26
:
{
execute
:
makePush
(
26
,
26
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH27
:
{
execute
:
makePush
(
27
,
27
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH28
:
{
execute
:
makePush
(
28
,
28
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH29
:
{
execute
:
makePush
(
29
,
29
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH30
:
{
execute
:
makePush
(
30
,
30
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH31
:
{
execute
:
makePush
(
31
,
31
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
PUSH32
:
{
execute
:
makePush
(
32
,
32
),
constantGas
:
GasFastestStep
,
minStack
:
minStack
(
0
,
1
),
maxStack
:
maxStack
(
0
,
1
),
valid
:
true
,
},
DUP1
:
{
execute
:
makeDup
(
1
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
1
),
maxStack
:
maxDupStack
(
1
),
valid
:
true
,
},
DUP2
:
{
execute
:
makeDup
(
2
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
2
),
maxStack
:
maxDupStack
(
2
),
valid
:
true
,
},
DUP3
:
{
execute
:
makeDup
(
3
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
3
),
maxStack
:
maxDupStack
(
3
),
valid
:
true
,
},
DUP4
:
{
execute
:
makeDup
(
4
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
4
),
maxStack
:
maxDupStack
(
4
),
valid
:
true
,
},
DUP5
:
{
execute
:
makeDup
(
5
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
5
),
maxStack
:
maxDupStack
(
5
),
valid
:
true
,
},
DUP6
:
{
execute
:
makeDup
(
6
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
6
),
maxStack
:
maxDupStack
(
6
),
valid
:
true
,
},
DUP7
:
{
execute
:
makeDup
(
7
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
7
),
maxStack
:
maxDupStack
(
7
),
valid
:
true
,
},
DUP8
:
{
execute
:
makeDup
(
8
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
8
),
maxStack
:
maxDupStack
(
8
),
valid
:
true
,
},
DUP9
:
{
execute
:
makeDup
(
9
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
9
),
maxStack
:
maxDupStack
(
9
),
valid
:
true
,
},
DUP10
:
{
execute
:
makeDup
(
10
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
10
),
maxStack
:
maxDupStack
(
10
),
valid
:
true
,
},
DUP11
:
{
execute
:
makeDup
(
11
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
11
),
maxStack
:
maxDupStack
(
11
),
valid
:
true
,
},
DUP12
:
{
execute
:
makeDup
(
12
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
12
),
maxStack
:
maxDupStack
(
12
),
valid
:
true
,
},
DUP13
:
{
execute
:
makeDup
(
13
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
13
),
maxStack
:
maxDupStack
(
13
),
valid
:
true
,
},
DUP14
:
{
execute
:
makeDup
(
14
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
14
),
maxStack
:
maxDupStack
(
14
),
valid
:
true
,
},
DUP15
:
{
execute
:
makeDup
(
15
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
15
),
maxStack
:
maxDupStack
(
15
),
valid
:
true
,
},
DUP16
:
{
execute
:
makeDup
(
16
),
constantGas
:
GasFastestStep
,
minStack
:
minDupStack
(
16
),
maxStack
:
maxDupStack
(
16
),
valid
:
true
,
},
SWAP1
:
{
execute
:
makeSwap
(
1
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
2
),
maxStack
:
maxSwapStack
(
2
),
valid
:
true
,
},
SWAP2
:
{
execute
:
makeSwap
(
2
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
3
),
maxStack
:
maxSwapStack
(
3
),
valid
:
true
,
},
SWAP3
:
{
execute
:
makeSwap
(
3
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
4
),
maxStack
:
maxSwapStack
(
4
),
valid
:
true
,
},
SWAP4
:
{
execute
:
makeSwap
(
4
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
5
),
maxStack
:
maxSwapStack
(
5
),
valid
:
true
,
},
SWAP5
:
{
execute
:
makeSwap
(
5
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
6
),
maxStack
:
maxSwapStack
(
6
),
valid
:
true
,
},
SWAP6
:
{
execute
:
makeSwap
(
6
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
7
),
maxStack
:
maxSwapStack
(
7
),
valid
:
true
,
},
SWAP7
:
{
execute
:
makeSwap
(
7
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
8
),
maxStack
:
maxSwapStack
(
8
),
valid
:
true
,
},
SWAP8
:
{
execute
:
makeSwap
(
8
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
9
),
maxStack
:
maxSwapStack
(
9
),
valid
:
true
,
},
SWAP9
:
{
execute
:
makeSwap
(
9
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
10
),
maxStack
:
maxSwapStack
(
10
),
valid
:
true
,
},
SWAP10
:
{
execute
:
makeSwap
(
10
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
11
),
maxStack
:
maxSwapStack
(
11
),
valid
:
true
,
},
SWAP11
:
{
execute
:
makeSwap
(
11
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
12
),
maxStack
:
maxSwapStack
(
12
),
valid
:
true
,
},
SWAP12
:
{
execute
:
makeSwap
(
12
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
13
),
maxStack
:
maxSwapStack
(
13
),
valid
:
true
,
},
SWAP13
:
{
execute
:
makeSwap
(
13
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
14
),
maxStack
:
maxSwapStack
(
14
),
valid
:
true
,
},
SWAP14
:
{
execute
:
makeSwap
(
14
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
15
),
maxStack
:
maxSwapStack
(
15
),
valid
:
true
,
},
SWAP15
:
{
execute
:
makeSwap
(
15
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
16
),
maxStack
:
maxSwapStack
(
16
),
valid
:
true
,
},
SWAP16
:
{
execute
:
makeSwap
(
16
),
constantGas
:
GasFastestStep
,
minStack
:
minSwapStack
(
17
),
maxStack
:
maxSwapStack
(
17
),
valid
:
true
,
},
LOG0
:
{
execute
:
makeLog
(
0
),
...
...
@@ -1072,7 +941,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
2
,
0
),
maxStack
:
maxStack
(
2
,
0
),
memorySize
:
memoryLog
,
valid
:
true
,
writes
:
true
,
},
LOG1
:
{
...
...
@@ -1081,7 +949,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
3
,
0
),
maxStack
:
maxStack
(
3
,
0
),
memorySize
:
memoryLog
,
valid
:
true
,
writes
:
true
,
},
LOG2
:
{
...
...
@@ -1090,7 +957,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
4
,
0
),
maxStack
:
maxStack
(
4
,
0
),
memorySize
:
memoryLog
,
valid
:
true
,
writes
:
true
,
},
LOG3
:
{
...
...
@@ -1099,7 +965,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
5
,
0
),
maxStack
:
maxStack
(
5
,
0
),
memorySize
:
memoryLog
,
valid
:
true
,
writes
:
true
,
},
LOG4
:
{
...
...
@@ -1108,7 +973,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
6
,
0
),
maxStack
:
maxStack
(
6
,
0
),
memorySize
:
memoryLog
,
valid
:
true
,
writes
:
true
,
},
CREATE
:
{
...
...
@@ -1118,7 +982,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
3
,
1
),
maxStack
:
maxStack
(
3
,
1
),
memorySize
:
memoryCreate
,
valid
:
true
,
writes
:
true
,
returns
:
true
,
},
...
...
@@ -1129,7 +992,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
7
,
1
),
maxStack
:
maxStack
(
7
,
1
),
memorySize
:
memoryCall
,
valid
:
true
,
returns
:
true
,
},
CALLCODE
:
{
...
...
@@ -1139,7 +1001,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
7
,
1
),
maxStack
:
maxStack
(
7
,
1
),
memorySize
:
memoryCall
,
valid
:
true
,
returns
:
true
,
},
RETURN
:
{
...
...
@@ -1149,7 +1010,6 @@ func newFrontierInstructionSet() JumpTable {
maxStack
:
maxStack
(
2
,
0
),
memorySize
:
memoryReturn
,
halts
:
true
,
valid
:
true
,
},
SELFDESTRUCT
:
{
execute
:
opSuicide
,
...
...
@@ -1157,7 +1017,6 @@ func newFrontierInstructionSet() JumpTable {
minStack
:
minStack
(
1
,
0
),
maxStack
:
maxStack
(
1
,
0
),
halts
:
true
,
valid
:
true
,
writes
:
true
,
},
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment