github.com/cosmos/cosmos-sdk@v0.50.10/server/export.go (about) 1 package server 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "io" 8 "os" 9 10 "github.com/spf13/cobra" 11 12 "github.com/cosmos/cosmos-sdk/client/flags" 13 "github.com/cosmos/cosmos-sdk/server/types" 14 "github.com/cosmos/cosmos-sdk/version" 15 genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" 16 ) 17 18 const ( 19 FlagHeight = "height" 20 FlagForZeroHeight = "for-zero-height" 21 FlagJailAllowedAddrs = "jail-allowed-addrs" 22 FlagModulesToExport = "modules-to-export" 23 ) 24 25 // ExportCmd dumps app state to JSON. 26 func ExportCmd(appExporter types.AppExporter, defaultNodeHome string) *cobra.Command { 27 cmd := &cobra.Command{ 28 Use: "export", 29 Short: "Export state to JSON", 30 Args: cobra.NoArgs, 31 RunE: func(cmd *cobra.Command, _ []string) error { 32 serverCtx := GetServerContextFromCmd(cmd) 33 config := serverCtx.Config 34 35 homeDir, _ := cmd.Flags().GetString(flags.FlagHome) 36 config.SetRoot(homeDir) 37 38 if _, err := os.Stat(config.GenesisFile()); os.IsNotExist(err) { 39 return err 40 } 41 42 db, err := openDB(config.RootDir, GetAppDBBackend(serverCtx.Viper)) 43 if err != nil { 44 return err 45 } 46 47 if appExporter == nil { 48 if _, err := fmt.Fprintln(cmd.ErrOrStderr(), "WARNING: App exporter not defined. Returning genesis file."); err != nil { 49 return err 50 } 51 52 // Open file in read-only mode so we can copy it to stdout. 53 // It is possible that the genesis file is large, 54 // so we don't need to read it all into memory 55 // before we stream it out. 56 f, err := os.OpenFile(config.GenesisFile(), os.O_RDONLY, 0) 57 if err != nil { 58 return err 59 } 60 defer f.Close() 61 62 if _, err := io.Copy(cmd.OutOrStdout(), f); err != nil { 63 return err 64 } 65 66 return nil 67 } 68 69 traceWriterFile, _ := cmd.Flags().GetString(flagTraceStore) 70 traceWriter, err := openTraceWriter(traceWriterFile) 71 if err != nil { 72 return err 73 } 74 75 height, _ := cmd.Flags().GetInt64(FlagHeight) 76 forZeroHeight, _ := cmd.Flags().GetBool(FlagForZeroHeight) 77 jailAllowedAddrs, _ := cmd.Flags().GetStringSlice(FlagJailAllowedAddrs) 78 modulesToExport, _ := cmd.Flags().GetStringSlice(FlagModulesToExport) 79 outputDocument, _ := cmd.Flags().GetString(flags.FlagOutputDocument) 80 81 exported, err := appExporter(serverCtx.Logger, db, traceWriter, height, forZeroHeight, jailAllowedAddrs, serverCtx.Viper, modulesToExport) 82 if err != nil { 83 return fmt.Errorf("error exporting state: %w", err) 84 } 85 86 appGenesis, err := genutiltypes.AppGenesisFromFile(serverCtx.Config.GenesisFile()) 87 if err != nil { 88 return err 89 } 90 91 // set current binary version 92 appGenesis.AppName = version.AppName 93 appGenesis.AppVersion = version.Version 94 95 appGenesis.AppState = exported.AppState 96 appGenesis.InitialHeight = exported.Height 97 appGenesis.Consensus = genutiltypes.NewConsensusGenesis(exported.ConsensusParams, exported.Validators) 98 99 out, err := json.Marshal(appGenesis) 100 if err != nil { 101 return err 102 } 103 104 if outputDocument == "" { 105 // Copy the entire genesis file to stdout. 106 _, err := io.Copy(cmd.OutOrStdout(), bytes.NewReader(out)) 107 return err 108 } 109 110 if err = appGenesis.SaveAs(outputDocument); err != nil { 111 return err 112 } 113 114 return nil 115 }, 116 } 117 118 cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") 119 cmd.Flags().Int64(FlagHeight, -1, "Export state from a particular height (-1 means latest height)") 120 cmd.Flags().Bool(FlagForZeroHeight, false, "Export state to start at height zero (perform preproccessing)") 121 cmd.Flags().StringSlice(FlagJailAllowedAddrs, []string{}, "Comma-separated list of operator addresses of jailed validators to unjail") 122 cmd.Flags().StringSlice(FlagModulesToExport, []string{}, "Comma-separated list of modules to export. If empty, will export all modules") 123 cmd.Flags().String(flags.FlagOutputDocument, "", "Exported state is written to the given file instead of STDOUT") 124 125 return cmd 126 }