github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/utils/appstatus/fast_storage.go (about) 1 package appstatus 2 3 import ( 4 "fmt" 5 "math" 6 "path/filepath" 7 8 bam "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/baseapp" 9 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags" 10 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 11 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth" 12 capabilitytypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability/types" 13 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mint" 14 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/params" 15 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply" 16 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/upgrade" 17 "github.com/fibonacci-chain/fbc/libs/iavl" 18 ibctransfertypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer/types" 19 ibchost "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/24-host" 20 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 21 "github.com/fibonacci-chain/fbc/x/ammswap" 22 dex "github.com/fibonacci-chain/fbc/x/dex/types" 23 distr "github.com/fibonacci-chain/fbc/x/distribution" 24 "github.com/fibonacci-chain/fbc/x/erc20" 25 "github.com/fibonacci-chain/fbc/x/evidence" 26 "github.com/fibonacci-chain/fbc/x/evm" 27 "github.com/fibonacci-chain/fbc/x/farm" 28 "github.com/fibonacci-chain/fbc/x/feesplit" 29 "github.com/fibonacci-chain/fbc/x/gov" 30 "github.com/fibonacci-chain/fbc/x/order" 31 "github.com/fibonacci-chain/fbc/x/slashing" 32 staking "github.com/fibonacci-chain/fbc/x/staking/types" 33 token "github.com/fibonacci-chain/fbc/x/token/types" 34 "github.com/spf13/viper" 35 ) 36 37 const ( 38 applicationDB = "application" 39 dbFolder = "data" 40 ) 41 42 func GetAllStoreKeys() []string { 43 return []string{ 44 bam.MainStoreKey, auth.StoreKey, staking.StoreKey, 45 supply.StoreKey, mint.StoreKey, distr.StoreKey, slashing.StoreKey, 46 gov.StoreKey, params.StoreKey, upgrade.StoreKey, evidence.StoreKey, 47 evm.StoreKey, token.StoreKey, token.KeyLock, dex.StoreKey, dex.TokenPairStoreKey, 48 order.OrderStoreKey, ammswap.StoreKey, farm.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey, 49 ibchost.StoreKey, 50 erc20.StoreKey, 51 // mpt.StoreKey, 52 // wasm.StoreKey, 53 feesplit.StoreKey, 54 } 55 } 56 57 func IsFastStorageStrategy() bool { 58 return checkFastStorageStrategy(GetAllStoreKeys()) 59 } 60 61 func checkFastStorageStrategy(storeKeys []string) bool { 62 home := viper.GetString(flags.FlagHome) 63 dataDir := filepath.Join(home, dbFolder) 64 db, err := sdk.NewDB(applicationDB, dataDir) 65 if err != nil { 66 panic(err) 67 } 68 defer db.Close() 69 70 for _, v := range storeKeys { 71 if !isFss(db, v) { 72 return false 73 } 74 } 75 76 return true 77 } 78 79 func isFss(db dbm.DB, storeKey string) bool { 80 prefix := fmt.Sprintf("s/k:%s/", storeKey) 81 prefixDB := dbm.NewPrefixDB(db, []byte(prefix)) 82 83 return iavl.IsFastStorageStrategy(prefixDB) 84 } 85 86 func GetFastStorageVersion() int64 { 87 home := viper.GetString(flags.FlagHome) 88 dataDir := filepath.Join(home, dbFolder) 89 db, err := sdk.NewDB(applicationDB, dataDir) 90 if err != nil { 91 panic(err) 92 } 93 defer db.Close() 94 95 storeKeys := GetAllStoreKeys() 96 var ret int64 = math.MaxInt64 97 for _, v := range storeKeys { 98 version := getVersion(db, v) 99 if version < ret { 100 ret = version 101 } 102 } 103 104 return ret 105 } 106 107 func getVersion(db dbm.DB, storeKey string) int64 { 108 prefix := fmt.Sprintf("s/k:%s/", storeKey) 109 prefixDB := dbm.NewPrefixDB(db, []byte(prefix)) 110 111 version, _ := iavl.GetFastStorageVersion(prefixDB) 112 113 return version 114 }