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  }