mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-10 07:58:22 -05:00
Efficient computation of epoch participation (#4430)
* Remove custody (#3986) * Update proto fields * Updated block operations * Fixed all block operation tests * Fixed tests part 1 * Fixed tests part 1 * All tests pass * Clean up * Skip spec test * Fixed ssz test * Skip ssz test * Skip mainnet tests * Update beacon-chain/operations/attestation.go * Update beacon-chain/operations/attestation.go * Decoy flip flop check (#3987) * Bounce attack check (#3989) * New store values * Update process block * Update process attestation * Update tests * Helper * Fixed blockchain package tests * Update beacon-chain/blockchain/forkchoice/process_block.go * Conflict * Unskip mainnet spec tests (#3998) * Starting * Fixed attestation mainnet test * Unskip ssz static and block processing tests * Fixed workspace * fixed workspace * fixed workspace * Update beacon-chain/core/blocks/block_operations.go * Unskip minimal spec tests (#3999) * Starting * Fixed attestation mainnet test * Unskip ssz static and block processing tests * Fixed workspace * fixed workspace * fixed workspace * Update workspace * Unskip all minimal spec tests * Update workspace for general test * Unskip test (#4001) * Update minimal seconds per slot to 6 (#3978) * Bounce attack tests (#3993) * New store values * Update process block * Update process attestation * Update tests * Helper * Fixed blockchain package tests * Slots since epoch starts tests * Update justified checkpt tests * Conflict * Fixed logic * Update process_block.go * Use helper * Conflict * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into v0.9.1 * Conflict * Fixed failed tests * Lower MinGenesisActiveValidatorCount to 16384 (#4100) * Fork choice beacon block checks (#4107) * Prevent future blocks check and test * Removed old code * Update aggregation proto (#4121) * Update def * Update spec test * Conflict * Update workspace * patch * Resolve conflict * Patch * Change workspace * Update ethereumapis to a forked branch at commit6eb1193e47* Fixed all the tests * Merge branch 'v0.9.2' of https://github.com/prysmaticlabs/prysm into conflict * fix patch * Need to regenerate test data * Merge branch 'master' into v0.9.2 * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into v0.9.2 * Enable snappy compression for all (#4157) * enable snappy compression for all * enable snappy compression for all * enable snappy compression for all * enable snappy compression for all * Validate aggregate and proof subscriber (#4159) * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into v0.9.2 * Conflict * Update workspace * Conflict * Conflict * Conflict * Merge branch 'master' into v0.9.2 * Merge branch 'master' into v0.9.2 * Conflict * Merge branch 'v0.9.2' of https://github.com/prysmaticlabs/prysm into v0.9.2 * Remove migrate to snappy (#4205) * Feature flag: Deprecate --prune-states, release to all (#4204) * Deprecated prune-states, release to all * imports * remote unused import * remove unused import * Rm prune state test * gaz * Refactoring for dynamic pubsub subscriptions for non-aggregated attestations (#4189) * checkpoint progress * chkpt * checkpoint progress * put pipeline in its own file * remove unused imports * add test, it's failing though * fix test * remove head state issue * add clear db flag to e2e * add some more error handling, debug logging * skip processing if chain has not started * fix test * wrap in go routine to see if anything breaks * remove duplicated topic * Add a regression test. Thanks @nisdas for finding the original problem. May it never happen again *fingers crossed* * Comments * gofmt * comment out with TODO * Sync with master * Sync with master * RPC servers use attestation pool (#4223) * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into v0.9.2 * Refactor RPC to Fully Utilize Ethereum APIs (#4243) * include attester as a file in the validator server * remove old proposer server impl * include new patch and properly sync changes * align with public pbs * ensure matches rpc def * fix up status tests * resolve all broken test files in the validator rpc package * gazelle include * fix up the duties implementation * fixed up all get duties functions * all tests pass * utilize new ethereum apis * amend validator client to use the new beacon node validator rpc client * fix up most of validator items * added in mock * fix up test * readd test * add chain serv mock * fix a few more validator methods * all validator tests passingggg * fix broken test * resolve even more broken tests * all tests passsssss * fix lint * try PR * fix up test * resolve broken other tests * Sync with master * Merge branch 'v0.9.2' of https://github.com/prysmaticlabs/prysm into v0.9.2 * Aggregate and proof subscriber (#4240) * Added subscribers * Fixed conflict * Tests * fix up patch * Use upstream pb * include latest patch * Fmt * Save state before head block * skip tests (#4275) * Delete block attestations from the pool (#4241) * Added subscribers * Clean up * Fixed conflict * Delete atts in pool in validate pipeline * Moved it to subscriber * Merge branch 'v0.9.2' of https://github.com/prysmaticlabs/prysm into use-att-pool-3 * Test * Fixed test * Initial work on voluntary exit (#4207) * Initial implementation of voluntary exit: RPC call * Update for recent merges * Break out validation logic for voluntary exits to core module * RequestExit -> ProposeExit * Decrease exit package visibility * Move to operation feed * Wrap errors * Fix critical proposer selection bug #4259 (#4265) * fix critical proposer selection bug #4259 * gofmt * add 1 more validator to make it 5 * more tests * Fixed archivedProposerIndex * Fixed TestFilterAttestation_OK * Refactor ComputeProposerIndex, add regression test for potential out of range panic * handle case of nil validator * Update validators_test.go * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.9.2 * Leftover merge files, oops * gaz * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge branch 'master' of https://github.com/prysmaticlabs/geth-sharding into v0.9.2 * Fixes Duplicate Validator Bug (#4322) * Update dict * Test helper * Regression test * Comment * Reset test cache * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * fixes after PR #4328 * Complete attestation pool for run time (#4286) * Added subscribers * Fixed conflict * Delete atts in pool in validate pipeline * Moved it to subscriber * Test * Fixed test * New curl for forkchoice attestations * Starting att pool service for fork choice * Update pool interface * Update pool interface * Update sync and node * Lint * Gazelle * Updated servers, filled in missing functionalities * RPC working with 1 beacon node 64 validators * Started writing tests. Yay * Test to aggregate and save multiple fork choice atts * Tests for BatchAttestations for fork choice * Fixed exisiting tests * Minor fixes * Fmt * Added batch saves * Lint * Mo tests yay * Delete test * Fmt * Update interval * Fixed aggregation broadcast * Clean up based on design review comment * Fixed setupBeaconChain * Raul's feedback. s/error/err * resolve conflicts * Merge branch 'v0.9.2' of github.com:prysmaticlabs/prysm into v0.9.2 * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.9.2 * Merge refs/heads/master into v0.9.2 * Removed old protos and fixed tests (#4336) * Merge refs/heads/master into v0.9.2 * Disallow duplicated indices and test (#4339) * Explicit use of GENESIS_SLOT in fork choice (#4343) * Update from 2 to 3 (#4345) * Remove verify unaggregated attestation when aggregating (#4347) * use slot ticker instead of run every (#4348) * Add context check for unbounded loop work (#4346) * Revert "Explicit use of GENESIS_SLOT in fork choice (#4343)" (#4349) This reverts commitd3f6753c77. * Refactor Powchain Service (#4306) * add data structures * generate proto * add in new fields * add comments * add new mock state * add new mock state * add new methods * some more changes * check genesis time properly * lint * fix refs * fix tests * lint * lint * lint * gaz * fix lint * raul's comments * use one method * fix test * raul's comment Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Ensure best better-justification is stored for fork choice (#4342) * Ensure best better-justification is stored. Minor refactor * Tests * Merge refs/heads/v0.9.2 into better-best-justified * Merge refs/heads/v0.9.2 into better-best-justified * Ensure that epoch of attestation slot matches the target epoch (#4341) * Disallow duplicated indices and test * Add slot to target epoch check to on_attestation * Add slot to target epoch check to process_attestation * Merge branch 'v0.9.2' of git+ssh://github.com/prysmaticlabs/prysm into no-dup-att-indices * Fixed TestProcessAttestations_PrevEpochFFGDataMismatches * Merge refs/heads/v0.9.2 into no-dup-att-indices * Merge refs/heads/v0.9.2 into no-dup-att-indices * Merge refs/heads/v0.9.2 into no-dup-att-indices * Merge refs/heads/v0.9.2 into no-dup-att-indices * Merge refs/heads/v0.9.2 into no-dup-att-indices * Merge refs/heads/v0.9.2 into no-dup-att-indices * Merge refs/heads/v0.9.2 into no-dup-att-indices * Update beacon-chain/blockchain/forkchoice/process_attestation_test.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Merge refs/heads/v0.9.2 into no-dup-att-indices * Filter viable branches in fork choice (#4355) * Only activate upon finality (#4359) * Updated functions * Tests * Merge branch 'v0.9.2' of git+ssh://github.com/prysmaticlabs/prysm into queue-fix-on-finality * Comment * Merge refs/heads/v0.9.2 into queue-fix-on-finality * Fixed failing test from 4359 (#4360) * Fixed * Skip registry spec tests * Wait for state to be initialized at least once before running slot ticker based on genesis time (#4364) * Sync with master * Fix checkpoint root to use genesis block root (#4368) * Return an error on nil head state in fork choice (#4369) * Return error if nil head state * Fixed tests. Saved childen blocks state Co-authored-by: terence tsao <terence@prysmaticlabs.com> * Update metrics every epoch (#4367) * return empty slice if state is nil (#4365) * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.9.2 * Merge refs/heads/master into v0.9.2 * Pubsub: Broadcast attestations to committee based subnets (#4316) * Working on un-aggregated pubsub topics * update subscriber to call pool * checkpointing * fix * untested message validation * minor fixes * rename slotsSinceGenesis to slotsSince * some progress on a unit test, subscribe is not being called still... * dont change topic * need to set the data on the message * restore topic * fixes * some helpful parameter changes for mainnet operations * lint * Terence feedback * unskip e2e * Unit test for validate committee index beacon attestation * PR feedbacK Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Merge branch 'master' of https://github.com/prysmaticlabs/geth-sharding into resolveConflicts * remove condition * Remove unused operation pool (#4361) * Merge refs/heads/master into v0.9.2 * Aggregate attestations periodically (#4376) * Persist ETH1 Data to Disk (#4329) * add data structures * generate proto * add in new fields * add comments * add new mock state * add new mock state * add new methods * some more changes * check genesis time properly * lint * fix refs * fix tests * lint * lint * lint * gaz * adding in new proto message * remove outdated vars * add new changes * remove latest eth1data * continue refactoring * finally works * lint * fix test * fix all tests * fix all tests again * fix build * change back * add full eth1 test * fix logs and test * add constant * changes * fix bug * lint * fix another bug * change back * Apply suggestions from code review Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> * Fixed VerifyIndexedAttestation (#4382) * rm signing root (#4381) * rm signing root * Fixed VerifyIndexedAttestation * Check proposer slashed status inside ProcessBlockHeaderNoVerify * Fixed TestUpdateJustified_CouldUpdateBest Co-authored-by: terence tsao <terence@prysmaticlabs.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Remove Redundant Trie Generation (#4383) * remove trie generation * remove deposit hashes * Merge branch 'master' of https://github.com/prysmaticlabs/geth-sharding into v0.9.2 * fix build * Conflict * Implement StreamAttestations RPC Endpoint (#4390) * started attestation stream * stream attestations test * on slot tick test passing * imports * gaz * Update beacon-chain/rpc/beacon/attestations_test.go Co-Authored-By: shayzluf <thezluf@gmail.com> Co-authored-by: shayzluf <thezluf@gmail.com> * Fixed goimport (#4394) * Use custom stateutil ssz for ssz HTR spec tests (#4396) * Use custom stateutil ssz for ssz HTR spec tests * gofmt * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.9.2 * Merge refs/heads/master into v0.9.2 * set mainnet to be the default for build and run (#4398) Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.9.2 * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.9.2 * gracefully handle deduplicated registration of topic validators (#4399) Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * SSZ: temporarily disable roots cache until cache issues can be resolved (#4407) * temporarily disable roots cache until cache issues can be resolved * Also use custom ssz for spectests Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Remove process block attestations as separate routine (#4408) * Removed old save/process block atts * Fixed tests Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Save Deposit Cache to Disk (#4384) * change to protos * fix build * glue everything together * fix test * raul's review * preston's comments Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Fix activation queue sorting (#4409) * Removed old save/process block atts * Fixed tests * Proper sorting by eligibility epoch then by indices * Deleted old colde * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.9.2 * Merge branch 'master' into v0.9.2 * Merge refs/heads/master into v0.9.2 * stop recursive lookup if context is cancelled (#4420) * Fix proposal bug (#4419) * Add Pending Deposits Safely (#4422) * safely prune cache * use proper method * preston's,terence's reviews and comments * revert change to build files * use as feature config instead * Release custom state ssz (#4421) * Release custom state ssz, change all HTR of beacon state to use custom method * typo * use mainnet config Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.9.2 * Define framework * Use participation fetcher * Build * Fixed all tests * Lint * Update initial sync save justified to align with v0.9.3 (#4432) * Merge refs/heads/master into v0.9.2 * Merge refs/heads/master into v0.9.2 * fix build * don't blacklist on pubsub (#4435) * Fix Flakey Slot Ticker Test (#4434) * use interface instead for the slot ticker * fixed up flakey tests * add gen time * get duties comment * fix lifecycle test * more fixes * Fixed rest of the test * Pass in correct chain service * Pass in another chain service * Run time * Configurable min genesis delay (#4437) * Configurable min genesis delay based on https://github.com/ethereum/eth2.0-specs/pull/1557 * remove feature flag for genesis delay * fix * demo config feedback * Current -> Prev * Tests * patch readme * save keys unencrypted for validators (#4439) * Add new demo configuration targeting mainnet scale (#4397) * Add new demo configuration targeting mainnet, with 1/10th of the deposit value * reduce quotant by 1/10th. Use 1/10th mainnet values * only change the inactivity quotant Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Save justified checkpoint state (#4433) * Save justified checkpoint state * Lint * Feedback * Fixed test Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Update shared/testutil/deposits.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update proto/testing/ssz_regression_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/core/epoch/epoch_processing.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/operations/attestations/kv/forkchoice.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/operations/attestations/pool.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/operations/attestations/pool.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/powchain/log_processing_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/rpc/validator/exit_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/operations/attestations/service.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/sync/subscriber_beacon_blocks_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/sync/subscriber_beacon_blocks_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/sync/subscriber.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/sync/subscriber.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/rpc/validator/proposer.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/rpc/validator/exit_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/rpc/validator/exit_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/operations/attestations/prepare_forkchoice.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/powchain/log_processing_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/operations/attestations/pool.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/powchain/log_processing_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/rpc/aggregator/server.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/rpc/validator/exit.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/rpc/validator/exit_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/rpc/validator/exit_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/cache/depositcache/pending_deposits.go * Update beacon-chain/cache/depositcache/pending_deposits_test.go * Update beacon-chain/rpc/validator/proposer.go * Merge refs/heads/master into v0.9.2 * Update test * Conflict * Update beacon-chain/blockchain/chain_info.go * Conflict * Merge branch 'efficient-participation' of git+ssh://github.com/prysmaticlabs/prysm into efficient-participation * Merge refs/heads/master into efficient-participation
This commit is contained in:
committed by
prylabs-bulldozer[bot]
parent
2182e1cdc9
commit
89eedd2123
@@ -7,7 +7,6 @@ go_library(
|
||||
visibility = ["//beacon-chain:__subpackages__"],
|
||||
deps = [
|
||||
"//beacon-chain/blockchain:go_default_library",
|
||||
"//beacon-chain/core/epoch:go_default_library",
|
||||
"//beacon-chain/core/feed:go_default_library",
|
||||
"//beacon-chain/core/feed/state:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
@@ -16,6 +15,7 @@ go_library(
|
||||
"//proto/beacon/p2p/v1:go_default_library",
|
||||
"//shared/params:go_default_library",
|
||||
"@com_github_pkg_errors//:go_default_library",
|
||||
"@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library",
|
||||
"@com_github_sirupsen_logrus//:go_default_library",
|
||||
],
|
||||
)
|
||||
@@ -26,6 +26,7 @@ go_test(
|
||||
embed = [":go_default_library"],
|
||||
deps = [
|
||||
"//beacon-chain/blockchain/testing:go_default_library",
|
||||
"//beacon-chain/core/epoch/precompute:go_default_library",
|
||||
"//beacon-chain/core/feed:go_default_library",
|
||||
"//beacon-chain/core/feed/state:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
|
||||
@@ -5,8 +5,8 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/blockchain"
|
||||
epochProcessing "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/feed"
|
||||
statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
@@ -22,30 +22,33 @@ var log = logrus.WithField("prefix", "archiver")
|
||||
// Service defining archiver functionality for persisting checkpointed
|
||||
// beacon chain information to a database backend for historical purposes.
|
||||
type Service struct {
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
beaconDB db.Database
|
||||
headFetcher blockchain.HeadFetcher
|
||||
stateNotifier statefeed.Notifier
|
||||
lastArchivedEpoch uint64
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
beaconDB db.Database
|
||||
headFetcher blockchain.HeadFetcher
|
||||
participationFetcher blockchain.ParticipationFetcher
|
||||
stateNotifier statefeed.Notifier
|
||||
lastArchivedEpoch uint64
|
||||
}
|
||||
|
||||
// Config options for the archiver service.
|
||||
type Config struct {
|
||||
BeaconDB db.Database
|
||||
HeadFetcher blockchain.HeadFetcher
|
||||
StateNotifier statefeed.Notifier
|
||||
BeaconDB db.Database
|
||||
HeadFetcher blockchain.HeadFetcher
|
||||
ParticipationFetcher blockchain.ParticipationFetcher
|
||||
StateNotifier statefeed.Notifier
|
||||
}
|
||||
|
||||
// NewArchiverService initializes the service from configuration options.
|
||||
func NewArchiverService(ctx context.Context, cfg *Config) *Service {
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
return &Service{
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
beaconDB: cfg.BeaconDB,
|
||||
headFetcher: cfg.HeadFetcher,
|
||||
stateNotifier: cfg.StateNotifier,
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
beaconDB: cfg.BeaconDB,
|
||||
headFetcher: cfg.HeadFetcher,
|
||||
participationFetcher: cfg.ParticipationFetcher,
|
||||
stateNotifier: cfg.StateNotifier,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,10 +116,15 @@ func (s *Service) archiveActiveSetChanges(ctx context.Context, headState *pb.Bea
|
||||
|
||||
// We compute participation metrics by first retrieving the head state and
|
||||
// matching validator attestations during the epoch.
|
||||
func (s *Service) archiveParticipation(ctx context.Context, headState *pb.BeaconState, epoch uint64) error {
|
||||
participation, err := epochProcessing.ComputeValidatorParticipation(headState, epoch)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "could not compute participation")
|
||||
func (s *Service) archiveParticipation(ctx context.Context, epoch uint64) error {
|
||||
p := s.participationFetcher.Participation(epoch)
|
||||
participation := ðpb.ValidatorParticipation{}
|
||||
if p != nil {
|
||||
participation = ðpb.ValidatorParticipation{
|
||||
EligibleEther: p.PrevEpoch,
|
||||
VotedEther: p.PrevEpochTargetAttesters,
|
||||
GlobalParticipationRate: float32(p.PrevEpochTargetAttesters) / float32(p.PrevEpoch),
|
||||
}
|
||||
}
|
||||
return s.beaconDB.SaveArchivedValidatorParticipation(ctx, epoch, participation)
|
||||
}
|
||||
@@ -161,7 +169,7 @@ func (s *Service) run(ctx context.Context) {
|
||||
log.WithError(err).Error("Could not archive active validator set changes")
|
||||
continue
|
||||
}
|
||||
if err := s.archiveParticipation(ctx, headState, epochToArchive); err != nil {
|
||||
if err := s.archiveParticipation(ctx, epochToArchive); err != nil {
|
||||
log.WithError(err).Error("Could not archive validator participation")
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/go-bitfield"
|
||||
mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/feed"
|
||||
statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
@@ -36,6 +37,7 @@ func TestArchiverService_ReceivesBlockProcessedEvent(t *testing.T) {
|
||||
svc.headFetcher = &mock.ChainService{
|
||||
State: &pb.BeaconState{Slot: 1},
|
||||
}
|
||||
|
||||
event := &feed.Event{
|
||||
Type: statefeed.BlockProcessed,
|
||||
Data: &statefeed.BlockProcessedData{
|
||||
@@ -144,6 +146,7 @@ func TestArchiverService_ComputesAndSavesParticipation(t *testing.T) {
|
||||
triggerStateEvent(t, svc, event)
|
||||
|
||||
attestedBalance := uint64(1)
|
||||
|
||||
currentEpoch := helpers.CurrentEpoch(headState)
|
||||
wanted := ðpb.ValidatorParticipation{
|
||||
VotedEther: attestedBalance,
|
||||
@@ -377,12 +380,16 @@ func setupState(t *testing.T, validatorCount uint64) *pb.BeaconState {
|
||||
func setupService(t *testing.T) (*Service, db.Database) {
|
||||
beaconDB := dbutil.SetupDB(t)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
validatorCount := uint64(100)
|
||||
totalBalance := validatorCount * params.BeaconConfig().MaxEffectiveBalance
|
||||
mockChainService := &mock.ChainService{}
|
||||
return &Service{
|
||||
beaconDB: beaconDB,
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
stateNotifier: mockChainService.StateNotifier(),
|
||||
participationFetcher: &mock.ChainService{
|
||||
Balance: &precompute.Balance{PrevEpoch: totalBalance, PrevEpochTargetAttesters: 1}},
|
||||
}, beaconDB
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ go_library(
|
||||
"//beacon-chain/blockchain/forkchoice:go_default_library",
|
||||
"//beacon-chain/cache/depositcache:go_default_library",
|
||||
"//beacon-chain/core/blocks:go_default_library",
|
||||
"//beacon-chain/core/epoch/precompute:go_default_library",
|
||||
"//beacon-chain/core/feed:go_default_library",
|
||||
"//beacon-chain/core/feed/state:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
"github.com/prysmaticlabs/prysm/shared/params"
|
||||
@@ -55,6 +56,12 @@ type FinalizationFetcher interface {
|
||||
PreviousJustifiedCheckpt() *ethpb.Checkpoint
|
||||
}
|
||||
|
||||
// ParticipationFetcher defines a common interface for methods in blockchain service which
|
||||
// directly retrieves validator participation related data.
|
||||
type ParticipationFetcher interface {
|
||||
Participation(epoch uint64) *precompute.Balance
|
||||
}
|
||||
|
||||
// FinalizedCheckpt returns the latest finalized checkpoint from head state.
|
||||
func (s *Service) FinalizedCheckpt() *ethpb.Checkpoint {
|
||||
if s.headState == nil || s.headState.FinalizedCheckpoint == nil {
|
||||
@@ -183,3 +190,11 @@ func (s *Service) CurrentFork() *pb.Fork {
|
||||
}
|
||||
return proto.Clone(s.headState.Fork).(*pb.Fork)
|
||||
}
|
||||
|
||||
// Participation returns the participation stats of a given epoch.
|
||||
func (s *Service) Participation(epoch uint64) *precompute.Balance {
|
||||
s.epochParticipationLock.RLock()
|
||||
defer s.epochParticipationLock.RUnlock()
|
||||
|
||||
return s.epochParticipation[epoch]
|
||||
}
|
||||
|
||||
@@ -9,8 +9,10 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/go-ssz"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/feed"
|
||||
statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
||||
"github.com/prysmaticlabs/prysm/shared/featureconfig"
|
||||
"github.com/prysmaticlabs/prysm/shared/traceutil"
|
||||
@@ -122,6 +124,10 @@ func (s *Service) ReceiveBlockNoPubsub(ctx context.Context, block *ethpb.SignedB
|
||||
// Log state transition data.
|
||||
logStateTransitionData(blockCopy.Block, root[:])
|
||||
|
||||
s.epochParticipationLock.Lock()
|
||||
defer s.epochParticipationLock.Unlock()
|
||||
s.epochParticipation[helpers.SlotToEpoch(blockCopy.Block.Slot)] = precompute.Balances
|
||||
|
||||
processedBlkNoPubsub.Inc()
|
||||
|
||||
return nil
|
||||
@@ -168,6 +174,10 @@ func (s *Service) ReceiveBlockNoPubsubForkchoice(ctx context.Context, block *eth
|
||||
// Log state transition data.
|
||||
logStateTransitionData(blockCopy.Block, root[:])
|
||||
|
||||
s.epochParticipationLock.Lock()
|
||||
defer s.epochParticipationLock.Unlock()
|
||||
s.epochParticipation[helpers.SlotToEpoch(blockCopy.Block.Slot)] = precompute.Balances
|
||||
|
||||
processedBlkNoPubsubForkchoice.Inc()
|
||||
return nil
|
||||
}
|
||||
@@ -226,6 +236,10 @@ func (s *Service) ReceiveBlockNoVerify(ctx context.Context, block *ethpb.SignedB
|
||||
"deposits": len(blockCopy.Block.Body.Deposits),
|
||||
}).Debug("Finished applying state transition")
|
||||
|
||||
s.epochParticipationLock.Lock()
|
||||
defer s.epochParticipationLock.Unlock()
|
||||
s.epochParticipation[helpers.SlotToEpoch(blockCopy.Block.Slot)] = precompute.Balances
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ import (
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/blockchain/forkchoice"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/blocks"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/feed"
|
||||
statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
@@ -34,23 +35,25 @@ import (
|
||||
// Service represents a service that handles the internal
|
||||
// logic of managing the full PoS beacon chain.
|
||||
type Service struct {
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
beaconDB db.Database
|
||||
depositCache *depositcache.DepositCache
|
||||
chainStartFetcher powchain.ChainStartFetcher
|
||||
attPool attestations.Pool
|
||||
forkChoiceStore forkchoice.ForkChoicer
|
||||
genesisTime time.Time
|
||||
p2p p2p.Broadcaster
|
||||
maxRoutines int64
|
||||
headSlot uint64
|
||||
headBlock *ethpb.SignedBeaconBlock
|
||||
headState *pb.BeaconState
|
||||
canonicalRoots map[uint64][]byte
|
||||
headLock sync.RWMutex
|
||||
stateNotifier statefeed.Notifier
|
||||
genesisRoot [32]byte
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
beaconDB db.Database
|
||||
depositCache *depositcache.DepositCache
|
||||
chainStartFetcher powchain.ChainStartFetcher
|
||||
attPool attestations.Pool
|
||||
forkChoiceStore forkchoice.ForkChoicer
|
||||
genesisTime time.Time
|
||||
p2p p2p.Broadcaster
|
||||
maxRoutines int64
|
||||
headSlot uint64
|
||||
headBlock *ethpb.SignedBeaconBlock
|
||||
headState *pb.BeaconState
|
||||
canonicalRoots map[uint64][]byte
|
||||
headLock sync.RWMutex
|
||||
stateNotifier statefeed.Notifier
|
||||
genesisRoot [32]byte
|
||||
epochParticipation map[uint64]*precompute.Balance
|
||||
epochParticipationLock sync.RWMutex
|
||||
}
|
||||
|
||||
// Config options for the service.
|
||||
@@ -71,17 +74,18 @@ func NewService(ctx context.Context, cfg *Config) (*Service, error) {
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
store := forkchoice.NewForkChoiceService(ctx, cfg.BeaconDB)
|
||||
return &Service{
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
beaconDB: cfg.BeaconDB,
|
||||
depositCache: cfg.DepositCache,
|
||||
chainStartFetcher: cfg.ChainStartFetcher,
|
||||
attPool: cfg.AttPool,
|
||||
forkChoiceStore: store,
|
||||
p2p: cfg.P2p,
|
||||
canonicalRoots: make(map[uint64][]byte),
|
||||
maxRoutines: cfg.MaxRoutines,
|
||||
stateNotifier: cfg.StateNotifier,
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
beaconDB: cfg.BeaconDB,
|
||||
depositCache: cfg.DepositCache,
|
||||
chainStartFetcher: cfg.ChainStartFetcher,
|
||||
attPool: cfg.AttPool,
|
||||
forkChoiceStore: store,
|
||||
p2p: cfg.P2p,
|
||||
canonicalRoots: make(map[uint64][]byte),
|
||||
maxRoutines: cfg.MaxRoutines,
|
||||
stateNotifier: cfg.StateNotifier,
|
||||
epochParticipation: make(map[uint64]*precompute.Balance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ go_library(
|
||||
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing",
|
||||
visibility = ["//beacon-chain:__subpackages__"],
|
||||
deps = [
|
||||
"//beacon-chain/core/epoch/precompute:go_default_library",
|
||||
"//beacon-chain/core/feed/operation:go_default_library",
|
||||
"//beacon-chain/core/feed/state:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/go-ssz"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute"
|
||||
opfeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/operation"
|
||||
statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
@@ -27,6 +28,7 @@ type ChainService struct {
|
||||
CurrentJustifiedCheckPoint *ethpb.Checkpoint
|
||||
PreviousJustifiedCheckPoint *ethpb.Checkpoint
|
||||
BlocksReceived []*ethpb.SignedBeaconBlock
|
||||
Balance *precompute.Balance
|
||||
Genesis time.Time
|
||||
Fork *pb.Fork
|
||||
DB db.Database
|
||||
@@ -188,3 +190,8 @@ func (ms *ChainService) HeadSeed(epoch uint64) ([32]byte, error) {
|
||||
func (ms *ChainService) GenesisTime() time.Time {
|
||||
return ms.Genesis
|
||||
}
|
||||
|
||||
// Participation mocks the same method in the chain service.
|
||||
func (ms *ChainService) Participation(epoch uint64) *precompute.Balance {
|
||||
return ms.Balance
|
||||
}
|
||||
|
||||
@@ -5,10 +5,10 @@ import (
|
||||
"math/big"
|
||||
"sort"
|
||||
|
||||
dbpb "github.com/prysmaticlabs/prysm/proto/beacon/db"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
dbpb "github.com/prysmaticlabs/prysm/proto/beacon/db"
|
||||
"github.com/prysmaticlabs/prysm/shared/hashutil"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"go.opencensus.io/trace"
|
||||
|
||||
@@ -6,9 +6,9 @@ import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
dbpb "github.com/prysmaticlabs/prysm/proto/beacon/db"
|
||||
"github.com/gogo/protobuf/proto"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
dbpb "github.com/prysmaticlabs/prysm/proto/beacon/db"
|
||||
)
|
||||
|
||||
var _ = PendingDepositsFetcher(&DepositCache{})
|
||||
|
||||
@@ -2,10 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"epoch_processing.go",
|
||||
"participation.go",
|
||||
],
|
||||
srcs = ["epoch_processing.go"],
|
||||
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch",
|
||||
visibility = ["//beacon-chain:__subpackages__"],
|
||||
deps = [
|
||||
@@ -26,13 +23,11 @@ go_test(
|
||||
srcs = [
|
||||
"epoch_processing_fuzz_test.go",
|
||||
"epoch_processing_test.go",
|
||||
"participation_test.go",
|
||||
],
|
||||
embed = [":go_default_library"],
|
||||
deps = [
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
"//proto/beacon/p2p/v1:go_default_library",
|
||||
"//shared/bytesutil:go_default_library",
|
||||
"//shared/params:go_default_library",
|
||||
"@com_github_gogo_protobuf//proto:go_default_library",
|
||||
"@com_github_google_gofuzz//:go_default_library",
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
package epoch
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
@@ -34,81 +33,6 @@ func (s sortableIndices) Less(i, j int) bool {
|
||||
return epochState.Validators[s[i]].ActivationEligibilityEpoch < epochState.Validators[s[j]].ActivationEligibilityEpoch
|
||||
}
|
||||
|
||||
// MatchedAttestations is an object that contains the correctly
|
||||
// voted attestations based on source, target and head criteria.
|
||||
type MatchedAttestations struct {
|
||||
source []*pb.PendingAttestation
|
||||
Target []*pb.PendingAttestation
|
||||
head []*pb.PendingAttestation
|
||||
}
|
||||
|
||||
// MatchAttestations matches the attestations gathered in a span of an epoch
|
||||
// and categorize them whether they correctly voted for source, target and head.
|
||||
// We combined the individual helpers from spec for efficiency and to achieve O(N) run time.
|
||||
//
|
||||
// Spec pseudocode definition:
|
||||
// def get_matching_source_attestations(state: BeaconState, epoch: Epoch) -> List[PendingAttestation]:
|
||||
// assert epoch in (get_current_epoch(state), get_previous_epoch(state))
|
||||
// return state.current_epoch_attestations if epoch == get_current_epoch(state) else state.previous_epoch_attestations
|
||||
//
|
||||
// def get_matching_target_attestations(state: BeaconState, epoch: Epoch) -> List[PendingAttestation]:
|
||||
// return [
|
||||
// a for a in get_matching_source_attestations(state, epoch)
|
||||
// if a.data.target_root == get_block_root(state, epoch)
|
||||
// ]
|
||||
//
|
||||
// def get_matching_head_attestations(state: BeaconState, epoch: Epoch) -> List[PendingAttestation]:
|
||||
// return [
|
||||
// a for a in get_matching_source_attestations(state, epoch)
|
||||
// if a.data.beacon_block_root == get_block_root_at_slot(state, get_attestation_data_slot(state, a.data))
|
||||
// ]
|
||||
func MatchAttestations(state *pb.BeaconState, epoch uint64) (*MatchedAttestations, error) {
|
||||
currentEpoch := helpers.CurrentEpoch(state)
|
||||
previousEpoch := helpers.PrevEpoch(state)
|
||||
|
||||
// Input epoch for matching the source attestations has to be within range
|
||||
// of current epoch & previous epoch.
|
||||
if epoch != currentEpoch && epoch != previousEpoch {
|
||||
return nil, fmt.Errorf("input epoch: %d != current epoch: %d or previous epoch: %d",
|
||||
epoch, currentEpoch, previousEpoch)
|
||||
}
|
||||
|
||||
// Decide if the source attestations are coming from current or previous epoch.
|
||||
var srcAtts []*pb.PendingAttestation
|
||||
if epoch == currentEpoch {
|
||||
srcAtts = state.CurrentEpochAttestations
|
||||
} else {
|
||||
srcAtts = state.PreviousEpochAttestations
|
||||
}
|
||||
targetRoot, err := helpers.BlockRoot(state, epoch)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "could not get block root for epoch %d", epoch)
|
||||
}
|
||||
|
||||
tgtAtts := make([]*pb.PendingAttestation, 0, len(srcAtts))
|
||||
headAtts := make([]*pb.PendingAttestation, 0, len(srcAtts))
|
||||
for _, srcAtt := range srcAtts {
|
||||
// If the target root matches attestation's target root,
|
||||
// then we know this attestation has correctly voted for target.
|
||||
if bytes.Equal(srcAtt.Data.Target.Root, targetRoot) {
|
||||
tgtAtts = append(tgtAtts, srcAtt)
|
||||
}
|
||||
headRoot, err := helpers.BlockRootAtSlot(state, srcAtt.Data.Slot)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "could not get block root for slot %d", srcAtt.Data.Slot)
|
||||
}
|
||||
if bytes.Equal(srcAtt.Data.BeaconBlockRoot, headRoot) {
|
||||
headAtts = append(headAtts, srcAtt)
|
||||
}
|
||||
}
|
||||
|
||||
return &MatchedAttestations{
|
||||
source: srcAtts,
|
||||
Target: tgtAtts,
|
||||
head: headAtts,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// AttestingBalance returns the total balance from all the attesting indices.
|
||||
//
|
||||
// WARNING: This method allocates a new copy of the attesting validator indices set and is
|
||||
|
||||
@@ -2,8 +2,6 @@ package epoch
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
@@ -149,154 +147,6 @@ func TestAttestingBalance_CorrectBalance(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestMatchAttestations_PrevEpoch(t *testing.T) {
|
||||
e := params.BeaconConfig().SlotsPerEpoch
|
||||
s := uint64(0) // slot
|
||||
|
||||
// The correct epoch for source is the first epoch
|
||||
// The correct vote for target is '1'
|
||||
// The correct vote for head is '2'
|
||||
prevAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{}}}, // source
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{Root: []byte{1}}}}, // source, target
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{Root: []byte{3}}}}, // source
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{Root: []byte{1}}}}, // source, target
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{}}}, // source, head
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{4}, Target: ðpb.Checkpoint{}}}, // source
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{1}}}}, // source, target, head
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{5}, Target: ðpb.Checkpoint{Root: []byte{1}}}}, // source, target
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{6}}}}, // source, head
|
||||
}
|
||||
|
||||
currentAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{}}}, // none
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{2}, Target: ðpb.Checkpoint{Root: []byte{1}}}}, // none
|
||||
}
|
||||
|
||||
blockRoots := make([][]byte, 128)
|
||||
for i := 0; i < len(blockRoots); i++ {
|
||||
blockRoots[i] = []byte{byte(i + 1)}
|
||||
}
|
||||
state := &pb.BeaconState{
|
||||
Slot: s + e + 2,
|
||||
CurrentEpochAttestations: currentAtts,
|
||||
PreviousEpochAttestations: prevAtts,
|
||||
BlockRoots: blockRoots,
|
||||
RandaoMixes: make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector),
|
||||
}
|
||||
|
||||
mAtts, err := MatchAttestations(state, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
wantedSrcAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{Root: []byte{3}}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{4}, Target: ðpb.Checkpoint{}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{5}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{6}}}},
|
||||
}
|
||||
if !reflect.DeepEqual(mAtts.source, wantedSrcAtts) {
|
||||
t.Error("source attestations don't match")
|
||||
}
|
||||
|
||||
wantedTgtAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{5}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
}
|
||||
if !reflect.DeepEqual(mAtts.Target, wantedTgtAtts) {
|
||||
t.Error("target attestations don't match")
|
||||
}
|
||||
|
||||
wantedHeadAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{1}}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{6}}}},
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(mAtts.head, wantedHeadAtts) {
|
||||
t.Error("head attestations don't match")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMatchAttestations_CurrentEpoch(t *testing.T) {
|
||||
e := params.BeaconConfig().SlotsPerEpoch
|
||||
s := uint64(0) // slot
|
||||
|
||||
// The correct epoch for source is the first epoch
|
||||
// The correct vote for target is '33'
|
||||
// The correct vote for head is '34'
|
||||
prevAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{}}}, // none
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{2}, Target: ðpb.Checkpoint{Root: []byte{1}}}}, // none
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{5}, Target: ðpb.Checkpoint{Root: []byte{1}}}}, // none
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{2}, Target: ðpb.Checkpoint{Root: []byte{6}}}}, // none
|
||||
}
|
||||
|
||||
currentAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{}}}, // source
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{33}}}}, // source, target, head
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{69}, Target: ðpb.Checkpoint{Root: []byte{33}}}}, // source, target
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{68}}}}, // source, head
|
||||
}
|
||||
|
||||
blockRoots := make([][]byte, 128)
|
||||
for i := 0; i < len(blockRoots); i++ {
|
||||
blockRoots[i] = []byte{byte(i + 1)}
|
||||
}
|
||||
state := &pb.BeaconState{
|
||||
Slot: s + e + 2,
|
||||
CurrentEpochAttestations: currentAtts,
|
||||
PreviousEpochAttestations: prevAtts,
|
||||
BlockRoots: blockRoots,
|
||||
}
|
||||
|
||||
mAtts, err := MatchAttestations(state, 1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
wantedSrcAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, Target: ðpb.Checkpoint{}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{33}}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{69}, Target: ðpb.Checkpoint{Root: []byte{33}}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{68}}}},
|
||||
}
|
||||
if !reflect.DeepEqual(mAtts.source, wantedSrcAtts) {
|
||||
t.Error("source attestations don't match")
|
||||
}
|
||||
|
||||
wantedTgtAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{33}}}},
|
||||
{Data: ðpb.AttestationData{Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{69}, Target: ðpb.Checkpoint{Root: []byte{33}}}},
|
||||
}
|
||||
if !reflect.DeepEqual(mAtts.Target, wantedTgtAtts) {
|
||||
t.Error("target attestations don't match")
|
||||
}
|
||||
|
||||
wantedHeadAtts := []*pb.PendingAttestation{
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{33}}}},
|
||||
{Data: ðpb.AttestationData{Slot: 33, Source: ðpb.Checkpoint{}, BeaconBlockRoot: []byte{34}, Target: ðpb.Checkpoint{Root: []byte{68}}}},
|
||||
}
|
||||
if !reflect.DeepEqual(mAtts.head, wantedHeadAtts) {
|
||||
t.Error("head attestations don't match")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMatchAttestations_EpochOutOfBound(t *testing.T) {
|
||||
_, err := MatchAttestations(&pb.BeaconState{Slot: 1}, 2 /* epoch */)
|
||||
if !strings.Contains(err.Error(), "input epoch: 2 != current epoch: 0") {
|
||||
t.Fatal("Did not receive wanted error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBaseReward_AccurateRewards(t *testing.T) {
|
||||
tests := []struct {
|
||||
a uint64
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
package epoch
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
)
|
||||
|
||||
// ComputeValidatorParticipation by matching validator attestations from the previous epoch,
|
||||
// computing the attesting balance, and how much attested compared to the total balance.
|
||||
// The previous epoch is used because it is deterministic, as the current epoch may not
|
||||
// have completed yet and will not give accurate results.
|
||||
func ComputeValidatorParticipation(state *pb.BeaconState, epoch uint64) (*ethpb.ValidatorParticipation, error) {
|
||||
currentEpoch := helpers.CurrentEpoch(state)
|
||||
previousEpoch := helpers.PrevEpoch(state)
|
||||
if epoch != currentEpoch && epoch != previousEpoch {
|
||||
return nil, fmt.Errorf(
|
||||
"requested epoch is not previous epoch %d or current epoch %d, requested %d",
|
||||
previousEpoch,
|
||||
currentEpoch,
|
||||
epoch,
|
||||
)
|
||||
}
|
||||
atts, err := MatchAttestations(state, epoch)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "could not retrieve head attestations")
|
||||
}
|
||||
attestedBalances, err := AttestingBalance(state, atts.Target)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "could not retrieve attested balances")
|
||||
}
|
||||
totalBalances, err := helpers.TotalActiveBalance(state)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "could not retrieve total balances")
|
||||
}
|
||||
return ðpb.ValidatorParticipation{
|
||||
GlobalParticipationRate: float32(attestedBalances) / float32(totalBalances),
|
||||
VotedEther: attestedBalances,
|
||||
EligibleEther: totalBalances,
|
||||
}, nil
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
package epoch_test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/go-bitfield"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/epoch"
|
||||
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
||||
"github.com/prysmaticlabs/prysm/shared/params"
|
||||
)
|
||||
|
||||
func TestComputeValidatorParticipation_PreviousEpoch(t *testing.T) {
|
||||
params.OverrideBeaconConfig(params.MinimalSpecConfig())
|
||||
e := uint64(1)
|
||||
attestedBalance := uint64(20) * params.BeaconConfig().MaxEffectiveBalance
|
||||
validatorCount := uint64(100)
|
||||
|
||||
validators := make([]*ethpb.Validator, validatorCount)
|
||||
balances := make([]uint64, validatorCount)
|
||||
for i := 0; i < len(validators); i++ {
|
||||
validators[i] = ðpb.Validator{
|
||||
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
|
||||
EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance,
|
||||
}
|
||||
balances[i] = params.BeaconConfig().MaxEffectiveBalance
|
||||
}
|
||||
|
||||
blockRoots := make([][]byte, 256)
|
||||
for i := 0; i < len(blockRoots); i++ {
|
||||
slot := bytesutil.Bytes32(uint64(i))
|
||||
blockRoots[i] = slot
|
||||
}
|
||||
target := ðpb.Checkpoint{
|
||||
Epoch: e,
|
||||
Root: blockRoots[0],
|
||||
}
|
||||
|
||||
atts := []*pb.PendingAttestation{
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: 0},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: 1},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: 2},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: 3},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: 4},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
}
|
||||
|
||||
s := &pb.BeaconState{
|
||||
Slot: e*params.BeaconConfig().SlotsPerEpoch + 1,
|
||||
Validators: validators,
|
||||
Balances: balances,
|
||||
BlockRoots: blockRoots,
|
||||
Slashings: []uint64{0, 1e9, 1e9},
|
||||
RandaoMixes: make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector),
|
||||
PreviousEpochAttestations: atts,
|
||||
FinalizedCheckpoint: ðpb.Checkpoint{},
|
||||
JustificationBits: bitfield.Bitvector4{0x00},
|
||||
PreviousJustifiedCheckpoint: target,
|
||||
}
|
||||
|
||||
res, err := epoch.ComputeValidatorParticipation(s, e-1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
wanted := ðpb.ValidatorParticipation{
|
||||
VotedEther: attestedBalance,
|
||||
EligibleEther: validatorCount * params.BeaconConfig().MaxEffectiveBalance,
|
||||
GlobalParticipationRate: float32(attestedBalance) / float32(validatorCount*params.BeaconConfig().MaxEffectiveBalance),
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(res, wanted) {
|
||||
t.Errorf("Incorrect validator participation, wanted %v received %v", wanted, res)
|
||||
}
|
||||
}
|
||||
|
||||
func TestComputeValidatorParticipation_CurrentEpoch(t *testing.T) {
|
||||
params.OverrideBeaconConfig(params.MinimalSpecConfig())
|
||||
e := uint64(1)
|
||||
attestedBalance := uint64(16) * params.BeaconConfig().MaxEffectiveBalance
|
||||
validatorCount := uint64(100)
|
||||
|
||||
validators := make([]*ethpb.Validator, validatorCount)
|
||||
balances := make([]uint64, validatorCount)
|
||||
for i := 0; i < len(validators); i++ {
|
||||
validators[i] = ðpb.Validator{
|
||||
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
|
||||
EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance,
|
||||
}
|
||||
balances[i] = params.BeaconConfig().MaxEffectiveBalance
|
||||
}
|
||||
|
||||
slot := e*params.BeaconConfig().SlotsPerEpoch + 4
|
||||
blockRoots := make([][]byte, 256)
|
||||
for i := 0; i < len(blockRoots); i++ {
|
||||
slot := bytesutil.Bytes32(uint64(i))
|
||||
blockRoots[i] = slot
|
||||
}
|
||||
target := ðpb.Checkpoint{
|
||||
Epoch: e,
|
||||
Root: blockRoots[params.BeaconConfig().SlotsPerEpoch],
|
||||
}
|
||||
|
||||
atts := []*pb.PendingAttestation{
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: slot - 4},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: slot - 3},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: slot - 2},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
{
|
||||
Data: ðpb.AttestationData{Target: target, Slot: slot - 1},
|
||||
AggregationBits: []byte{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
},
|
||||
}
|
||||
|
||||
s := &pb.BeaconState{
|
||||
Slot: slot,
|
||||
Validators: validators,
|
||||
Balances: balances,
|
||||
BlockRoots: blockRoots,
|
||||
Slashings: []uint64{0, 1e9, 1e9},
|
||||
RandaoMixes: make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector),
|
||||
CurrentEpochAttestations: atts,
|
||||
FinalizedCheckpoint: ðpb.Checkpoint{},
|
||||
JustificationBits: bitfield.Bitvector4{0x00},
|
||||
CurrentJustifiedCheckpoint: target,
|
||||
}
|
||||
|
||||
res, err := epoch.ComputeValidatorParticipation(s, e)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
wanted := ðpb.ValidatorParticipation{
|
||||
VotedEther: attestedBalance,
|
||||
EligibleEther: validatorCount * params.BeaconConfig().MaxEffectiveBalance,
|
||||
GlobalParticipationRate: float32(attestedBalance) / float32(validatorCount*params.BeaconConfig().MaxEffectiveBalance),
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(res, wanted) {
|
||||
t.Errorf("Incorrect validator participation, wanted %v received %v", wanted, res)
|
||||
}
|
||||
}
|
||||
@@ -460,6 +460,7 @@ func (b *BeaconNode) registerRPCService(ctx *cli.Context) error {
|
||||
HeadFetcher: chainService,
|
||||
ForkFetcher: chainService,
|
||||
FinalizationFetcher: chainService,
|
||||
ParticipationFetcher: chainService,
|
||||
BlockReceiver: chainService,
|
||||
AttestationReceiver: chainService,
|
||||
GenesisTimeFetcher: chainService,
|
||||
@@ -543,9 +544,10 @@ func (b *BeaconNode) registerArchiverService(ctx *cli.Context) error {
|
||||
return err
|
||||
}
|
||||
svc := archiver.NewArchiverService(context.Background(), &archiver.Config{
|
||||
BeaconDB: b.db,
|
||||
HeadFetcher: chainService,
|
||||
StateNotifier: b,
|
||||
BeaconDB: b.db,
|
||||
HeadFetcher: chainService,
|
||||
ParticipationFetcher: chainService,
|
||||
StateNotifier: b,
|
||||
})
|
||||
return b.services.RegisterService(svc)
|
||||
}
|
||||
|
||||
@@ -394,6 +394,7 @@ func (s *Service) checkBlockNumberForChainStart(ctx context.Context, blkNum *big
|
||||
if hash == [32]byte{} {
|
||||
return errors.Wrap(err, "got empty block hash")
|
||||
}
|
||||
|
||||
timeStamp, err := s.BlockTimeByHeight(ctx, blkNum)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "could not get block timestamp")
|
||||
|
||||
@@ -713,6 +713,7 @@ func newPowchainService(t *testing.T, eth1Backend *contracts.TestAccount, beacon
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
web3Service.rpcClient = &mockPOW.RPCClient{Backend: eth1Backend.Backend}
|
||||
web3Service.reader = &goodReader{backend: eth1Backend.Backend}
|
||||
web3Service.blockFetcher = &goodFetcher{backend: eth1Backend.Backend}
|
||||
|
||||
@@ -7,10 +7,10 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||
gethTypes "github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/rpc"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
||||
|
||||
@@ -14,7 +14,6 @@ go_library(
|
||||
visibility = ["//beacon-chain:__subpackages__"],
|
||||
deps = [
|
||||
"//beacon-chain/blockchain:go_default_library",
|
||||
"//beacon-chain/core/epoch:go_default_library",
|
||||
"//beacon-chain/core/feed:go_default_library",
|
||||
"//beacon-chain/core/feed/state:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
@@ -52,6 +51,7 @@ go_test(
|
||||
shard_count = 4,
|
||||
deps = [
|
||||
"//beacon-chain/blockchain/testing:go_default_library",
|
||||
"//beacon-chain/core/epoch/precompute:go_default_library",
|
||||
"//beacon-chain/core/feed:go_default_library",
|
||||
"//beacon-chain/core/feed/state:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
|
||||
@@ -18,15 +18,16 @@ import (
|
||||
// providing RPC endpoints to access data relevant to the Ethereum 2.0 phase 0
|
||||
// beacon chain.
|
||||
type Server struct {
|
||||
BeaconDB db.Database
|
||||
Ctx context.Context
|
||||
ChainStartFetcher powchain.ChainStartFetcher
|
||||
HeadFetcher blockchain.HeadFetcher
|
||||
FinalizationFetcher blockchain.FinalizationFetcher
|
||||
StateNotifier statefeed.Notifier
|
||||
Pool attestations.Pool
|
||||
IncomingAttestation chan *ethpb.Attestation
|
||||
CanonicalStateChan chan *pbp2p.BeaconState
|
||||
ChainStartChan chan time.Time
|
||||
SlotTicker slotutil.Ticker
|
||||
BeaconDB db.Database
|
||||
Ctx context.Context
|
||||
ChainStartFetcher powchain.ChainStartFetcher
|
||||
HeadFetcher blockchain.HeadFetcher
|
||||
FinalizationFetcher blockchain.FinalizationFetcher
|
||||
ParticipationFetcher blockchain.ParticipationFetcher
|
||||
StateNotifier statefeed.Notifier
|
||||
Pool attestations.Pool
|
||||
IncomingAttestation chan *ethpb.Attestation
|
||||
CanonicalStateChan chan *pbp2p.BeaconState
|
||||
ChainStartChan chan time.Time
|
||||
SlotTicker slotutil.Ticker
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import (
|
||||
|
||||
ptypes "github.com/gogo/protobuf/types"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/epoch"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/validators"
|
||||
@@ -442,12 +441,13 @@ func (bs *Server) GetValidatorParticipation(
|
||||
)
|
||||
}
|
||||
|
||||
// Else if the request is for the current epoch, we compute validator participation
|
||||
// right away and return the result based on the head state.
|
||||
participation, err := epoch.ComputeValidatorParticipation(headState, requestedEpoch)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "Could not compute participation: %v", err)
|
||||
p := bs.ParticipationFetcher.Participation(requestedEpoch)
|
||||
participation := ðpb.ValidatorParticipation{
|
||||
EligibleEther: p.PrevEpoch,
|
||||
VotedEther: p.PrevEpochTargetAttesters,
|
||||
GlobalParticipationRate: float32(p.PrevEpochTargetAttesters) / float32(p.PrevEpoch),
|
||||
}
|
||||
|
||||
return ðpb.ValidatorParticipationResponse{
|
||||
Epoch: requestedEpoch,
|
||||
Finalized: requestedEpoch <= headState.FinalizedCheckpoint.Epoch,
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
"github.com/prysmaticlabs/go-bitfield"
|
||||
"github.com/prysmaticlabs/go-ssz"
|
||||
mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/db"
|
||||
dbTest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing"
|
||||
@@ -1456,9 +1457,17 @@ func TestServer_GetValidatorParticipation_PrevEpoch(t *testing.T) {
|
||||
CurrentJustifiedCheckpoint: ðpb.Checkpoint{},
|
||||
}
|
||||
|
||||
m := &mock.ChainService{
|
||||
State: s,
|
||||
Balance: &precompute.Balance{
|
||||
PrevEpoch: validatorCount * params.BeaconConfig().MaxEffectiveBalance,
|
||||
PrevEpochTargetAttesters: attestedBalance,
|
||||
},
|
||||
}
|
||||
bs := &Server{
|
||||
BeaconDB: db,
|
||||
HeadFetcher: &mock.ChainService{State: s},
|
||||
BeaconDB: db,
|
||||
HeadFetcher: m,
|
||||
ParticipationFetcher: m,
|
||||
}
|
||||
|
||||
res, err := bs.GetValidatorParticipation(ctx, ðpb.GetValidatorParticipationRequest{})
|
||||
|
||||
@@ -54,6 +54,7 @@ type Service struct {
|
||||
headFetcher blockchain.HeadFetcher
|
||||
forkFetcher blockchain.ForkFetcher
|
||||
finalizationFetcher blockchain.FinalizationFetcher
|
||||
participationFetcher blockchain.ParticipationFetcher
|
||||
genesisTimeFetcher blockchain.GenesisTimeFetcher
|
||||
attestationReceiver blockchain.AttestationReceiver
|
||||
blockReceiver blockchain.BlockReceiver
|
||||
@@ -87,6 +88,7 @@ type Config struct {
|
||||
HeadFetcher blockchain.HeadFetcher
|
||||
ForkFetcher blockchain.ForkFetcher
|
||||
FinalizationFetcher blockchain.FinalizationFetcher
|
||||
ParticipationFetcher blockchain.ParticipationFetcher
|
||||
AttestationReceiver blockchain.AttestationReceiver
|
||||
BlockReceiver blockchain.BlockReceiver
|
||||
POWChainService powchain.Chain
|
||||
@@ -114,6 +116,7 @@ func NewService(ctx context.Context, cfg *Config) *Service {
|
||||
headFetcher: cfg.HeadFetcher,
|
||||
forkFetcher: cfg.ForkFetcher,
|
||||
finalizationFetcher: cfg.FinalizationFetcher,
|
||||
participationFetcher: cfg.ParticipationFetcher,
|
||||
genesisTimeFetcher: cfg.GenesisTimeFetcher,
|
||||
attestationReceiver: cfg.AttestationReceiver,
|
||||
blockReceiver: cfg.BlockReceiver,
|
||||
@@ -209,15 +212,16 @@ func (s *Service) Start() {
|
||||
PeersFetcher: s.peersFetcher,
|
||||
}
|
||||
beaconChainServer := &beacon.Server{
|
||||
Ctx: s.ctx,
|
||||
BeaconDB: s.beaconDB,
|
||||
Pool: s.attestationsPool,
|
||||
HeadFetcher: s.headFetcher,
|
||||
FinalizationFetcher: s.finalizationFetcher,
|
||||
ChainStartFetcher: s.chainStartFetcher,
|
||||
CanonicalStateChan: s.canonicalStateChan,
|
||||
StateNotifier: s.stateNotifier,
|
||||
SlotTicker: ticker,
|
||||
Ctx: s.ctx,
|
||||
BeaconDB: s.beaconDB,
|
||||
Pool: s.attestationsPool,
|
||||
HeadFetcher: s.headFetcher,
|
||||
FinalizationFetcher: s.finalizationFetcher,
|
||||
ParticipationFetcher: s.participationFetcher,
|
||||
ChainStartFetcher: s.chainStartFetcher,
|
||||
CanonicalStateChan: s.canonicalStateChan,
|
||||
StateNotifier: s.stateNotifier,
|
||||
SlotTicker: ticker,
|
||||
}
|
||||
aggregatorServer := &aggregator.Server{
|
||||
BeaconDB: s.beaconDB,
|
||||
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
"math/big"
|
||||
"math/rand"
|
||||
|
||||
dbpb "github.com/prysmaticlabs/prysm/proto/beacon/db"
|
||||
"github.com/pkg/errors"
|
||||
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/go-ssz"
|
||||
@@ -14,6 +13,7 @@ import (
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/state/interop"
|
||||
dbpb "github.com/prysmaticlabs/prysm/proto/beacon/db"
|
||||
pbp2p "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
||||
"github.com/prysmaticlabs/prysm/shared/hashutil"
|
||||
|
||||
@@ -81,7 +81,7 @@ func runEndToEndTest(t *testing.T, config *end2EndConfig) {
|
||||
currentEpoch := uint64(0)
|
||||
ticker := GetEpochTicker(genesisTime, epochSeconds)
|
||||
for c := range ticker.C() {
|
||||
if c >= config.epochsToRun || t.Failed() {
|
||||
if c >= config.epochsToRun || t.Failed() {
|
||||
ticker.Done()
|
||||
break
|
||||
}
|
||||
@@ -150,7 +150,6 @@ func killProcesses(t *testing.T, pIDs []int) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func logOutput(t *testing.T, tmpPath string, config *end2EndConfig) {
|
||||
if t.Failed() {
|
||||
// Log out errors from beacon chain nodes.
|
||||
|
||||
@@ -27,7 +27,7 @@ var ValidatorsAreActive = Evaluator{
|
||||
// ValidatorsParticipating ensures the expected amount of validators are active.
|
||||
var ValidatorsParticipating = Evaluator{
|
||||
Name: "validators_participating_epoch_%d",
|
||||
Policy: afterNthEpoch(1),
|
||||
Policy: afterNthEpoch(3),
|
||||
Evaluation: validatorsParticipating,
|
||||
}
|
||||
|
||||
|
||||
@@ -68,8 +68,8 @@ var (
|
||||
Usage: "Enable of the saving of deposit related data",
|
||||
}
|
||||
noGenesisDelayFlag = cli.BoolFlag{
|
||||
Name: "no-genesis-delay",
|
||||
Usage: "Start the genesis event right away using the eth1 block timestamp which " +
|
||||
Name: "no-genesis-delay",
|
||||
Usage: "Start the genesis event right away using the eth1 block timestamp which " +
|
||||
"triggered the genesis as the genesis time. This flag should be used for local " +
|
||||
"development and testing only.",
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
serverAddr = flag.String("server", "", "The address of the gRPC server")
|
||||
podName = flag.String("pod-name", "", "The name of the pod running this tool")
|
||||
numKeys = flag.Uint64("keys", 1, "The number of keys to request")
|
||||
outputJSON = flag.String("output-json", "", "JSON file to write output to")
|
||||
serverAddr = flag.String("server", "", "The address of the gRPC server")
|
||||
podName = flag.String("pod-name", "", "The name of the pod running this tool")
|
||||
numKeys = flag.Uint64("keys", 1, "The number of keys to request")
|
||||
outputJSON = flag.String("output-json", "", "JSON file to write output to")
|
||||
)
|
||||
|
||||
// UnencryptedKeysContainer defines the structure of the unecrypted key JSON file.
|
||||
|
||||
Reference in New Issue
Block a user