Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce API StateFetcher #8639

Merged
merged 23 commits into from
Mar 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
a600924
Return status.Errorf instead of plain errors from gRPC functions
rkapka Mar 17, 2021
41ed1fc
return plain errors from helper functions
rkapka Mar 17, 2021
768003c
Merge branch 'develop' into fix-grpc-error-type
rkapka Mar 17, 2021
54d8d3c
change errors to lowercase in node
rkapka Mar 17, 2021
7969f5a
Merge branch '__develop' into fix-grpc-error-type
rkapka Mar 17, 2021
f18fcf3
Merge remote-tracking branch 'origin/fix-grpc-error-type' into fix-gr…
rkapka Mar 17, 2021
f404760
Merge refs/heads/develop into fix-grpc-error-type
prylabs-bulldozer[bot] Mar 17, 2021
82ce0ae
correct test expectations
rkapka Mar 17, 2021
aa1e64c
Merge branch '__develop' into fix-grpc-error-type
rkapka Mar 17, 2021
8822228
Merge remote-tracking branch 'origin/fix-grpc-error-type' into fix-gr…
rkapka Mar 17, 2021
4444f8e
extracted StateFetcher
rkapka Mar 17, 2021
bfa927a
StateFetcher tests
rkapka Mar 17, 2021
aae5bdb
extract beacon state creation option and fix state tests
rkapka Mar 18, 2021
3bd60bb
add comment to StateFetcher
rkapka Mar 18, 2021
d55b91d
remove empty line
rkapka Mar 22, 2021
565ba4b
Merge branch '__develop' into api-state-fetcher
rkapka Mar 22, 2021
604084a
overwrite config name
rkapka Mar 19, 2021
e59b717
fix field names
rkapka Mar 22, 2021
1673844
remove FillRootsNaturalOpt helper
rkapka Mar 22, 2021
25b8855
reduce statefetcher package visibility
rkapka Mar 22, 2021
85a16dd
gzl
rkapka Mar 22, 2021
ff61038
add missing error assertion
rkapka Mar 19, 2021
0896700
Merge branch 'develop' into api-state-fetcher
terencechain Mar 22, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions beacon-chain/rpc/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ go_library(
"//beacon-chain/rpc/debug:go_default_library",
"//beacon-chain/rpc/node:go_default_library",
"//beacon-chain/rpc/nodev1:go_default_library",
"//beacon-chain/rpc/statefetcher:go_default_library",
"//beacon-chain/rpc/validator:go_default_library",
"//beacon-chain/state/stategen:go_default_library",
"//beacon-chain/sync:go_default_library",
Expand Down
2 changes: 2 additions & 0 deletions beacon-chain/rpc/beaconv1/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ go_library(
"//beacon-chain/operations/voluntaryexits:go_default_library",
"//beacon-chain/p2p:go_default_library",
"//beacon-chain/powchain:go_default_library",
"//beacon-chain/rpc/statefetcher:go_default_library",
"//beacon-chain/state/interface:go_default_library",
"//beacon-chain/state/stategen:go_default_library",
"//beacon-chain/sync:go_default_library",
Expand Down Expand Up @@ -72,6 +73,7 @@ go_test(
"//beacon-chain/operations/voluntaryexits:go_default_library",
"//beacon-chain/p2p/testing:go_default_library",
"//beacon-chain/powchain/testing:go_default_library",
"//beacon-chain/rpc/statefetcher:go_default_library",
"//beacon-chain/state/stategen:go_default_library",
"//proto/beacon/p2p/v1:go_default_library",
"//proto/migration:go_default_library",
Expand Down
2 changes: 2 additions & 0 deletions beacon-chain/rpc/beaconv1/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p"
"github.com/prysmaticlabs/prysm/beacon-chain/powchain"
"github.com/prysmaticlabs/prysm/beacon-chain/rpc/statefetcher"
"github.com/prysmaticlabs/prysm/beacon-chain/state/stategen"
"github.com/prysmaticlabs/prysm/beacon-chain/sync"
pbp2p "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
Expand Down Expand Up @@ -46,4 +47,5 @@ type Server struct {
ChainStartChan chan time.Time
StateGenService stategen.StateManager
SyncChecker sync.Checker
StateFetcher statefetcher.StateFetcher
}
80 changes: 2 additions & 78 deletions beacon-chain/rpc/beaconv1/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func (bs *Server) GetStateFork(ctx context.Context, req *ethpb.StateRequest) (*e
err error
)

state, err = bs.state(ctx, req.StateId)
state, err = bs.StateFetcher.State(ctx, req.StateId)
if err != nil {
return nil, status.Errorf(codes.Internal, "Could not get state: %v", err)
}
Expand All @@ -106,7 +106,7 @@ func (bs *Server) GetFinalityCheckpoints(ctx context.Context, req *ethpb.StateRe
err error
)

state, err = bs.state(ctx, req.StateId)
state, err = bs.StateFetcher.State(ctx, req.StateId)
if err != nil {
return nil, status.Errorf(codes.Internal, "Could not get state: %v", err)
}
Expand Down Expand Up @@ -156,56 +156,6 @@ func (bs *Server) stateRoot(ctx context.Context, stateId []byte) ([]byte, error)
return root, err
}

func (bs *Server) state(ctx context.Context, stateId []byte) (iface.BeaconState, error) {
var (
s iface.BeaconState
err error
)

stateIdString := strings.ToLower(string(stateId))
switch stateIdString {
case "head":
s, err = bs.ChainInfoFetcher.HeadState(ctx)
if err != nil {
return nil, errors.Wrap(err, "could not get head state")
}
case "genesis":
s, err = bs.BeaconDB.GenesisState(ctx)
if err != nil {
return nil, errors.Wrap(err, "could not get genesis state")
}
case "finalized":
checkpoint := bs.ChainInfoFetcher.FinalizedCheckpt()
s, err = bs.StateGenService.StateByRoot(ctx, bytesutil.ToBytes32(checkpoint.Root))
if err != nil {
return nil, errors.Wrap(err, "could not get finalized state")
}
case "justified":
checkpoint := bs.ChainInfoFetcher.CurrentJustifiedCheckpt()
s, err = bs.StateGenService.StateByRoot(ctx, bytesutil.ToBytes32(checkpoint.Root))
if err != nil {
return nil, errors.Wrap(err, "could not get justified state")
}
default:
ok, matchErr := bytesutil.IsBytes32Hex(stateId)
if matchErr != nil {
return nil, errors.Wrap(err, "could not parse ID")
}
if ok {
s, err = bs.stateByHex(ctx, stateId)
} else {
slotNumber, parseErr := strconv.ParseUint(stateIdString, 10, 64)
if parseErr != nil {
// ID format does not match any valid options.
return nil, errors.New("invalid state ID: " + stateIdString)
}
s, err = bs.stateBySlot(ctx, types.Slot(slotNumber))
}
}

return s, err
}

func (bs *Server) headStateRoot(ctx context.Context) ([]byte, error) {
b, err := bs.ChainInfoFetcher.HeadBlock(ctx)
if err != nil {
Expand Down Expand Up @@ -294,32 +244,6 @@ func (bs *Server) stateRootBySlot(ctx context.Context, slot types.Slot) ([]byte,
return blks[0].Block.StateRoot, nil
}

func (bs *Server) stateByHex(ctx context.Context, stateId []byte) (iface.BeaconState, error) {
headState, err := bs.ChainInfoFetcher.HeadState(ctx)
if err != nil {
return nil, errors.Wrap(err, "could not get head state")
}
for i, root := range headState.StateRoots() {
if bytes.Equal(root, stateId) {
blockRoot := headState.BlockRoots()[i]
return bs.StateGenService.StateByRoot(ctx, bytesutil.ToBytes32(blockRoot))
}
}
return nil, fmt.Errorf("state not found in the last %d state roots in head state", len(headState.StateRoots()))
}

func (bs *Server) stateBySlot(ctx context.Context, slot types.Slot) (iface.BeaconState, error) {
currentSlot := bs.GenesisTimeFetcher.CurrentSlot()
if slot > currentSlot {
return nil, errors.New("slot cannot be in the future")
}
state, err := bs.StateGenService.StateBySlot(ctx, slot)
if err != nil {
return nil, errors.Wrap(err, "could not get state")
}
return state, nil
}

func checkpoint(sourceCheckpoint *eth.Checkpoint) *ethpb.Checkpoint {
if sourceCheckpoint != nil {
return &ethpb.Checkpoint{
Expand Down
Loading