github.com/MetalBlockchain/metalgo@v1.11.9/snow/engine/common/tracker/accepted.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package tracker 5 6 import ( 7 "sync" 8 9 "github.com/MetalBlockchain/metalgo/ids" 10 "github.com/MetalBlockchain/metalgo/snow/validators" 11 "github.com/MetalBlockchain/metalgo/utils/crypto/bls" 12 "github.com/MetalBlockchain/metalgo/utils/set" 13 ) 14 15 var _ Accepted = (*accepted)(nil) 16 17 type Accepted interface { 18 validators.SetCallbackListener 19 20 // SetLastAccepted updates the latest accepted block for [nodeID] to 21 // [blockID]. If [nodeID] is not currently a validator, this is a noop. 22 SetLastAccepted(nodeID ids.NodeID, blockID ids.ID) 23 // LastAccepted returns the latest known accepted block of [nodeID]. If 24 // [nodeID]'s last accepted block was never unknown, false will be returned. 25 LastAccepted(nodeID ids.NodeID) (ids.ID, bool) 26 } 27 28 type accepted struct { 29 lock sync.RWMutex 30 validators set.Set[ids.NodeID] 31 frontier map[ids.NodeID]ids.ID 32 } 33 34 func NewAccepted() Accepted { 35 return &accepted{ 36 frontier: make(map[ids.NodeID]ids.ID), 37 } 38 } 39 40 func (a *accepted) OnValidatorAdded(nodeID ids.NodeID, _ *bls.PublicKey, _ ids.ID, _ uint64) { 41 a.lock.Lock() 42 defer a.lock.Unlock() 43 44 a.validators.Add(nodeID) 45 } 46 47 func (a *accepted) OnValidatorRemoved(nodeID ids.NodeID, _ uint64) { 48 a.lock.Lock() 49 defer a.lock.Unlock() 50 51 a.validators.Remove(nodeID) 52 delete(a.frontier, nodeID) 53 } 54 55 func (*accepted) OnValidatorWeightChanged(_ ids.NodeID, _, _ uint64) {} 56 57 func (a *accepted) SetLastAccepted(nodeID ids.NodeID, frontier ids.ID) { 58 a.lock.Lock() 59 defer a.lock.Unlock() 60 61 if a.validators.Contains(nodeID) { 62 a.frontier[nodeID] = frontier 63 } 64 } 65 66 func (a *accepted) LastAccepted(nodeID ids.NodeID) (ids.ID, bool) { 67 a.lock.RLock() 68 defer a.lock.RUnlock() 69 70 acceptedID, ok := a.frontier[nodeID] 71 return acceptedID, ok 72 }