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  }