mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-16 06:58:20 +00:00
e2faa391c3
* begin state service * begin on the state trie idea * created beacon state structure * add in the full clone getter * return by value instead * add all setters * new state setters are being completed * arrays roots exposed * close to finishing all these headerssss * functionality complete * added in proto benchmark test * test for compatibility * add test for compat * comments fixed * Merge branch 'master' into state-service * add clone * add clone * remove underlying copies * make it immutable * integrate it into chainservice * revert * wrap up comments for package * address all comments and godocs * address all comments * Merge branch 'master' into state-service * clone the pending attestation properly * Merge branch 'state-service' of github.com:prysmaticlabs/prysm into state-service * properly clone remaining items * tests pass fixed bug * begin using it instead of head state * prevent nil pointer exceptions * Merge branch 'state-service' into use-state-in-runtime * begin using new struct in db * integrated new type into db package * add proper nil checks * using new state in archiver * refactored much of core * editing all the precompute functions * done with most core refactor * fixed up some bugs in the clone comparisons * Merge branch 'state-service' into use-state-in-runtime * append current epoch atts * merged master * add missing setters * add new setters * fix other core methods * fix up transition * main service and forkchoice * fix rpc * integrated to powchain * some more changes * fix build * improve processing of deposits * fix error * prevent panic * comment * fix process att * gaz * fix up att process * resolve existing review comments * Merge branch 'master' into use-state-in-runtime * resolve another batch of gh comments * resolve broken cpt state * revise testutil to use the new state * begin updating the state transition func to pass in more compartmentalized args * finish editing transition function to return errors * block operations pretty much done with refactor * state transition fully refactored * got epoch processing completed * fix build in fork choice * fixing more of the build * fix up broken sync package * it builds nowww it buildssss * revert registry changes * Recompute on Read (#4627) * compute on read * fix up eth1 data votes * looking into slashings bug introduced in core/ * able to advance more slots * add logging * can now sync with testnet yay * remove the leaves algorithm and other merkle imports * expose initialize unsafe funcs * Update beacon-chain/db/kv/state.go * lint Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> * include master * More Optimizations for New State (#4641) * map optimization * more optimizations * use a custom hasher * comment * block operations optimizations * Update beacon-chain/state/types.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * fixed up various operations to use the validator index map access Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> * archiver tests pass * fixing cache tests * cache tests passing * edited validator tests * powchain tests passing * halfway thru sync tests * more sync test fixes * add in tests for state/ * working through rpc tests * assignments tests passed * almost done with rpc/beacon tests * resolved painful validator test * fixed up even more tests * resolve tests * fix build * reduce a randao mixes copy * fixes under //beacon-chain/blockchain/... * build //beacon-chain/core/... * fixes * Runtime Optimizations (#4648) * parallelize shuffling * clean up * lint * fix build * use callback to read from registry * fix array roots and size map * new improvements * reduce hash allocs * improved shuffling * terence's review * use different method * raul's comment * new array roots * remove clone in pre-compute * Update beacon-chain/state/types.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * raul's review * lint * fix build issues * fix visibility Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> * Merge branch 'use-state-in-runtime' of https://github.com/prysmaticlabs/geth-sharding into resolve-tests * fix visibility * build works for all * fix blockchain test * fix a few tests * fix more tests * resolve conf * sync * update validator in slashing * Merge branch 'resolve-tests' of github.com:prysmaticlabs/prysm into resolve-tests * archiver passing * Merge branch 'resolve-tests' of github.com:prysmaticlabs/prysm into resolve-tests * fixed rpc/validator * progress on core tests * Merge branch 'resolve-tests' of github.com:prysmaticlabs/prysm into resolve-tests * resolve broken rpc tests * Merge branch 'resolve-tests' of github.com:prysmaticlabs/prysm into resolve-tests * blockchain tests passed * fix up some tests in core * Merge branch 'master' of github.com:prysmaticlabs/prysm into resolve-tests * fix message diff * remove unnecessary save * Merge branch 'master' of github.com:prysmaticlabs/prysm into resolve-tests * Save validator after slashing * Update validators one by one * another update * fix everything * Merge branch 'resolve-tests' of https://github.com/prysmaticlabs/geth-sharding into resolve-tests * fix more precompute tests * fix blocks tests * Merge branch 'resolve-tests' of github.com:prysmaticlabs/prysm into resolve-tests * more elegant fix * more helper fixes * Merge branch 'resolve-tests' of https://github.com/prysmaticlabs/geth-sharding into resolve-tests * change back ? * fix test * fix skip slot * fix test * reset caches * fix testutil * raceoff fixed * passing * Retrieve cached state in the beginning * lint * Merge branch 'master' of github.com:prysmaticlabs/prysm into resolve-tests * Fixed tests part 1 * Fixed rest of the tests * Merge branch 'master' into optimize-process-att * Minor changes to avoid copying, small refactor to reduce deplicated code * Merge branch 'master' into resolve-tests * Handle att req for slot 0 * New beacon state: Only populate merkle layers as needed, copy merkle layers on copy/clone. (#4689) * Only populate merkle layers as needed, copy merkle layers on copy/clone. * use custom copy * Make maps of correct size * slightly fast, doesn't wait for lock Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Merge branch 'resolve-tests' of github.com:prysmaticlabs/prysm into resolve-tests * Merge branch 'master' into resolve-tests * Target root can't be 0x00 * Merge refs/heads/master into resolve-tests * Merge branch 'resolve-tests' of github.com:prysmaticlabs/prysm into resolve-tests * Don't use cache for current slot (may not be the right fix) * Merge branch 'resolve-tests' of git+ssh://github.com/prysmaticlabs/prysm into resolve-tests * Merge branch 'resolve-tests' of github.com:prysmaticlabs/prysm into resolve-tests * fixed up tests * Remove some copy for init sync. Not sure if it is safe enough for runtime though... testing... * Align with prev logic for process slots cachedState.Slot() < slot * Fix Initial Sync Flag (#4692) * fixes * fix up some test failures due to lack of nil checks * fix up some test failures due to lack of nil checks * fix up imports * revert some changes * imports Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> * Conflict * Conflict * resolve confs * resolving further conflicts * Better skip slot cache (#4694) * Return copy of skip slot cache state, disable skip slot cache on sync * fix * Fix pruning * Merge refs/heads/master into resolve-tests * Merge refs/heads/master into resolve-tests * copy on write method * gaz * fix confs * Merge refs/heads/resolve-tests into copy-on-write * fix tests * Merge branch 'copy-on-write' of github.com:prysmaticlabs/prysm into copy-on-write * fix up issues with broken tests * Merge refs/heads/resolve-tests into copy-on-write * Merge branch 'master' of github.com:prysmaticlabs/prysm into copy-on-write * remove extra update * remove debugging lines * gofmt * Merge refs/heads/master into copy-on-write * Merge refs/heads/master into copy-on-write * Merge refs/heads/master into copy-on-write * Merge branch 'master' of github.com:prysmaticlabs/prysm * Passing 1 to SetEndSlot * Better way to get genesis block * Merge branch 'master' of github.com:prysmaticlabs/prysm into bug/ApiGenesisBlock * Checking for nil genBlk * Testing conditional order * Reverting conditions, and no idea why build fails * Merge branch 'master' into bug/ApiGenesisBlock * Saving to genesis block root in tests * Merge branch 'bug/ApiGenesisBlock' of github.com:AgentJ-WR/prysm into bug/ApiGenesisBlock * Saving root * Merge branch 'master' of github.com:prysmaticlabs/prysm into bug/ApiGenesisBlock * Adding regression test * Updating regression test * Merge branch 'master' into bug/ApiGenesisBlock * Merge branch 'master' into bug/ApiGenesisBlock * Merge branch 'master' into bug/ApiGenesisBlock * Merge branch 'master' into bug/ApiGenesisBlock
153 lines
5.8 KiB
Go
153 lines
5.8 KiB
Go
package beacon
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
"strconv"
|
|
|
|
ptypes "github.com/gogo/protobuf/types"
|
|
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
|
"github.com/prysmaticlabs/go-ssz"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/db/filters"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/flags"
|
|
"github.com/prysmaticlabs/prysm/shared/pagination"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
// sortableAttestations implements the Sort interface to sort attestations
|
|
// by slot as the canonical sorting attribute.
|
|
type sortableAttestations []*ethpb.Attestation
|
|
|
|
func (s sortableAttestations) Len() int { return len(s) }
|
|
func (s sortableAttestations) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
|
func (s sortableAttestations) Less(i, j int) bool {
|
|
return s[i].Data.Slot < s[j].Data.Slot
|
|
}
|
|
|
|
// ListAttestations retrieves attestations by block root, slot, or epoch.
|
|
// Attestations are sorted by data slot by default.
|
|
//
|
|
// The server may return an empty list when no attestations match the given
|
|
// filter criteria. This RPC should not return NOT_FOUND. Only one filter
|
|
// criteria should be used.
|
|
func (bs *Server) ListAttestations(
|
|
ctx context.Context, req *ethpb.ListAttestationsRequest,
|
|
) (*ethpb.ListAttestationsResponse, error) {
|
|
if int(req.PageSize) > flags.Get().MaxPageSize {
|
|
return nil, status.Errorf(codes.InvalidArgument, "Requested page size %d can not be greater than max size %d",
|
|
req.PageSize, flags.Get().MaxPageSize)
|
|
}
|
|
var atts []*ethpb.Attestation
|
|
var err error
|
|
switch q := req.QueryFilter.(type) {
|
|
case *ethpb.ListAttestationsRequest_Genesis:
|
|
genBlk, err := bs.BeaconDB.GenesisBlock(ctx)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not genesis block: %v", err)
|
|
}
|
|
if genBlk == nil {
|
|
return nil, status.Error(codes.Internal, "Could not find genesis block")
|
|
}
|
|
genesisRoot, err := ssz.HashTreeRoot(genBlk.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
atts, err = bs.BeaconDB.Attestations(ctx, filters.NewFilter().SetHeadBlockRoot(genesisRoot[:]))
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not fetch genesis attestations: %v", err)
|
|
}
|
|
case *ethpb.ListAttestationsRequest_HeadBlockRoot:
|
|
atts, err = bs.BeaconDB.Attestations(ctx, filters.NewFilter().SetHeadBlockRoot(q.HeadBlockRoot))
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not fetch attestations: %v", err)
|
|
}
|
|
case *ethpb.ListAttestationsRequest_SourceEpoch:
|
|
atts, err = bs.BeaconDB.Attestations(ctx, filters.NewFilter().SetSourceEpoch(q.SourceEpoch))
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not fetch attestations: %v", err)
|
|
}
|
|
case *ethpb.ListAttestationsRequest_SourceRoot:
|
|
atts, err = bs.BeaconDB.Attestations(ctx, filters.NewFilter().SetSourceRoot(q.SourceRoot))
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not fetch attestations: %v", err)
|
|
}
|
|
case *ethpb.ListAttestationsRequest_TargetEpoch:
|
|
atts, err = bs.BeaconDB.Attestations(ctx, filters.NewFilter().SetTargetEpoch(q.TargetEpoch))
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not fetch attestations: %v", err)
|
|
}
|
|
case *ethpb.ListAttestationsRequest_TargetRoot:
|
|
atts, err = bs.BeaconDB.Attestations(ctx, filters.NewFilter().SetTargetRoot(q.TargetRoot))
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not fetch attestations: %v", err)
|
|
}
|
|
default:
|
|
return nil, status.Error(codes.InvalidArgument, "Must specify a filter criteria for fetching attestations")
|
|
}
|
|
// We sort attestations according to the Sortable interface.
|
|
sort.Sort(sortableAttestations(atts))
|
|
numAttestations := len(atts)
|
|
|
|
// If there are no attestations, we simply return a response specifying this.
|
|
// Otherwise, attempting to paginate 0 attestations below would result in an error.
|
|
if numAttestations == 0 {
|
|
return ðpb.ListAttestationsResponse{
|
|
Attestations: make([]*ethpb.Attestation, 0),
|
|
TotalSize: int32(0),
|
|
NextPageToken: strconv.Itoa(0),
|
|
}, nil
|
|
}
|
|
|
|
start, end, nextPageToken, err := pagination.StartAndEndPage(req.PageToken, int(req.PageSize), numAttestations)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not paginate attestations: %v", err)
|
|
}
|
|
return ðpb.ListAttestationsResponse{
|
|
Attestations: atts[start:end],
|
|
TotalSize: int32(numAttestations),
|
|
NextPageToken: nextPageToken,
|
|
}, nil
|
|
}
|
|
|
|
// StreamAttestations to clients at the end of every slot. This method retrieves the
|
|
// aggregated attestations currently in the pool at the start of a slot and sends
|
|
// them over a gRPC stream.
|
|
func (bs *Server) StreamAttestations(
|
|
_ *ptypes.Empty, stream ethpb.BeaconChain_StreamAttestationsServer,
|
|
) error {
|
|
for {
|
|
select {
|
|
case <-bs.SlotTicker.C():
|
|
atts := bs.Pool.AggregatedAttestations()
|
|
for i := 0; i < len(atts); i++ {
|
|
if err := stream.Send(atts[i]); err != nil {
|
|
return status.Errorf(codes.Unavailable, "Could not send over stream: %v", err)
|
|
}
|
|
}
|
|
case <-bs.Ctx.Done():
|
|
return status.Error(codes.Canceled, "Context canceled")
|
|
case <-stream.Context().Done():
|
|
return status.Error(codes.Canceled, "Context canceled")
|
|
}
|
|
}
|
|
}
|
|
|
|
// AttestationPool retrieves pending attestations.
|
|
//
|
|
// The server returns a list of attestations that have been seen but not
|
|
// yet processed. Pool attestations eventually expire as the slot
|
|
// advances, so an attestation missing from this request does not imply
|
|
// that it was included in a block. The attestation may have expired.
|
|
// Refer to the ethereum 2.0 specification for more details on how
|
|
// attestations are processed and when they are no longer valid.
|
|
// https://github.com/ethereum/eth2.0-specs/blob/dev/specs/core/0_beacon-chain.md#attestations
|
|
func (bs *Server) AttestationPool(
|
|
ctx context.Context, _ *ptypes.Empty,
|
|
) (*ethpb.AttestationPoolResponse, error) {
|
|
atts := bs.Pool.AggregatedAttestations()
|
|
return ðpb.AttestationPoolResponse{
|
|
Attestations: atts,
|
|
}, nil
|
|
}
|