github.com/ava-labs/avalanchego@v1.11.11/vms/proposervm/state/chain_state.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package state 5 6 import ( 7 "github.com/ava-labs/avalanchego/database" 8 "github.com/ava-labs/avalanchego/ids" 9 ) 10 11 const ( 12 lastAcceptedByte byte = iota 13 ) 14 15 var ( 16 lastAcceptedKey = []byte{lastAcceptedByte} 17 18 _ ChainState = (*chainState)(nil) 19 ) 20 21 type ChainState interface { 22 SetLastAccepted(blkID ids.ID) error 23 DeleteLastAccepted() error 24 GetLastAccepted() (ids.ID, error) 25 } 26 27 type chainState struct { 28 lastAccepted ids.ID 29 db database.Database 30 } 31 32 func NewChainState(db database.Database) ChainState { 33 return &chainState{db: db} 34 } 35 36 func (s *chainState) SetLastAccepted(blkID ids.ID) error { 37 if s.lastAccepted == blkID { 38 return nil 39 } 40 s.lastAccepted = blkID 41 return s.db.Put(lastAcceptedKey, blkID[:]) 42 } 43 44 func (s *chainState) DeleteLastAccepted() error { 45 s.lastAccepted = ids.Empty 46 return s.db.Delete(lastAcceptedKey) 47 } 48 49 func (s *chainState) GetLastAccepted() (ids.ID, error) { 50 if s.lastAccepted != ids.Empty { 51 return s.lastAccepted, nil 52 } 53 lastAcceptedBytes, err := s.db.Get(lastAcceptedKey) 54 if err != nil { 55 return ids.Empty, err 56 } 57 lastAccepted, err := ids.ToID(lastAcceptedBytes) 58 if err != nil { 59 return ids.Empty, err 60 } 61 s.lastAccepted = lastAccepted 62 return lastAccepted, nil 63 }