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 = ðpb.Checkpoint{Root: params.BeaconConfig().ZeroHash[:]} 26 return nil 27 } 28 checkpoint = ðpb.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 = ðpb.Checkpoint{Root: params.BeaconConfig().ZeroHash[:]} 44 return nil 45 } 46 checkpoint = ðpb.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 }