github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/state/cluster/badger/translator.go (about) 1 package badger 2 3 import ( 4 "fmt" 5 6 "github.com/onflow/flow-go/model/flow" 7 "github.com/onflow/flow-go/state/protocol" 8 "github.com/onflow/flow-go/storage" 9 ) 10 11 // Translator is a translation layer that determines the reference block on 12 // the main chain for a given cluster block, using the reference block from 13 // the cluster block's payload. 14 type Translator struct { 15 payloads storage.ClusterPayloads 16 state protocol.State 17 } 18 19 // NewTranslator returns a new block ID translator. 20 func NewTranslator(payloads storage.ClusterPayloads, state protocol.State) *Translator { 21 translator := &Translator{ 22 payloads: payloads, 23 state: state, 24 } 25 return translator 26 } 27 28 // Translate retrieves the reference main-chain block ID for the given cluster 29 // block ID. 30 func (t *Translator) Translate(blockID flow.Identifier) (flow.Identifier, error) { 31 32 payload, err := t.payloads.ByBlockID(blockID) 33 if err != nil { 34 return flow.ZeroID, fmt.Errorf("could not retrieve reference block payload: %w", err) 35 } 36 37 // if a reference block is specified, use that 38 if payload.ReferenceBlockID != flow.ZeroID { 39 return payload.ReferenceBlockID, nil 40 } 41 42 // otherwise, we are dealing with a root block, and must retrieve the 43 // reference block by epoch number 44 //TODO this returns the latest block in the epoch, thus will take slashing 45 // into account. We don't slash yet, so this is OK short-term. 46 // We should change the API boundaries a bit here, so this chain-aware 47 // translation changes to be f(blockID) -> IdentityList rather than 48 // f(blockID) -> blockID. 49 // REF: https://github.com/dapperlabs/flow-go/issues/4655 50 head, err := t.state.Final().Head() 51 if err != nil { 52 return flow.ZeroID, fmt.Errorf("could not retrieve block: %w", err) 53 } 54 return head.ID(), nil 55 }