diff --git a/cmd/rpcdaemon/commands/debug_api.go b/cmd/rpcdaemon/commands/debug_api.go index 5a2af1ceb5725d50631a3dcd7f304c1214855f8f..ffdde832e480ceb2a6d81cb12638fddb7e6ca97b 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 30ee9f9189c626d72846383c05f8429a973b1c85..32154b6d7daf2ff9209979f9e8ec6e593572ad1d 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 e553d80851b243c1369120a67d15ea65751fd30d..7bc99bee546a97cdb5fda913dd21ee8d6e857aa3 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 ba8b3ad9da89a899902a9158345e206eecda0253..4c5b28f1f7e6eefd0400df88354ea7e9331a8689 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 {