mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 10:22:23 +00:00
core/vm: avoid unneccesary lookups, remove unused fields
This commit is contained in:
parent
67bad856b1
commit
cc28a29365
4 changed files with 17 additions and 7 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue