mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-31 23:41:22 +00:00
37cba662f1
* toggle flags * Merge branch 'master' of github.com:prysmaticlabs/prysm * Merge branch 'master' of github.com:prysmaticlabs/prysm * run gofmt * Merge branch 'master' into lint-repo
88 lines
2.4 KiB
Go
88 lines
2.4 KiB
Go
package cache
|
|
|
|
import (
|
|
"sync"
|
|
|
|
lru "github.com/hashicorp/golang-lru"
|
|
"github.com/prysmaticlabs/prysm/shared/params"
|
|
"github.com/prysmaticlabs/prysm/shared/sliceutil"
|
|
)
|
|
|
|
type committeeIDs struct {
|
|
attester *lru.Cache
|
|
attesterLock sync.RWMutex
|
|
aggregator *lru.Cache
|
|
aggregatorLock sync.RWMutex
|
|
}
|
|
|
|
// CommitteeIDs for attester and aggregator.
|
|
var CommitteeIDs = newCommitteeIDs()
|
|
|
|
func newCommitteeIDs() *committeeIDs {
|
|
// Given a node can calculate committee assignments of current epoch and next epoch.
|
|
// Max size is set to 2 epoch length.
|
|
cacheSize := int(params.BeaconConfig().MaxCommitteesPerSlot * params.BeaconConfig().SlotsPerEpoch * 2)
|
|
attesterCache, err := lru.New(cacheSize)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
aggregatorCache, err := lru.New(cacheSize)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return &committeeIDs{attester: attesterCache, aggregator: aggregatorCache}
|
|
}
|
|
|
|
// AddAttesterCommiteeID adds committee ID for subscribing subnet for the attester of a given slot.
|
|
func (c *committeeIDs) AddAttesterCommiteeID(slot uint64, committeeID uint64) {
|
|
c.attesterLock.Lock()
|
|
defer c.attesterLock.Unlock()
|
|
|
|
ids := []uint64{committeeID}
|
|
val, exists := c.attester.Get(slot)
|
|
if exists {
|
|
ids = sliceutil.UnionUint64(append(val.([]uint64), ids...))
|
|
}
|
|
c.attester.Add(slot, ids)
|
|
}
|
|
|
|
// GetAttesterCommitteeIDs gets the committee ID for subscribing subnet for attester of the slot.
|
|
func (c *committeeIDs) GetAttesterCommitteeIDs(slot uint64) []uint64 {
|
|
c.attesterLock.RLock()
|
|
defer c.attesterLock.RUnlock()
|
|
|
|
val, exists := c.attester.Get(slot)
|
|
if !exists {
|
|
return nil
|
|
}
|
|
if v, ok := val.([]uint64); ok {
|
|
return v
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// AddAggregatorCommiteeID adds committee ID for subscribing subnet for the aggregator of a given slot.
|
|
func (c *committeeIDs) AddAggregatorCommiteeID(slot uint64, committeeID uint64) {
|
|
c.aggregatorLock.Lock()
|
|
defer c.aggregatorLock.Unlock()
|
|
|
|
ids := []uint64{committeeID}
|
|
val, exists := c.aggregator.Get(slot)
|
|
if exists {
|
|
ids = sliceutil.UnionUint64(append(val.([]uint64), ids...))
|
|
}
|
|
c.aggregator.Add(slot, ids)
|
|
}
|
|
|
|
// GetAggregatorCommitteeIDs gets the committee ID for subscribing subnet for aggregator of the slot.
|
|
func (c *committeeIDs) GetAggregatorCommitteeIDs(slot uint64) []uint64 {
|
|
c.aggregatorLock.RLock()
|
|
defer c.aggregatorLock.RUnlock()
|
|
|
|
val, exists := c.aggregator.Get(slot)
|
|
if !exists {
|
|
return []uint64{}
|
|
}
|
|
return val.([]uint64)
|
|
}
|