@@ -46,6 +46,9 @@ type Datastore struct {
4646 knownValidatorsIsUpdating uberatomic.Bool
4747 knownValidatorsLastSlot uberatomic.Uint64
4848
49+ validatorRegistrations map [common.PubkeyHex ]builderApiV1.ValidatorRegistration
50+ validatorRegistrationLock sync.RWMutex
51+
4952 // Used for proposer-API readiness check
5053 KnownValidatorsWasUpdated uberatomic.Bool
5154}
@@ -55,6 +58,7 @@ func NewDatastore(redisCache *RedisCache, memcached *Memcached, db database.IDat
5558 db : db ,
5659 memcached : memcached ,
5760 redis : redisCache ,
61+ validatorRegistrations : make (map [common.PubkeyHex ]builderApiV1.ValidatorRegistration ),
5862 knownValidatorsByPubkey : make (map [common.PubkeyHex ]uint64 ),
5963 knownValidatorsByIndex : make (map [uint64 ]common.PubkeyHex ),
6064 }
@@ -184,14 +188,47 @@ func (ds *Datastore) SetKnownValidator(pubkeyHex common.PubkeyHex, index uint64)
184188 ds .knownValidatorsByIndex [index ] = pubkeyHex
185189}
186190
187- // SaveValidatorRegistration saves a validator registration into both Redis and the database
191+ // GetCachedValidatorRegistration returns a validator registration from local cache or Redis
192+ // If not found, it returns (nil, nil)
193+ func (ds * Datastore ) GetCachedValidatorRegistration (proposerPubkey common.PubkeyHex ) (* builderApiV1.ValidatorRegistration , error ) {
194+ var err error
195+
196+ // acquire read lock and read
197+ ds .validatorRegistrationLock .RLock ()
198+ cachedRegistration , foundInLocalCache := ds .validatorRegistrations [proposerPubkey ]
199+ ds .validatorRegistrationLock .RUnlock ()
200+ if foundInLocalCache {
201+ return & cachedRegistration , nil
202+ }
203+
204+ // if not, try to get it from Redis
205+ cachedRegistrationData , err := ds .redis .GetValidatorRegistrationData (proposerPubkey )
206+ if err == nil && cachedRegistrationData != nil {
207+ // save in local cache
208+ ds .saveValidatorRegistrationInLocalCache (* cachedRegistrationData )
209+ }
210+ return cachedRegistrationData , err
211+ }
212+
213+ func (ds * Datastore ) saveValidatorRegistrationInLocalCache (entry builderApiV1.ValidatorRegistration ) {
214+ ds .validatorRegistrationLock .Lock ()
215+ ds .validatorRegistrations [common .NewPubkeyHex (entry .Pubkey .String ())] = entry
216+ ds .validatorRegistrationLock .Unlock ()
217+ }
218+
219+ // SaveValidatorRegistration saves a validator registration into local cache, Redis and the database
220+ // Note that this function is called synchronously, so no need to lock the cache
188221func (ds * Datastore ) SaveValidatorRegistration (entry builderApiV1.SignedValidatorRegistration ) error {
189- // First save in the database
222+ // Save in local cache
223+ ds .saveValidatorRegistrationInLocalCache (* entry .Message )
224+
225+ // Save in the database
190226 err := ds .db .SaveValidatorRegistration (database .SignedValidatorRegistrationToEntry (entry ))
191227 if err != nil {
192228 return errors .Wrap (err , "failed saving validator registration to database" )
193229 }
194230
231+ // Save in Redis
195232 err = ds .redis .SetValidatorRegistrationData (entry .Message )
196233 if err != nil {
197234 return errors .Wrap (err , "failed saving validator registration to redis" )
0 commit comments