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  }