|
|
|
@ -33,7 +33,7 @@ type Config struct { |
|
|
|
|
NoBaseFee bool // Forces the EIP-1559 baseFee to 0 (needed for 0 price calls)
|
|
|
|
|
EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages
|
|
|
|
|
|
|
|
|
|
JumpTable JumpTable // EVM instruction table, automatically populated if unset
|
|
|
|
|
JumpTable *JumpTable // EVM instruction table, automatically populated if unset
|
|
|
|
|
|
|
|
|
|
ExtraEips []int // Additional EIPS that are to be enabled
|
|
|
|
|
} |
|
|
|
@ -68,39 +68,37 @@ type EVMInterpreter struct { |
|
|
|
|
|
|
|
|
|
// NewEVMInterpreter returns a new instance of the Interpreter.
|
|
|
|
|
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] == nil { |
|
|
|
|
var jt JumpTable |
|
|
|
|
// If jump table was not initialised we set the default one.
|
|
|
|
|
if cfg.JumpTable == nil { |
|
|
|
|
switch { |
|
|
|
|
case evm.chainRules.IsLondon: |
|
|
|
|
jt = londonInstructionSet |
|
|
|
|
cfg.JumpTable = &londonInstructionSet |
|
|
|
|
case evm.chainRules.IsBerlin: |
|
|
|
|
jt = berlinInstructionSet |
|
|
|
|
cfg.JumpTable = &berlinInstructionSet |
|
|
|
|
case evm.chainRules.IsIstanbul: |
|
|
|
|
jt = istanbulInstructionSet |
|
|
|
|
cfg.JumpTable = &istanbulInstructionSet |
|
|
|
|
case evm.chainRules.IsConstantinople: |
|
|
|
|
jt = constantinopleInstructionSet |
|
|
|
|
cfg.JumpTable = &constantinopleInstructionSet |
|
|
|
|
case evm.chainRules.IsByzantium: |
|
|
|
|
jt = byzantiumInstructionSet |
|
|
|
|
cfg.JumpTable = &byzantiumInstructionSet |
|
|
|
|
case evm.chainRules.IsEIP158: |
|
|
|
|
jt = spuriousDragonInstructionSet |
|
|
|
|
cfg.JumpTable = &spuriousDragonInstructionSet |
|
|
|
|
case evm.chainRules.IsEIP150: |
|
|
|
|
jt = tangerineWhistleInstructionSet |
|
|
|
|
cfg.JumpTable = &tangerineWhistleInstructionSet |
|
|
|
|
case evm.chainRules.IsHomestead: |
|
|
|
|
jt = homesteadInstructionSet |
|
|
|
|
cfg.JumpTable = &homesteadInstructionSet |
|
|
|
|
default: |
|
|
|
|
jt = frontierInstructionSet |
|
|
|
|
cfg.JumpTable = &frontierInstructionSet |
|
|
|
|
} |
|
|
|
|
for i, eip := range cfg.ExtraEips { |
|
|
|
|
if err := EnableEIP(eip, &jt); err != nil { |
|
|
|
|
copy := *cfg.JumpTable |
|
|
|
|
if err := EnableEIP(eip, ©); err != nil { |
|
|
|
|
// Disable it, so caller can check if it's activated or not
|
|
|
|
|
cfg.ExtraEips = append(cfg.ExtraEips[:i], cfg.ExtraEips[i+1:]...) |
|
|
|
|
log.Error("EIP activation failed", "eip", eip, "error", err) |
|
|
|
|
} |
|
|
|
|
cfg.JumpTable = © |
|
|
|
|
} |
|
|
|
|
cfg.JumpTable = jt |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return &EVMInterpreter{ |
|
|
|
|