Skip to content

Commit

Permalink
Optimise eth_getStorageAt for current state (erigontech#3580)
Browse files Browse the repository at this point in the history
* Optimise eth_getStorageAt for current state

* Fix

Co-authored-by: Alex Sharp <alexsharp@Alexs-MacBook-Pro.local>
  • Loading branch information
AlexeyAkhunov and Alex Sharp authored Feb 23, 2022
1 parent 258e8d5 commit 7397af5
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 10 deletions.
5 changes: 4 additions & 1 deletion cmd/rpcdaemon/commands/eth_accounts.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,10 @@ func (api *APIImpl) GetStorageAt(ctx context.Context, address common.Address, in
if err != nil {
return hexutil.Encode(common.LeftPadBytes(empty, 32)), err
}
reader := adapter.NewStateReader(tx, blockNumber)
reader, err := rpchelper.CreateStateReader(ctx, tx, blockNrOrHash, blockNumber, api.stateCache)
if err != nil {
return hexutil.Encode(common.LeftPadBytes(empty, 32)), err
}
acc, err := reader.ReadAccountData(address)
if acc == nil || err != nil {
return hexutil.Encode(common.LeftPadBytes(empty, 32)), err
Expand Down
17 changes: 17 additions & 0 deletions turbo/rpchelper/helper.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package rpchelper

import (
"context"
"fmt"

"github.com/ledgerwatch/erigon-lib/kv"
"github.com/ledgerwatch/erigon-lib/kv/kvcache"
"github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters"
"github.com/ledgerwatch/erigon/common"
"github.com/ledgerwatch/erigon/core/rawdb"
"github.com/ledgerwatch/erigon/core/state"
"github.com/ledgerwatch/erigon/core/types/accounts"
"github.com/ledgerwatch/erigon/eth/stagedsync/stages"
"github.com/ledgerwatch/erigon/rpc"
Expand Down Expand Up @@ -82,3 +85,17 @@ func GetAccount(tx kv.Tx, blockNumber uint64, address common.Address) (*accounts
reader := adapter.NewStateReader(tx, blockNumber)
return reader.ReadAccountData(address)
}

func CreateStateReader(ctx context.Context, tx kv.Tx, blockNrOrHash rpc.BlockNumberOrHash, blockNumber uint64, stateCache kvcache.Cache) (state.StateReader, error) {
var stateReader state.StateReader
if num, ok := blockNrOrHash.Number(); ok && num == rpc.LatestBlockNumber {
cacheView, err := stateCache.View(ctx, tx)
if err != nil {
return nil, err
}
stateReader = state.NewCachedReader2(cacheView, tx)
} else {
stateReader = state.NewPlainState(tx, blockNumber)
}
return stateReader, nil
}
13 changes: 4 additions & 9 deletions turbo/transactions/call.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/ledgerwatch/erigon/internal/ethapi"
"github.com/ledgerwatch/erigon/params"
"github.com/ledgerwatch/erigon/rpc"
"github.com/ledgerwatch/erigon/turbo/rpchelper"
"github.com/ledgerwatch/log/v3"
)

Expand All @@ -32,15 +33,9 @@ func DoCall(ctx context.Context, args ethapi.CallArgs, tx kv.Tx, blockNrOrHash r
}
*/
blockNumber := block.NumberU64()
var stateReader state.StateReader
if num, ok := blockNrOrHash.Number(); ok && num == rpc.LatestBlockNumber {
cacheView, err := stateCache.View(ctx, tx)
if err != nil {
return nil, err
}
stateReader = state.NewCachedReader2(cacheView, tx)
} else {
stateReader = state.NewPlainState(tx, blockNumber)
stateReader, err := rpchelper.CreateStateReader(ctx, tx, blockNrOrHash, blockNumber, stateCache)
if err != nil {
return nil, err
}
state := state.New(stateReader)

Expand Down

0 comments on commit 7397af5

Please sign in to comment.