github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/server/export.go (about) 1 package server 2 3 // DONTCOVER 4 5 import ( 6 "fmt" 7 "io/ioutil" 8 "os" 9 10 tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types" 11 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 12 "github.com/spf13/cobra" 13 "github.com/spf13/viper" 14 15 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags" 16 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 17 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 18 ) 19 20 const ( 21 flagHeight = "height" 22 flagForZeroHeight = "for-zero-height" 23 flagJailWhitelist = "jail-whitelist" 24 FlagEvmExportMode = "evm-export-mode" 25 FlagEvmExportPath = "evm-export-path" 26 ) 27 28 // ExportCmd dumps app state to JSON. 29 func ExportCmd(ctx *Context, cdc *codec.Codec, appExporter AppExporter) *cobra.Command { 30 cmd := &cobra.Command{ 31 Use: "export", 32 Short: "Export state to JSON", 33 RunE: func(cmd *cobra.Command, args []string) error { 34 config := ctx.Config 35 config.SetRoot(viper.GetString(flags.FlagHome)) 36 37 traceWriterFile := viper.GetString(flagTraceStore) 38 39 db, err := openDB(config.RootDir) 40 if err != nil { 41 return err 42 } 43 44 if isEmptyState(db) || appExporter == nil { 45 if _, err := fmt.Fprintln(os.Stderr, "WARNING: State is not initialized. Returning genesis file."); err != nil { 46 return err 47 } 48 49 genesis, err := ioutil.ReadFile(config.GenesisFile()) 50 if err != nil { 51 return err 52 } 53 54 fmt.Println(string(genesis)) 55 return nil 56 } 57 58 traceWriter, err := openTraceWriter(traceWriterFile) 59 if err != nil { 60 return err 61 } 62 63 height := viper.GetInt64(flagHeight) 64 forZeroHeight := viper.GetBool(flagForZeroHeight) 65 jailWhiteList := viper.GetStringSlice(flagJailWhitelist) 66 67 appState, validators, err := appExporter(ctx.Logger, db, traceWriter, height, forZeroHeight, jailWhiteList) 68 if err != nil { 69 return fmt.Errorf("error exporting state: %v", err) 70 } 71 72 doc, err := tmtypes.GenesisDocFromFile(ctx.Config.GenesisFile()) 73 if err != nil { 74 return err 75 } 76 77 doc.AppState = appState 78 doc.Validators = validators 79 80 encoded, err := codec.MarshalJSONIndent(cdc, doc) 81 if err != nil { 82 return err 83 } 84 85 fmt.Println(string(sdk.MustSortJSON(encoded))) 86 return nil 87 }, 88 } 89 90 cmd.Flags().Int64(flagHeight, -1, "Export state from a particular height (-1 means latest height)") 91 cmd.Flags().Bool(flagForZeroHeight, false, "Export state to start at height zero (perform preproccessing)") 92 cmd.Flags().StringSlice(flagJailWhitelist, []string{}, "List of validators to not jail state export") 93 cmd.Flags().String(FlagEvmExportMode, "default", "Select export mode for evm state (default|files|db)") 94 cmd.Flags().String(FlagEvmExportPath, "", "Evm contract & storage db or files used for export") 95 cmd.Flags().Uint64(FlagGoroutineNum, 0, "Limit on the number of goroutines used to export evm data(ignored if evm-export-mode is 'default')") 96 return cmd 97 } 98 99 func isEmptyState(db dbm.DB) bool { 100 return db.Stats()["leveldb.sstables"] == "" 101 }