github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/kv/checkpoint.go (about)

     1  package kv
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  
     7  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
     8  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
     9  	"github.com/prysmaticlabs/prysm/shared/params"
    10  	bolt "go.etcd.io/bbolt"
    11  	"go.opencensus.io/trace"
    12  )
    13  
    14  var errMissingStateForCheckpoint = errors.New("missing state summary for finalized root")
    15  
    16  // JustifiedCheckpoint returns the latest justified checkpoint in beacon chain.
    17  func (s *Store) JustifiedCheckpoint(ctx context.Context) (*ethpb.Checkpoint, error) {
    18  	ctx, span := trace.StartSpan(ctx, "BeaconDB.JustifiedCheckpoint")
    19  	defer span.End()
    20  	var checkpoint *ethpb.Checkpoint
    21  	err := s.db.View(func(tx *bolt.Tx) error {
    22  		bkt := tx.Bucket(checkpointBucket)
    23  		enc := bkt.Get(justifiedCheckpointKey)
    24  		if enc == nil {
    25  			checkpoint = &ethpb.Checkpoint{Root: params.BeaconConfig().ZeroHash[:]}
    26  			return nil
    27  		}
    28  		checkpoint = &ethpb.Checkpoint{}
    29  		return decode(ctx, enc, checkpoint)
    30  	})
    31  	return checkpoint, err
    32  }
    33  
    34  // FinalizedCheckpoint returns the latest finalized checkpoint in beacon chain.
    35  func (s *Store) FinalizedCheckpoint(ctx context.Context) (*ethpb.Checkpoint, error) {
    36  	ctx, span := trace.StartSpan(ctx, "BeaconDB.FinalizedCheckpoint")
    37  	defer span.End()
    38  	var checkpoint *ethpb.Checkpoint
    39  	err := s.db.View(func(tx *bolt.Tx) error {
    40  		bkt := tx.Bucket(checkpointBucket)
    41  		enc := bkt.Get(finalizedCheckpointKey)
    42  		if enc == nil {
    43  			checkpoint = &ethpb.Checkpoint{Root: params.BeaconConfig().ZeroHash[:]}
    44  			return nil
    45  		}
    46  		checkpoint = &ethpb.Checkpoint{}
    47  		return decode(ctx, enc, checkpoint)
    48  	})
    49  	return checkpoint, err
    50  }
    51  
    52  // SaveJustifiedCheckpoint saves justified checkpoint in beacon chain.
    53  func (s *Store) SaveJustifiedCheckpoint(ctx context.Context, checkpoint *ethpb.Checkpoint) error {
    54  	ctx, span := trace.StartSpan(ctx, "BeaconDB.SaveJustifiedCheckpoint")
    55  	defer span.End()
    56  
    57  	enc, err := encode(ctx, checkpoint)
    58  	if err != nil {
    59  		return err
    60  	}
    61  	return s.db.Update(func(tx *bolt.Tx) error {
    62  		bucket := tx.Bucket(checkpointBucket)
    63  		hasStateSummaryInDB := s.HasStateSummary(ctx, bytesutil.ToBytes32(checkpoint.Root))
    64  		hasStateInDB := tx.Bucket(stateBucket).Get(checkpoint.Root) != nil
    65  		if !(hasStateInDB || hasStateSummaryInDB) {
    66  			return errMissingStateForCheckpoint
    67  		}
    68  		return bucket.Put(justifiedCheckpointKey, enc)
    69  	})
    70  }
    71  
    72  // SaveFinalizedCheckpoint saves finalized checkpoint in beacon chain.
    73  func (s *Store) SaveFinalizedCheckpoint(ctx context.Context, checkpoint *ethpb.Checkpoint) error {
    74  	ctx, span := trace.StartSpan(ctx, "BeaconDB.SaveFinalizedCheckpoint")
    75  	defer span.End()
    76  
    77  	enc, err := encode(ctx, checkpoint)
    78  	if err != nil {
    79  		return err
    80  	}
    81  	return s.db.Update(func(tx *bolt.Tx) error {
    82  		bucket := tx.Bucket(checkpointBucket)
    83  		hasStateSummaryInDB := s.HasStateSummary(ctx, bytesutil.ToBytes32(checkpoint.Root))
    84  		hasStateInDB := tx.Bucket(stateBucket).Get(checkpoint.Root) != nil
    85  		if !(hasStateInDB || hasStateSummaryInDB) {
    86  			return errMissingStateForCheckpoint
    87  		}
    88  		if err := bucket.Put(finalizedCheckpointKey, enc); err != nil {
    89  			return err
    90  		}
    91  
    92  		return s.updateFinalizedBlockRoots(ctx, tx, checkpoint)
    93  	})
    94  }