From 699e1c8a234d442e4e4c97b54edd8bba9f83468d Mon Sep 17 00:00:00 2001 From: Nishant Das Date: Thu, 9 Jan 2020 13:07:25 +0800 Subject: [PATCH] Optimize List Validator Assignments (#4456) * optimize * Merge refs/heads/master into listValidatorAssingments * Merge refs/heads/master into listValidatorAssingments * Merge refs/heads/master into listValidatorAssingments * Merge refs/heads/master into listValidatorAssingments * Merge refs/heads/master into listValidatorAssingments * Merge refs/heads/master into listValidatorAssingments * Merge refs/heads/master into listValidatorAssingments * Merge refs/heads/master into listValidatorAssingments * Merge refs/heads/master into listValidatorAssingments * terence's and preston's review * Merge branch 'listValidatorAssingments' of https://github.com/prysmaticlabs/geth-sharding into listValidatorAssingments --- beacon-chain/rpc/beacon/assignments.go | 96 ++++++++++++++++---------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/beacon-chain/rpc/beacon/assignments.go b/beacon-chain/rpc/beacon/assignments.go index 197aaacc768..6194ab55c5a 100644 --- a/beacon-chain/rpc/beacon/assignments.go +++ b/beacon-chain/rpc/beacon/assignments.go @@ -101,42 +101,30 @@ func (bs *Server) ListValidatorAssignments( shouldFetchFromArchive := requestedEpoch < bs.FinalizationFetcher.FinalizedCheckpt().Epoch + // initialize all committee related data. + committeeAssignments := map[uint64]*helpers.CommitteeAssignmentContainer{} + proposerIndexToSlot := map[uint64]uint64{} + archivedInfo := &pb.ArchivedCommitteeInfo{} + archivedBalances := []uint64{} + + if shouldFetchFromArchive { + archivedInfo, archivedBalances, err = bs.archivedCommitteeData(ctx, requestedEpoch) + if err != nil { + return nil, err + } + } else { + committeeAssignments, proposerIndexToSlot, err = helpers.CommitteeAssignments(headState, requestedEpoch) + if err != nil { + return nil, status.Errorf(codes.Internal, "Could not compute committee assignments: %v", err) + } + } + for _, index := range filteredIndices[start:end] { if int(index) >= len(headState.Validators) { return nil, status.Errorf(codes.OutOfRange, "Validator index %d >= validator count %d", index, len(headState.Validators)) } if shouldFetchFromArchive { - archivedInfo, err := bs.BeaconDB.ArchivedCommitteeInfo(ctx, requestedEpoch) - if err != nil { - return nil, status.Errorf( - codes.Internal, - "Could not retrieve archived committee info for epoch %d", - requestedEpoch, - ) - } - if archivedInfo == nil { - return nil, status.Errorf( - codes.NotFound, - "Could not retrieve data for epoch %d, perhaps --archive in the running beacon node is disabled", - requestedEpoch, - ) - } - archivedBalances, err := bs.BeaconDB.ArchivedBalances(ctx, requestedEpoch) - if err != nil { - return nil, status.Errorf( - codes.Internal, - "Could not retrieve archived balances for epoch %d", - requestedEpoch, - ) - } - if archivedBalances == nil { - return nil, status.Errorf( - codes.NotFound, - "Could not retrieve data for epoch %d, perhaps --archive in the running beacon node is disabled", - requestedEpoch, - ) - } committee, committeeIndex, attesterSlot, proposerSlot, err := archivedValidatorCommittee( requestedEpoch, index, @@ -157,15 +145,12 @@ func (bs *Server) ListValidatorAssignments( res = append(res, assign) continue } - committee, committeeIndex, attesterSlot, proposerSlot, err := helpers.CommitteeAssignment(headState, requestedEpoch, index) - if err != nil { - return nil, status.Errorf(codes.Internal, "Could not retrieve assignment for validator %d: %v", index, err) - } + comAssignment := committeeAssignments[index] assign := ðpb.ValidatorAssignments_CommitteeAssignment{ - BeaconCommittees: committee, - CommitteeIndex: committeeIndex, - AttesterSlot: attesterSlot, - ProposerSlot: proposerSlot, + BeaconCommittees: comAssignment.Committee, + CommitteeIndex: comAssignment.CommitteeIndex, + AttesterSlot: comAssignment.AttesterSlot, + ProposerSlot: proposerIndexToSlot[index], PublicKey: headState.Validators[index].PublicKey, } res = append(res, assign) @@ -228,6 +213,41 @@ func archivedValidatorCommittee( return nil, 0, 0, 0, fmt.Errorf("could not find committee for validator index %d", validatorIndex) } +func (bs *Server) archivedCommitteeData(ctx context.Context, requestedEpoch uint64) (*pb.ArchivedCommitteeInfo, + []uint64, error) { + archivedInfo, err := bs.BeaconDB.ArchivedCommitteeInfo(ctx, requestedEpoch) + if err != nil { + return nil, nil, status.Errorf( + codes.Internal, + "Could not retrieve archived committee info for epoch %d", + requestedEpoch, + ) + } + if archivedInfo == nil { + return nil, nil, status.Errorf( + codes.NotFound, + "Could not retrieve data for epoch %d, perhaps --archive in the running beacon node is disabled", + requestedEpoch, + ) + } + archivedBalances, err := bs.BeaconDB.ArchivedBalances(ctx, requestedEpoch) + if err != nil { + return nil, nil, status.Errorf( + codes.Internal, + "Could not retrieve archived balances for epoch %d", + requestedEpoch, + ) + } + if archivedBalances == nil { + return nil, nil, status.Errorf( + codes.NotFound, + "Could not retrieve data for epoch %d, perhaps --archive in the running beacon node is disabled", + requestedEpoch, + ) + } + return archivedInfo, archivedBalances, nil +} + // helpers.ComputeProposerIndex wrapper. func archivedProposerIndex(activeIndices []uint64, activeBalances []uint64, seed [32]byte) (uint64, error) { validators := make([]*ethpb.Validator, len(activeBalances))