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  }