github.com/onflow/flow-go@v0.33.17/storage/badger/operation/epoch.go (about) 1 package operation 2 3 import ( 4 "errors" 5 6 "github.com/dgraph-io/badger/v2" 7 8 "github.com/onflow/flow-go/model/flow" 9 "github.com/onflow/flow-go/storage" 10 ) 11 12 func InsertEpochSetup(eventID flow.Identifier, event *flow.EpochSetup) func(*badger.Txn) error { 13 return insert(makePrefix(codeEpochSetup, eventID), event) 14 } 15 16 func RetrieveEpochSetup(eventID flow.Identifier, event *flow.EpochSetup) func(*badger.Txn) error { 17 return retrieve(makePrefix(codeEpochSetup, eventID), event) 18 } 19 20 func InsertEpochCommit(eventID flow.Identifier, event *flow.EpochCommit) func(*badger.Txn) error { 21 return insert(makePrefix(codeEpochCommit, eventID), event) 22 } 23 24 func RetrieveEpochCommit(eventID flow.Identifier, event *flow.EpochCommit) func(*badger.Txn) error { 25 return retrieve(makePrefix(codeEpochCommit, eventID), event) 26 } 27 28 func InsertEpochStatus(blockID flow.Identifier, status *flow.EpochStatus) func(*badger.Txn) error { 29 return insert(makePrefix(codeBlockEpochStatus, blockID), status) 30 } 31 32 func RetrieveEpochStatus(blockID flow.Identifier, status *flow.EpochStatus) func(*badger.Txn) error { 33 return retrieve(makePrefix(codeBlockEpochStatus, blockID), status) 34 } 35 36 // SetEpochEmergencyFallbackTriggered sets a flag in the DB indicating that 37 // epoch emergency fallback has been triggered, and the block where it was triggered. 38 // 39 // EECC can be triggered in two ways: 40 // 1. Finalizing the first block past the epoch commitment deadline, when the 41 // next epoch has not yet been committed (see protocol.Params for more detail) 42 // 2. Finalizing a fork in which an invalid service event was incorporated. 43 // 44 // Calling this function multiple times is a no-op and returns no expected errors. 45 func SetEpochEmergencyFallbackTriggered(blockID flow.Identifier) func(txn *badger.Txn) error { 46 return SkipDuplicates(insert(makePrefix(codeEpochEmergencyFallbackTriggered), blockID)) 47 } 48 49 // RetrieveEpochEmergencyFallbackTriggeredBlockID gets the block ID where epoch 50 // emergency was triggered. 51 func RetrieveEpochEmergencyFallbackTriggeredBlockID(blockID *flow.Identifier) func(*badger.Txn) error { 52 return retrieve(makePrefix(codeEpochEmergencyFallbackTriggered), blockID) 53 } 54 55 // CheckEpochEmergencyFallbackTriggered retrieves the value of the flag 56 // indicating whether epoch emergency fallback has been triggered. If the key 57 // is not set, this results in triggered being set to false. 58 func CheckEpochEmergencyFallbackTriggered(triggered *bool) func(*badger.Txn) error { 59 return func(tx *badger.Txn) error { 60 var blockID flow.Identifier 61 err := RetrieveEpochEmergencyFallbackTriggeredBlockID(&blockID)(tx) 62 if errors.Is(err, storage.ErrNotFound) { 63 // flag unset, EECC not triggered 64 *triggered = false 65 return nil 66 } else if err != nil { 67 // storage error, set triggered to zero value 68 *triggered = false 69 return err 70 } 71 // flag is set, EECC triggered 72 *triggered = true 73 return err 74 } 75 }