good morning!!!!

Skip to content
Snippets Groups Projects
Unverified Commit aa70f3c5 authored by Alex Sharov's avatar Alex Sharov Committed by GitHub
Browse files

speedup tracing by not recalculating senders (#2286)

parent 4be66ee9
No related branches found
No related tags found
No related merge requests found
...@@ -18,7 +18,6 @@ import ( ...@@ -18,7 +18,6 @@ import (
"github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb"
"github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/internal/ethapi"
"github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/rpc"
"github.com/ledgerwatch/erigon/turbo/adapter"
"github.com/ledgerwatch/erigon/turbo/transactions" "github.com/ledgerwatch/erigon/turbo/transactions"
) )
...@@ -57,14 +56,23 @@ func (api *PrivateDebugAPIImpl) StorageRangeAt(ctx context.Context, blockHash co ...@@ -57,14 +56,23 @@ func (api *PrivateDebugAPIImpl) StorageRangeAt(ctx context.Context, blockHash co
} }
defer tx.Rollback() defer tx.Rollback()
bc := adapter.NewBlockGetter(tx)
chainConfig, err := api.chainConfig(tx) chainConfig, err := api.chainConfig(tx)
if err != nil { if err != nil {
return StorageRangeResult{}, err return StorageRangeResult{}, err
} }
getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) }
block, _, err := rawdb.ReadBlockByHashWithSenders(tx, blockHash)
if err != nil {
return StorageRangeResult{}, err
}
if block == nil {
return StorageRangeResult{}, nil
}
getHeader := func(hash common.Hash, number uint64) *types.Header {
return rawdb.ReadHeader(tx, hash, number)
}
checkTEVM := ethdb.GetCheckTEVM(tx) checkTEVM := ethdb.GetCheckTEVM(tx)
_, _, _, _, stateReader, err := transactions.ComputeTxEnv(ctx, bc, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, blockHash, txIndex) _, _, _, _, stateReader, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, blockHash, txIndex)
if err != nil { if err != nil {
return StorageRangeResult{}, err return StorageRangeResult{}, err
} }
...@@ -211,16 +219,23 @@ func (api *PrivateDebugAPIImpl) AccountAt(ctx context.Context, blockHash common. ...@@ -211,16 +219,23 @@ func (api *PrivateDebugAPIImpl) AccountAt(ctx context.Context, blockHash common.
} }
defer tx.Rollback() defer tx.Rollback()
bc := adapter.NewBlockGetter(tx)
chainConfig, err := api.chainConfig(tx) chainConfig, err := api.chainConfig(tx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
block, _, err := rawdb.ReadBlockByHashWithSenders(tx, blockHash)
if err != nil {
return nil, err
}
if block == nil {
return nil, nil
}
getHeader := func(hash common.Hash, number uint64) *types.Header { getHeader := func(hash common.Hash, number uint64) *types.Header {
return rawdb.ReadHeader(tx, hash, number) return rawdb.ReadHeader(tx, hash, number)
} }
checkTEVM := ethdb.GetCheckTEVM(tx) checkTEVM := ethdb.GetCheckTEVM(tx)
_, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, bc, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, blockHash, txIndex) _, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, blockHash, txIndex)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -25,7 +25,6 @@ import ( ...@@ -25,7 +25,6 @@ import (
"github.com/ledgerwatch/erigon/ethdb/cbor" "github.com/ledgerwatch/erigon/ethdb/cbor"
"github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/params"
"github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/rpc"
"github.com/ledgerwatch/erigon/turbo/adapter"
"github.com/ledgerwatch/erigon/turbo/transactions" "github.com/ledgerwatch/erigon/turbo/transactions"
) )
...@@ -34,12 +33,11 @@ func getReceipts(ctx context.Context, tx ethdb.Tx, chainConfig *params.ChainConf ...@@ -34,12 +33,11 @@ func getReceipts(ctx context.Context, tx ethdb.Tx, chainConfig *params.ChainConf
return cached, nil return cached, nil
} }
bc := adapter.NewBlockGetter(tx)
getHeader := func(hash common.Hash, number uint64) *types.Header { getHeader := func(hash common.Hash, number uint64) *types.Header {
return rawdb.ReadHeader(tx, hash, number) return rawdb.ReadHeader(tx, hash, number)
} }
checkTEVM := ethdb.GetCheckTEVM(tx) checkTEVM := ethdb.GetCheckTEVM(tx)
_, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, bc, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, block.Hash(), 0) _, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, block.Hash(), 0)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -14,7 +14,6 @@ import ( ...@@ -14,7 +14,6 @@ import (
"github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb"
"github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/internal/ethapi"
"github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/rpc"
"github.com/ledgerwatch/erigon/turbo/adapter"
"github.com/ledgerwatch/erigon/turbo/rpchelper" "github.com/ledgerwatch/erigon/turbo/rpchelper"
"github.com/ledgerwatch/erigon/turbo/transactions" "github.com/ledgerwatch/erigon/turbo/transactions"
) )
...@@ -34,7 +33,6 @@ func (api *PrivateDebugAPIImpl) TraceTransaction(ctx context.Context, hash commo ...@@ -34,7 +33,6 @@ func (api *PrivateDebugAPIImpl) TraceTransaction(ctx context.Context, hash commo
stream.WriteNil() stream.WriteNil()
return fmt.Errorf("transaction %#x not found", hash) return fmt.Errorf("transaction %#x not found", hash)
} }
getter := adapter.NewBlockGetter(tx)
chainConfig, err := api.chainConfig(tx) chainConfig, err := api.chainConfig(tx)
if err != nil { if err != nil {
...@@ -42,11 +40,18 @@ func (api *PrivateDebugAPIImpl) TraceTransaction(ctx context.Context, hash commo ...@@ -42,11 +40,18 @@ func (api *PrivateDebugAPIImpl) TraceTransaction(ctx context.Context, hash commo
return err return err
} }
block, _, err := rawdb.ReadBlockByHashWithSenders(tx, blockHash)
if err != nil {
return err
}
if block == nil {
return nil
}
getHeader := func(hash common.Hash, number uint64) *types.Header { getHeader := func(hash common.Hash, number uint64) *types.Header {
return rawdb.ReadHeader(tx, hash, number) return rawdb.ReadHeader(tx, hash, number)
} }
checkTEVM := ethdb.GetCheckTEVM(tx) checkTEVM := ethdb.GetCheckTEVM(tx)
msg, blockCtx, txCtx, ibs, _, err := transactions.ComputeTxEnv(ctx, getter, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, blockHash, txIndex) msg, blockCtx, txCtx, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, blockHash, txIndex)
if err != nil { if err != nil {
stream.WriteNil() stream.WriteNil()
return err return err
......
...@@ -36,21 +36,9 @@ type BlockGetter interface { ...@@ -36,21 +36,9 @@ type BlockGetter interface {
} }
// computeTxEnv returns the execution environment of a certain transaction. // computeTxEnv returns the execution environment of a certain transaction.
func ComputeTxEnv(ctx context.Context, blockGetter BlockGetter, cfg *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, checkTEVM func(common.Hash) (bool, error), engine consensus.Engine, dbtx ethdb.Tx, blockHash common.Hash, txIndex uint64) (core.Message, vm.BlockContext, vm.TxContext, *state.IntraBlockState, *state.PlainKVState, error) { func ComputeTxEnv(ctx context.Context, block *types.Block, cfg *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, checkTEVM func(common.Hash) (bool, error), engine consensus.Engine, dbtx ethdb.Tx, blockHash common.Hash, txIndex uint64) (core.Message, vm.BlockContext, vm.TxContext, *state.IntraBlockState, *state.PlainKVState, error) {
// Create the parent state database // Create the parent state database
block, err := blockGetter.GetBlockByHash(blockHash) reader := state.NewPlainKvState(dbtx, block.NumberU64()-1)
if err != nil {
return nil, vm.BlockContext{}, vm.TxContext{}, nil, nil, err
}
if block == nil {
return nil, vm.BlockContext{}, vm.TxContext{}, nil, nil, fmt.Errorf("block %x not found", blockHash)
}
parent := blockGetter.GetBlock(block.ParentHash(), block.NumberU64()-1)
if parent == nil {
return nil, vm.BlockContext{}, vm.TxContext{}, nil, nil, fmt.Errorf("parent %x not found", block.ParentHash())
}
reader := state.NewPlainKvState(dbtx, parent.NumberU64())
statedb := state.New(reader) statedb := state.New(reader)
if txIndex == 0 && len(block.Transactions()) == 0 { if txIndex == 0 && len(block.Transactions()) == 0 {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment