core/vm: don't copy JumpTable when no EIP mods are needed (#23977)

This commit is contained in:
Andrei Maiboroda 2021-11-30 13:21:40 +01:00 committed by GitHub
parent a69d4b273d
commit 163f1665dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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