github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/cmd/fbchaind/mpt/iavl_clean.go (about)

     1  package mpt
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"path/filepath"
     7  
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server"
     9  	iavlstore "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/iavl"
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/rootmulti"
    11  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    12  	"github.com/fibonacci-chain/fbc/libs/iavl"
    13  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    14  	"github.com/spf13/cobra"
    15  )
    16  
    17  func cleanIavlStoreCmd(ctx *server.Context) *cobra.Command {
    18  	cmd := &cobra.Command{
    19  		Use:   "clean-iavl",
    20  		Short: "clean up migrated iavl store",
    21  		Run: func(cmd *cobra.Command, args []string) {
    22  			log.Println("--------- clean state start ---------")
    23  			clean(ctx)
    24  			log.Println("--------- clean state end ---------")
    25  		},
    26  	}
    27  	return cmd
    28  }
    29  
    30  func clean(ctx *server.Context) {
    31  	dataDir := filepath.Join(ctx.Config.RootDir, "data")
    32  	db, err := sdk.NewDB(applicationDB, dataDir)
    33  	if err != nil {
    34  		panic("fail to open application db: " + err.Error())
    35  	}
    36  
    37  	rs := rootmulti.NewStore(db)
    38  	latestVersion := rs.GetLatestVersion()
    39  
    40  	// 1.clean acc store
    41  	fmt.Println("Start to clean account store")
    42  	if err = deleteIavlStore(db, []byte(iavlAccKey), latestVersion, iavlstore.IavlCacheSize); err != nil {
    43  		fmt.Println("fail to clean iavl store: ", err)
    44  	}
    45  
    46  	// 2.clean evm store
    47  	fmt.Println("Start to clean evm store")
    48  	if err = deleteIavlStore(db, []byte(iavlEvmKey), latestVersion, iavlstore.IavlCacheSize); err != nil {
    49  		fmt.Println("fail to clean iavl store: ", err)
    50  	}
    51  }
    52  
    53  func deleteIavlStore(db dbm.DB, prefix []byte, maxVersion int64, cacheSize int) error {
    54  	if len(prefix) != 0 {
    55  		db = dbm.NewPrefixDB(db, prefix)
    56  	}
    57  
    58  	tree, err := iavl.NewMutableTree(db, cacheSize)
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	// delete verion [from, to)
    64  	return tree.DeleteVersionsRange(0, maxVersion+1, true)
    65  }