github.com/prysmaticlabs/prysm@v1.4.4/slasher/db/kv/chain_data.go (about) 1 package kv 2 3 import ( 4 "context" 5 6 "github.com/pkg/errors" 7 ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 8 bolt "go.etcd.io/bbolt" 9 "go.opencensus.io/trace" 10 "google.golang.org/protobuf/proto" 11 ) 12 13 // ChainHead retrieves the persisted chain head from the database accordingly. 14 func (s *Store) ChainHead(ctx context.Context) (*ethpb.ChainHead, error) { 15 ctx, span := trace.StartSpan(ctx, "slasherDB.ChainHead") 16 defer span.End() 17 var res *ethpb.ChainHead 18 if err := s.update(func(tx *bolt.Tx) error { 19 bucket := tx.Bucket(chainDataBucket) 20 enc := bucket.Get([]byte(chainHeadKey)) 21 if enc == nil { 22 return nil 23 } 24 res = ðpb.ChainHead{} 25 return proto.Unmarshal(enc, res) 26 }); err != nil { 27 return nil, err 28 } 29 return res, nil 30 } 31 32 // SaveChainHead accepts a beacon chain head object and persists it to the DB. 33 func (s *Store) SaveChainHead(ctx context.Context, head *ethpb.ChainHead) error { 34 ctx, span := trace.StartSpan(ctx, "slasherDB.SaveChainHead") 35 defer span.End() 36 enc, err := proto.Marshal(head) 37 if err != nil { 38 return errors.Wrap(err, "failed to encode chain head") 39 } 40 return s.update(func(tx *bolt.Tx) error { 41 bucket := tx.Bucket(chainDataBucket) 42 if err := bucket.Put([]byte(chainHeadKey), enc); err != nil { 43 return errors.Wrap(err, "failed to save chain head to s") 44 } 45 return err 46 }) 47 }