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 }