core/vm: avoid unneccesary lookups, remove unused fields

This commit is contained in:
Martin Holst Swende 2018-10-01 22:18:34 +02:00
parent 67bad856b1
commit cc28a29365
No known key found for this signature in database
GPG key ID: 683B438C05A5DDF0
4 changed files with 17 additions and 7 deletions

View file

@ -58,15 +58,11 @@ type Contract struct {
Gas uint64 Gas uint64
value *big.Int value *big.Int
Args []byte
DelegateCall bool
} }
// NewContract returns a new contract environment for the execution of EVM. // NewContract returns a new contract environment for the execution of EVM.
func NewContract(caller ContractRef, object ContractRef, value *big.Int, gas uint64) *Contract { func NewContract(caller ContractRef, object ContractRef, value *big.Int, gas uint64) *Contract {
c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object, Args: nil} c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object}
if parent, ok := caller.(*Contract); ok { if parent, ok := caller.(*Contract); ok {
// Reuse JUMPDEST analysis from parent context if available. // Reuse JUMPDEST analysis from parent context if available.
@ -118,7 +114,6 @@ func (c *Contract) validJumpdest(dest *big.Int) bool {
// AsDelegate sets the contract to be a delegate call and returns the current // AsDelegate sets the contract to be a delegate call and returns the current
// contract (for chaining calls) // contract (for chaining calls)
func (c *Contract) AsDelegate() *Contract { func (c *Contract) AsDelegate() *Contract {
c.DelegateCall = true
// NOTE: caller must, at all times be a contract. It should never happen // NOTE: caller must, at all times be a contract. It should never happen
// that caller is something other than a Contract. // that caller is something other than a Contract.
parent := c.caller.(*Contract) parent := c.caller.(*Contract)
@ -177,6 +172,8 @@ func (c *Contract) SetCallCode(addr *common.Address, hash common.Hash, code []by
c.CodeAddr = addr c.CodeAddr = addr
} }
// SetCodeOptionalHash can be used to provide code, but it's optional to provide hash.
// In case hash is not provided, the jumpdest analysis will not be saved to the parent context
func (c *Contract) SetCodeOptionalHash(addr *common.Address, codeAndHash codeAndHash) { func (c *Contract) SetCodeOptionalHash(addr *common.Address, codeAndHash codeAndHash) {
c.Code = codeAndHash.code c.Code = codeAndHash.code
c.CodeHash = codeAndHash.hash c.CodeHash = codeAndHash.hash

View file

@ -212,12 +212,12 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
evm.StateDB.CreateAccount(addr) evm.StateDB.CreateAccount(addr)
} }
evm.Transfer(evm.StateDB, caller.Address(), to.Address(), value) evm.Transfer(evm.StateDB, caller.Address(), to.Address(), value)
// Initialise a new contract and set the code that is to be used by the EVM. // Initialise a new contract and set the code that is to be used by the EVM.
// The contract is a scoped environment for this execution context only. // The contract is a scoped environment for this execution context only.
contract := NewContract(caller, to, value, gas) contract := NewContract(caller, to, value, gas)
contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))
// Even if the account has no code, we need to continue because it might be a precompile
start := time.Now() start := time.Now()
// Capture the tracer start/end events in debug mode // Capture the tracer start/end events in debug mode

View file

@ -390,6 +390,13 @@ func (api *PrivateDebugAPI) TraceBlockFromFile(ctx context.Context, file string,
} }
return api.TraceBlock(ctx, blob, config) return api.TraceBlock(ctx, blob, config)
} }
func (api *PrivateDebugAPI) TraceBadBlock(ctx context.Context, index int, config *TraceConfig) ([]*txTraceResult, error) {
if len := len(api.eth.blockchain.BadBlocks()); index < len {
block := api.eth.blockchain.BadBlocks()[index]
return api.traceBlock(ctx, block, config)
}
return nil, fmt.Errorf("index out of range")
}
// traceBlock configures a new tracer according to the provided configuration, and // traceBlock configures a new tracer according to the provided configuration, and
// executes all the transactions contained within. The return value will be one item // executes all the transactions contained within. The return value will be one item

View file

@ -378,6 +378,12 @@ web3._extend({
params: 2, params: 2,
inputFormatter: [null, null] inputFormatter: [null, null]
}), }),
new web3._extend.Method({
name: 'traceBadBlock',
call: 'debug_traceBadBlock',
params: 1,
inputFormatter: [null]
}),
new web3._extend.Method({ new web3._extend.Method({
name: 'traceBlockByNumber', name: 'traceBlockByNumber',
call: 'debug_traceBlockByNumber', call: 'debug_traceBlockByNumber',