mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-25 04:47: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
129 lines
4.0 KiB
Go
129 lines
4.0 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
|
|
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
|
|
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
|
"github.com/prysmaticlabs/prysm/shared/params"
|
|
"github.com/sirupsen/logrus"
|
|
"go.opencensus.io/trace"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
// Validator interface defines the primary methods of a validator client.
|
|
type Validator interface {
|
|
Done()
|
|
WaitForChainStart(ctx context.Context) error
|
|
WaitForActivation(ctx context.Context) error
|
|
WaitForSync(ctx context.Context) error
|
|
CanonicalHeadSlot(ctx context.Context) (uint64, error)
|
|
NextSlot() <-chan uint64
|
|
SlotDeadline(slot uint64) time.Time
|
|
LogValidatorGainsAndLosses(ctx context.Context, slot uint64) error
|
|
UpdateAssignments(ctx context.Context, slot uint64) error
|
|
RolesAt(slot uint64) map[[48]byte]pb.ValidatorRole // validator pubKey -> role
|
|
AttestToBlockHead(ctx context.Context, slot uint64, pubKey [48]byte)
|
|
ProposeBlock(ctx context.Context, slot uint64, pubKey [48]byte)
|
|
}
|
|
|
|
// Run the main validator routine. This routine exits if the context is
|
|
// canceled.
|
|
//
|
|
// Order of operations:
|
|
// 1 - Initialize validator data
|
|
// 2 - Wait for validator activation
|
|
// 3 - Wait for the next slot start
|
|
// 4 - Update assignments
|
|
// 5 - Determine role at current slot
|
|
// 6 - Perform assigned role, if any
|
|
func run(ctx context.Context, v Validator) {
|
|
defer v.Done()
|
|
if err := v.WaitForChainStart(ctx); err != nil {
|
|
log.Fatalf("Could not determine if beacon chain started: %v", err)
|
|
}
|
|
if err := v.WaitForSync(ctx); err != nil {
|
|
log.Fatalf("Could not determine if beacon node synced: %v", err)
|
|
}
|
|
if err := v.WaitForActivation(ctx); err != nil {
|
|
log.Fatalf("Could not wait for validator activation: %v", err)
|
|
}
|
|
headSlot, err := v.CanonicalHeadSlot(ctx)
|
|
if err != nil {
|
|
log.Fatalf("Could not get current canonical head slot: %v", err)
|
|
}
|
|
if err := v.UpdateAssignments(ctx, headSlot); err != nil {
|
|
handleAssignmentError(err, headSlot)
|
|
}
|
|
for {
|
|
ctx, span := trace.StartSpan(ctx, "validator.processSlot")
|
|
|
|
select {
|
|
case <-ctx.Done():
|
|
log.Info("Context canceled, stopping validator")
|
|
return // Exit if context is canceled.
|
|
case slot := <-v.NextSlot():
|
|
span.AddAttributes(trace.Int64Attribute("slot", int64(slot)))
|
|
slotCtx, cancel := context.WithDeadline(ctx, v.SlotDeadline(slot))
|
|
// Report this validator client's rewards and penalties throughout its lifecycle.
|
|
log := log.WithField("slot", slot)
|
|
if err := v.LogValidatorGainsAndLosses(slotCtx, slot); err != nil {
|
|
log.WithError(err).Error("Could not report validator's rewards/penalties")
|
|
}
|
|
|
|
// Keep trying to update assignments if they are nil or if we are past an
|
|
// epoch transition in the beacon node's state.
|
|
if err := v.UpdateAssignments(ctx, slot); err != nil {
|
|
handleAssignmentError(err, slot)
|
|
cancel()
|
|
span.End()
|
|
continue
|
|
}
|
|
|
|
var wg sync.WaitGroup
|
|
for id, role := range v.RolesAt(slot) {
|
|
wg.Add(1)
|
|
go func(role pb.ValidatorRole, id [48]byte) {
|
|
log := log.WithFields(logrus.Fields{
|
|
"pubKey": fmt.Sprintf("%#x", bytesutil.Trunc(id[:])),
|
|
"role": role,
|
|
})
|
|
switch role {
|
|
case pb.ValidatorRole_BOTH:
|
|
go v.AttestToBlockHead(slotCtx, slot, id)
|
|
v.ProposeBlock(slotCtx, slot, id)
|
|
case pb.ValidatorRole_ATTESTER:
|
|
v.AttestToBlockHead(slotCtx, slot, id)
|
|
case pb.ValidatorRole_PROPOSER:
|
|
v.ProposeBlock(slotCtx, slot, id)
|
|
case pb.ValidatorRole_UNKNOWN:
|
|
log.Debug("No active role, doing nothing")
|
|
default:
|
|
log.Warn("Unhandled role")
|
|
}
|
|
|
|
}(role, id)
|
|
}
|
|
// Wait for all processes to complete, then report span complete.
|
|
go func() {
|
|
wg.Wait()
|
|
span.End()
|
|
}()
|
|
}
|
|
}
|
|
}
|
|
|
|
func handleAssignmentError(err error, slot uint64) {
|
|
if errCode, ok := status.FromError(err); ok && errCode.Code() == codes.NotFound {
|
|
log.WithField(
|
|
"epoch", slot/params.BeaconConfig().SlotsPerEpoch,
|
|
).Warn("Validator not yet assigned to epoch")
|
|
} else {
|
|
log.WithField("error", err).Error("Failed to update assignments")
|
|
}
|
|
}
|