github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/operations/attestations/kv/seen_bits.go (about) 1 package kv 2 3 import ( 4 "github.com/patrickmn/go-cache" 5 "github.com/pkg/errors" 6 "github.com/prysmaticlabs/go-bitfield" 7 ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 8 ) 9 10 func (c *AttCaches) insertSeenBit(att *ethpb.Attestation) error { 11 r, err := hashFn(att.Data) 12 if err != nil { 13 return err 14 } 15 16 v, ok := c.seenAtt.Get(string(r[:])) 17 if ok { 18 seenBits, ok := v.([]bitfield.Bitlist) 19 if !ok { 20 return errors.New("could not convert to bitlist type") 21 } 22 alreadyExists := false 23 for _, bit := range seenBits { 24 if c, err := bit.Contains(att.AggregationBits); err != nil { 25 return err 26 } else if c { 27 alreadyExists = true 28 break 29 } 30 } 31 if !alreadyExists { 32 seenBits = append(seenBits, att.AggregationBits) 33 } 34 c.seenAtt.Set(string(r[:]), seenBits, cache.DefaultExpiration /* one epoch */) 35 return nil 36 } 37 38 c.seenAtt.Set(string(r[:]), []bitfield.Bitlist{att.AggregationBits}, cache.DefaultExpiration /* one epoch */) 39 return nil 40 } 41 42 func (c *AttCaches) hasSeenBit(att *ethpb.Attestation) (bool, error) { 43 r, err := hashFn(att.Data) 44 if err != nil { 45 return false, err 46 } 47 48 v, ok := c.seenAtt.Get(string(r[:])) 49 if ok { 50 seenBits, ok := v.([]bitfield.Bitlist) 51 if !ok { 52 return false, errors.New("could not convert to bitlist type") 53 } 54 for _, bit := range seenBits { 55 if c, err := bit.Contains(att.AggregationBits); err != nil { 56 return false, err 57 } else if c { 58 return true, nil 59 } 60 } 61 } 62 return false, nil 63 }