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 = &ethpb.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  }