From 7bbdf3e2687ea293b68a7f73c039cbde411217fa Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Thu, 10 Aug 2017 14:07:11 +0300 Subject: core: add Metropolis pre-compiles (EIP 197, 198 and 213) --- core/vm/evm.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'core/vm/evm.go') diff --git a/core/vm/evm.go b/core/vm/evm.go index 9296cc7ca..20eaaccb4 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -37,6 +37,10 @@ type ( func run(evm *EVM, snapshot int, contract *Contract, input []byte) ([]byte, error) { if contract.CodeAddr != nil { precompiledContracts := PrecompiledContracts + if evm.ChainConfig().IsMetropolis(evm.BlockNumber) { + precompiledContracts = PrecompiledContractsMetropolis + } + if p := precompiledContracts[*contract.CodeAddr]; p != nil { return RunPrecompiledContract(p, input, contract) } @@ -100,8 +104,8 @@ type EVM struct { abort int32 } -// NewEVM retutrns a new EVM evmironment. The returned EVM is not thread safe -// and should only ever be used *once*. +// NewEVM retutrns a new EVM . The returned EVM is not thread safe and should +// only ever be used *once*. func NewEVM(ctx Context, statedb StateDB, chainConfig *params.ChainConfig, vmConfig Config) *EVM { evm := &EVM{ Context: ctx, -- cgit v1.2.3 From 6131dd55c5cb6f964a1b8e8d51400f10d545a92e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 10 Aug 2017 16:39:43 +0300 Subject: core/vm: polish precompile contract code, add tests and benches * Update modexp gas calculation to new version * Fix modexp modulo 0 special case to return zero --- core/vm/evm.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'core/vm/evm.go') diff --git a/core/vm/evm.go b/core/vm/evm.go index 20eaaccb4..b8af9bd15 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -36,16 +36,14 @@ type ( // run runs the given contract and takes care of running precompiles with a fallback to the byte code interpreter. func run(evm *EVM, snapshot int, contract *Contract, input []byte) ([]byte, error) { if contract.CodeAddr != nil { - precompiledContracts := PrecompiledContracts + precompiles := PrecompiledContractsHomestead if evm.ChainConfig().IsMetropolis(evm.BlockNumber) { - precompiledContracts = PrecompiledContractsMetropolis + precompiles = PrecompiledContractsMetropolis } - - if p := precompiledContracts[*contract.CodeAddr]; p != nil { + if p := precompiles[*contract.CodeAddr]; p != nil { return RunPrecompiledContract(p, input, contract) } } - return evm.interpreter.Run(snapshot, contract, input) } @@ -147,10 +145,13 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas snapshot = evm.StateDB.Snapshot() ) if !evm.StateDB.Exist(addr) { - if PrecompiledContracts[addr] == nil && evm.ChainConfig().IsEIP158(evm.BlockNumber) && value.Sign() == 0 { + precompiles := PrecompiledContractsHomestead + if evm.ChainConfig().IsMetropolis(evm.BlockNumber) { + precompiles = PrecompiledContractsMetropolis + } + if precompiles[addr] == nil && evm.ChainConfig().IsEIP158(evm.BlockNumber) && value.Sign() == 0 { return nil, gas, nil } - evm.StateDB.CreateAccount(addr) } evm.Transfer(evm.StateDB, caller.Address(), to.Address(), value) -- cgit v1.2.3