From aa70f3c5a893994f66b0c2c3efbc73892d70370d Mon Sep 17 00:00:00 2001 From: Alex Sharov <AskAlexSharov@gmail.com> Date: Sat, 3 Jul 2021 19:55:14 +0700 Subject: [PATCH] speedup tracing by not recalculating senders (#2286) --- cmd/rpcdaemon/commands/debug_api.go | 27 ++++++++++++++++++++------ cmd/rpcdaemon/commands/eth_receipts.go | 4 +--- cmd/rpcdaemon/commands/tracing.go | 11 ++++++++--- turbo/transactions/tracing.go | 16 ++------------- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/cmd/rpcdaemon/commands/debug_api.go b/cmd/rpcdaemon/commands/debug_api.go index 5a2af1ceb5..ffdde832e4 100644 --- a/cmd/rpcdaemon/commands/debug_api.go +++ b/cmd/rpcdaemon/commands/debug_api.go @@ -18,7 +18,6 @@ import ( "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/rpc" - "github.com/ledgerwatch/erigon/turbo/adapter" "github.com/ledgerwatch/erigon/turbo/transactions" ) @@ -57,14 +56,23 @@ func (api *PrivateDebugAPIImpl) StorageRangeAt(ctx context.Context, blockHash co } defer tx.Rollback() - bc := adapter.NewBlockGetter(tx) chainConfig, err := api.chainConfig(tx) if err != nil { 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) - _, _, _, _, 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 { return StorageRangeResult{}, err } @@ -211,16 +219,23 @@ func (api *PrivateDebugAPIImpl) AccountAt(ctx context.Context, blockHash common. } defer tx.Rollback() - bc := adapter.NewBlockGetter(tx) chainConfig, err := api.chainConfig(tx) if err != nil { 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 { return rawdb.ReadHeader(tx, hash, number) } 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 { return nil, err } diff --git a/cmd/rpcdaemon/commands/eth_receipts.go b/cmd/rpcdaemon/commands/eth_receipts.go index 30ee9f9189..32154b6d7d 100644 --- a/cmd/rpcdaemon/commands/eth_receipts.go +++ b/cmd/rpcdaemon/commands/eth_receipts.go @@ -25,7 +25,6 @@ import ( "github.com/ledgerwatch/erigon/ethdb/cbor" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rpc" - "github.com/ledgerwatch/erigon/turbo/adapter" "github.com/ledgerwatch/erigon/turbo/transactions" ) @@ -34,12 +33,11 @@ func getReceipts(ctx context.Context, tx ethdb.Tx, chainConfig *params.ChainConf return cached, nil } - bc := adapter.NewBlockGetter(tx) getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) } 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 { return nil, err } diff --git a/cmd/rpcdaemon/commands/tracing.go b/cmd/rpcdaemon/commands/tracing.go index e553d80851..7bc99bee54 100644 --- a/cmd/rpcdaemon/commands/tracing.go +++ b/cmd/rpcdaemon/commands/tracing.go @@ -14,7 +14,6 @@ import ( "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/rpc" - "github.com/ledgerwatch/erigon/turbo/adapter" "github.com/ledgerwatch/erigon/turbo/rpchelper" "github.com/ledgerwatch/erigon/turbo/transactions" ) @@ -34,7 +33,6 @@ func (api *PrivateDebugAPIImpl) TraceTransaction(ctx context.Context, hash commo stream.WriteNil() return fmt.Errorf("transaction %#x not found", hash) } - getter := adapter.NewBlockGetter(tx) chainConfig, err := api.chainConfig(tx) if err != nil { @@ -42,11 +40,18 @@ func (api *PrivateDebugAPIImpl) TraceTransaction(ctx context.Context, hash commo 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 { return rawdb.ReadHeader(tx, hash, number) } 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 { stream.WriteNil() return err diff --git a/turbo/transactions/tracing.go b/turbo/transactions/tracing.go index ba8b3ad9da..4c5b28f1f7 100644 --- a/turbo/transactions/tracing.go +++ b/turbo/transactions/tracing.go @@ -36,21 +36,9 @@ type BlockGetter interface { } // 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 - block, err := blockGetter.GetBlockByHash(blockHash) - 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()) + reader := state.NewPlainKvState(dbtx, block.NumberU64()-1) statedb := state.New(reader) if txIndex == 0 && len(block.Transactions()) == 0 { -- GitLab