mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-06 01:32:18 +00:00
81c53c26fb
* Update seed domains (#3872) * Remove Transfers (#3870) * Remove active index roots and compact committee roots (#3869) * Update inclusion reward (#3886) * Alter proposer selection logic (#3884) * Fix early committee bias (#3888) * Remove shards and committees (#3896) * Epoch spec tests v0.9 (#3907) * Block spec test v0.9 (#3905) * rm'ed in protobuf * build proto * build proto * build proto * fix core package * Gazelle * Fixed all the tests * Fixed static test * Comment out spec test for now * One more skip * fix-roundRobinSync (#3862) * Starting but need new seed function * Revert initial sync * Updated Proposer Slashing * Fixed all tests * Lint * Update inclusion reward * Fill randao mixes with eth1 data hash * Test * Fixing test part1 * All tests passing * One last test * Updated config * Build proto * Proper skip message * Conflict and fmt * Removed crosslinks and shards. Built * Format and gazelle * Fixed all the block package tests * Fixed all the helper tests * All epoch package tests pass * All core package tests pass * Fixed operation tests * Started fixing rpc test * RPC tests passed! * Fixed all init sync tests * All tests pass * Fixed blockchain tests * Lint * Lint * Preston's feedback * Starting * Remove container * Fixed block spec tests * All passing except for block_processing test * Failing block processing test * Starting * Add AggregateAndProof * All mainnet test passes * Update deposit contract (#3906) * Proto spec tests v0.9 (#3908) * Starting * Add AggregateAndProof * Unskip block util tests (#3910) * rm'ed in protobuf * build proto * build proto * build proto * fix core package * Gazelle * Fixed all the tests * Fixed static test * Comment out spec test for now * One more skip * fix-roundRobinSync (#3862) * Starting but need new seed function * Revert initial sync * Updated Proposer Slashing * Fixed all tests * Lint * Update inclusion reward * Fill randao mixes with eth1 data hash * Test * Fixing test part1 * All tests passing * One last test * Updated config * Build proto * Proper skip message * Conflict and fmt * Removed crosslinks and shards. Built * Format and gazelle * Fixed all the block package tests * Fixed all the helper tests * All epoch package tests pass * All core package tests pass * Fixed operation tests * Started fixing rpc test * RPC tests passed! * Fixed all init sync tests * All tests pass * Fixed blockchain tests * Lint * Lint * Preston's feedback * Starting * Remove container * Fixed block spec tests * All passing except for block_processing test * Failing block processing test * Starting * Add AggregateAndProof * All mainnet test passes * Unskip block util tests * Slot processing spec test V0.9 (#3912) * Starting * Add AggregateAndProof * Unskip slot processing mainnet test * Unskip minimal spec test for finalization (#3920) * Remove outdated interop tests (#3922) * Rm outdated interop tests * Rm test runner * Gazelle * Update validator to use proposer slot (#3919) * Fix committee assignment (#3931) * Replace shard with committee index (#3930) * Conflict * Clean up (#3933) * Remove shard filter in db (#3936) * Remove lightouse compatibility test (#3939) * Update Committee Cache for v0.9 (#3948) * Updated committee cache * Removed shuffled indices cache * Started testing run time * Lint * Fixed test * Safeguard against nil head state * address edge case * add test * Fixed TestRoundRobinSync by doubling the epochs * Unskip TestProtoCompatability (#3958) * Unskip TestProtoCompatability * Update WORKSPACE * Fix minimal config (#3959) * fix minimal configs * fix hardcoded value in test * Simplify verify att time (#3961) * update readme for deposit contract, regen bindings for vyper 0.1.0b12 (#3963) * update readme for deposit contract, regen bindings * medium * Check nil base state (#3964) * Copy Block When Receiving it From Sync (#3966) * copy block * clone for other service methods too * Change logging of Bitfield (#3956) * change logging of bits * preston's review * Unskip Beacon Server Test (#3962) * run test till the end * fix up proto message types * fmt * resolve broken tests * better error handling * fixing new logic to use archived proposer info * fix up logic * clip using the max effective balance * broken build fix with num arg mismatch * amend archive * archival logic changed * rename test * archive both proposer and attester seeds * page size 100 * further experiments * further experimentation, archivedProposerIndex seems wrong * test passes * rem log * fix broken test * fix test * gaz * fix imports * ethapis
172 lines
5.3 KiB
Go
172 lines
5.3 KiB
Go
package precompute
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
|
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
|
"github.com/prysmaticlabs/prysm/shared/traceutil"
|
|
"go.opencensus.io/trace"
|
|
)
|
|
|
|
// ProcessAttestations process the attestations in state and update individual validator's pre computes,
|
|
// it also tracks and updates epoch attesting balances.
|
|
func ProcessAttestations(
|
|
ctx context.Context,
|
|
state *pb.BeaconState,
|
|
vp []*Validator,
|
|
bp *Balance) ([]*Validator, *Balance, error) {
|
|
ctx, span := trace.StartSpan(ctx, "precomputeEpoch.ProcessAttestations")
|
|
defer span.End()
|
|
|
|
v := &Validator{}
|
|
var err error
|
|
for _, a := range append(state.PreviousEpochAttestations, state.CurrentEpochAttestations...) {
|
|
v.IsCurrentEpochAttester, v.IsCurrentEpochTargetAttester, err = AttestedCurrentEpoch(state, a)
|
|
if err != nil {
|
|
traceutil.AnnotateError(span, err)
|
|
return nil, nil, errors.Wrap(err, "could not check validator attested current epoch")
|
|
}
|
|
v.IsPrevEpochAttester, v.IsPrevEpochTargetAttester, v.IsPrevEpochHeadAttester, err = AttestedPrevEpoch(state, a)
|
|
if err != nil {
|
|
traceutil.AnnotateError(span, err)
|
|
return nil, nil, errors.Wrap(err, "could not check validator attested previous epoch")
|
|
}
|
|
|
|
// Get attested indices and update the pre computed fields for each attested validators.
|
|
indices, err := helpers.AttestingIndices(state, a.Data, a.AggregationBits)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
vp = UpdateValidator(vp, v, indices, a, a.Data.Slot)
|
|
}
|
|
|
|
bp = UpdateBalance(vp, bp)
|
|
|
|
return vp, bp, nil
|
|
}
|
|
|
|
// AttestedCurrentEpoch returns true if attestation `a` attested once in current epoch and/or epoch boundary block.
|
|
func AttestedCurrentEpoch(s *pb.BeaconState, a *pb.PendingAttestation) (bool, bool, error) {
|
|
currentEpoch := helpers.CurrentEpoch(s)
|
|
var votedCurrentEpoch, votedTarget bool
|
|
// Did validator vote current epoch.
|
|
if a.Data.Target.Epoch == currentEpoch {
|
|
votedCurrentEpoch = true
|
|
same, err := SameTarget(s, a, currentEpoch)
|
|
if err != nil {
|
|
return false, false, err
|
|
}
|
|
if same {
|
|
votedTarget = true
|
|
}
|
|
}
|
|
return votedCurrentEpoch, votedTarget, nil
|
|
}
|
|
|
|
// AttestedPrevEpoch returns true if attestation `a` attested once in previous epoch and epoch boundary block and/or the same head.
|
|
func AttestedPrevEpoch(s *pb.BeaconState, a *pb.PendingAttestation) (bool, bool, bool, error) {
|
|
prevEpoch := helpers.PrevEpoch(s)
|
|
var votedPrevEpoch, votedTarget, votedHead bool
|
|
// Did validator vote previous epoch.
|
|
if a.Data.Target.Epoch == prevEpoch {
|
|
votedPrevEpoch = true
|
|
same, err := SameTarget(s, a, prevEpoch)
|
|
if err != nil {
|
|
return false, false, false, errors.Wrap(err, "could not check same target")
|
|
}
|
|
if same {
|
|
votedTarget = true
|
|
}
|
|
|
|
same, err = SameHead(s, a)
|
|
if err != nil {
|
|
return false, false, false, errors.Wrap(err, "could not check same head")
|
|
}
|
|
if same {
|
|
votedHead = true
|
|
}
|
|
}
|
|
return votedPrevEpoch, votedTarget, votedHead, nil
|
|
}
|
|
|
|
// SameTarget returns true if attestation `a` attested to the same target block in state.
|
|
func SameTarget(state *pb.BeaconState, a *pb.PendingAttestation, e uint64) (bool, error) {
|
|
r, err := helpers.BlockRoot(state, e)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if bytes.Equal(a.Data.Target.Root, r) {
|
|
return true, nil
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
// SameHead returns true if attestation `a` attested to the same block by attestation slot in state.
|
|
func SameHead(state *pb.BeaconState, a *pb.PendingAttestation) (bool, error) {
|
|
r, err := helpers.BlockRootAtSlot(state, a.Data.Slot)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if bytes.Equal(a.Data.BeaconBlockRoot, r) {
|
|
return true, nil
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
// UpdateValidator updates pre computed validator store.
|
|
func UpdateValidator(vp []*Validator, record *Validator, indices []uint64, a *pb.PendingAttestation, aSlot uint64) []*Validator {
|
|
inclusionSlot := aSlot + a.InclusionDelay
|
|
|
|
for _, i := range indices {
|
|
if record.IsCurrentEpochAttester {
|
|
vp[i].IsCurrentEpochAttester = true
|
|
}
|
|
if record.IsCurrentEpochTargetAttester {
|
|
vp[i].IsCurrentEpochTargetAttester = true
|
|
}
|
|
if record.IsPrevEpochAttester {
|
|
vp[i].IsPrevEpochAttester = true
|
|
// Update attestation inclusion info if inclusion slot is lower than before
|
|
if inclusionSlot < vp[i].InclusionSlot {
|
|
vp[i].InclusionSlot = aSlot + a.InclusionDelay
|
|
vp[i].InclusionDistance = a.InclusionDelay
|
|
vp[i].ProposerIndex = a.ProposerIndex
|
|
}
|
|
}
|
|
if record.IsPrevEpochTargetAttester {
|
|
vp[i].IsPrevEpochTargetAttester = true
|
|
}
|
|
if record.IsPrevEpochHeadAttester {
|
|
vp[i].IsPrevEpochHeadAttester = true
|
|
}
|
|
}
|
|
return vp
|
|
}
|
|
|
|
// UpdateBalance updates pre computed balance store.
|
|
func UpdateBalance(vp []*Validator, bp *Balance) *Balance {
|
|
for _, v := range vp {
|
|
if !v.IsSlashed {
|
|
if v.IsCurrentEpochAttester {
|
|
bp.CurrentEpochAttesters += v.CurrentEpochEffectiveBalance
|
|
}
|
|
if v.IsCurrentEpochTargetAttester {
|
|
bp.CurrentEpochTargetAttesters += v.CurrentEpochEffectiveBalance
|
|
}
|
|
if v.IsPrevEpochAttester {
|
|
bp.PrevEpochAttesters += v.CurrentEpochEffectiveBalance
|
|
}
|
|
if v.IsPrevEpochTargetAttester {
|
|
bp.PrevEpochTargetAttesters += v.CurrentEpochEffectiveBalance
|
|
}
|
|
if v.IsPrevEpochHeadAttester {
|
|
bp.PrevEpochHeadAttesters += v.CurrentEpochEffectiveBalance
|
|
}
|
|
}
|
|
}
|
|
return bp
|
|
}
|