mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 21:38:05 -05:00
Compare commits
12 Commits
peerDAS
...
tracked-va
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45d2219cf5 | ||
|
|
660b4d7678 | ||
|
|
b3f0194a79 | ||
|
|
421f7a75e0 | ||
|
|
b6965f0174 | ||
|
|
b98e9c510e | ||
|
|
d4017743d3 | ||
|
|
c85a23251c | ||
|
|
0a6457fc3a | ||
|
|
f3458a3f4a | ||
|
|
8da7bdeaa6 | ||
|
|
74b07cf48c |
@@ -24,6 +24,7 @@ The format is based on Keep a Changelog, and this project adheres to Semantic Ve
|
||||
- Added GetAggregatedAttestationV2 endpoint.
|
||||
- Added SubmitAttestationsV2 endpoint.
|
||||
- Validator REST mode Electra block support
|
||||
- Metric for the size of tracked validators cache
|
||||
|
||||
### Changed
|
||||
|
||||
|
||||
72
beacon-chain/cache/tracked_validators.go
vendored
72
beacon-chain/cache/tracked_validators.go
vendored
@@ -2,19 +2,28 @@ package cache
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prysmaticlabs/prysm/v5/config/params"
|
||||
"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives"
|
||||
)
|
||||
|
||||
var validatorInactivityThreshold = 5 // 5 epochs
|
||||
|
||||
type TrackedValidator struct {
|
||||
Active bool
|
||||
FeeRecipient primitives.ExecutionAddress
|
||||
Index primitives.ValidatorIndex
|
||||
LastUpdated time.Time
|
||||
}
|
||||
|
||||
type TrackedValidatorsCache struct {
|
||||
sync.Mutex
|
||||
trackedValidators map[primitives.ValidatorIndex]TrackedValidator
|
||||
sync.RWMutex
|
||||
trackedValidators map[primitives.ValidatorIndex]TrackedValidator
|
||||
trackedValidatorsNum uint64
|
||||
trackedValidatorsNumLastUpdated uint64
|
||||
trackedValidatorsMetric prometheus.GaugeFunc
|
||||
}
|
||||
|
||||
func NewTrackedValidatorsCache() *TrackedValidatorsCache {
|
||||
@@ -24,8 +33,8 @@ func NewTrackedValidatorsCache() *TrackedValidatorsCache {
|
||||
}
|
||||
|
||||
func (t *TrackedValidatorsCache) Validator(index primitives.ValidatorIndex) (TrackedValidator, bool) {
|
||||
t.Lock()
|
||||
defer t.Unlock()
|
||||
t.RLock()
|
||||
defer t.RUnlock()
|
||||
val, ok := t.trackedValidators[index]
|
||||
return val, ok
|
||||
}
|
||||
@@ -34,6 +43,32 @@ func (t *TrackedValidatorsCache) Set(val TrackedValidator) {
|
||||
t.Lock()
|
||||
defer t.Unlock()
|
||||
t.trackedValidators[val.Index] = val
|
||||
t.updateTackedValidatorsNum()
|
||||
}
|
||||
|
||||
func (t *TrackedValidatorsCache) updateTackedValidatorsNum() {
|
||||
epochTime := uint64(params.BeaconConfig().SlotsPerEpoch) * params.BeaconConfig().SecondsPerSlot
|
||||
if t.trackedValidatorsNumLastUpdated != 0 && t.trackedValidatorsNumLastUpdated+epochTime < uint64(time.Now().Unix()) {
|
||||
// too early to update again
|
||||
return
|
||||
}
|
||||
num := 0
|
||||
for _, value := range t.trackedValidators {
|
||||
if value.LastUpdated.Unix()+int64(validatorInactivityThreshold)*int64(epochTime) < time.Now().Unix() {
|
||||
// validator expired
|
||||
// TODO: should we prune?
|
||||
continue
|
||||
}
|
||||
num++
|
||||
}
|
||||
t.trackedValidatorsNum = uint64(num)
|
||||
t.trackedValidatorsNumLastUpdated = uint64(time.Now().Unix())
|
||||
}
|
||||
|
||||
func (t *TrackedValidatorsCache) GetTrackedValidatorsNum() uint64 {
|
||||
t.RLock()
|
||||
defer t.RUnlock()
|
||||
return t.trackedValidatorsNum
|
||||
}
|
||||
|
||||
func (t *TrackedValidatorsCache) Prune() {
|
||||
@@ -43,7 +78,32 @@ func (t *TrackedValidatorsCache) Prune() {
|
||||
}
|
||||
|
||||
func (t *TrackedValidatorsCache) Validating() bool {
|
||||
t.Lock()
|
||||
defer t.Unlock()
|
||||
t.RLock()
|
||||
defer t.RUnlock()
|
||||
return len(t.trackedValidators) > 0
|
||||
}
|
||||
|
||||
func (t *TrackedValidatorsCache) Size() int {
|
||||
t.RLock()
|
||||
defer t.RUnlock()
|
||||
return len(t.trackedValidators)
|
||||
}
|
||||
|
||||
func (t *TrackedValidatorsCache) RegisterTrackedValidatorMetric() error {
|
||||
t.Lock()
|
||||
defer t.Unlock()
|
||||
t.trackedValidatorsMetric = prometheus.NewGaugeFunc(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "tracked_validator_count",
|
||||
Help: "The total number of validators tracked by trackedValidatorsCache in the beacon node. This is updated at intervals via the push proposer settings API endpoint.",
|
||||
},
|
||||
func() float64 { return float64(t.GetTrackedValidatorsNum()) },
|
||||
)
|
||||
return prometheus.Register(t.trackedValidatorsMetric)
|
||||
}
|
||||
|
||||
func (t *TrackedValidatorsCache) UnregisterTrackedValidatorMetric() {
|
||||
t.RLock()
|
||||
defer t.RUnlock()
|
||||
prometheus.Unregister(t.trackedValidatorsMetric)
|
||||
}
|
||||
|
||||
@@ -217,7 +217,9 @@ func New(cliCtx *cli.Context, cancel context.CancelFunc, opts ...Option) (*Beaco
|
||||
return nil, err
|
||||
}
|
||||
beacon.collector = c
|
||||
|
||||
if err := beacon.trackedValidatorsCache.RegisterTrackedValidatorMetric(); err != nil {
|
||||
return nil, errors.Wrap(err, "unable to register tracked validator metric")
|
||||
}
|
||||
// Do not store the finalized state as it has been provided to the respective services during
|
||||
// their initialization.
|
||||
beacon.finalizedStateAtStartUp = nil
|
||||
@@ -457,6 +459,7 @@ func (b *BeaconNode) Close() {
|
||||
log.WithError(err).Error("Failed to close database")
|
||||
}
|
||||
b.collector.unregister()
|
||||
b.trackedValidatorsCache.UnregisterTrackedValidatorMetric()
|
||||
b.cancel()
|
||||
close(b.stop)
|
||||
}
|
||||
|
||||
@@ -761,6 +761,7 @@ func (s *Server) PrepareBeaconProposer(w http.ResponseWriter, r *http.Request) {
|
||||
Active: true, // TODO: either check or add the field in the request
|
||||
Index: primitives.ValidatorIndex(validatorIndex),
|
||||
FeeRecipient: feeRecipient,
|
||||
LastUpdated: time.Now().UTC(),
|
||||
}
|
||||
s.TrackedValidatorsCache.Set(val)
|
||||
validatorIndices = append(validatorIndices, primitives.ValidatorIndex(validatorIndex))
|
||||
|
||||
@@ -33,6 +33,7 @@ go_library(
|
||||
importpath = "github.com/prysmaticlabs/prysm/v5/beacon-chain/rpc/prysm/v1alpha1/validator",
|
||||
visibility = ["//beacon-chain:__subpackages__"],
|
||||
deps = [
|
||||
"//api:go_default_library",
|
||||
"//api/client/builder:go_default_library",
|
||||
"//async/event:go_default_library",
|
||||
"//beacon-chain/blockchain:go_default_library",
|
||||
|
||||
Reference in New Issue
Block a user