github.com/Finschia/finschia-sdk@v0.48.1/server/export.go (about)

     1  package server
     2  
     3  // DONTCOVER
     4  
     5  import (
     6  	"fmt"
     7  	"os"
     8  
     9  	ostjson "github.com/Finschia/ostracon/libs/json"
    10  	octypes "github.com/Finschia/ostracon/types"
    11  	"github.com/spf13/cobra"
    12  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
    13  
    14  	"github.com/Finschia/finschia-sdk/client/flags"
    15  	"github.com/Finschia/finschia-sdk/server/types"
    16  	sdk "github.com/Finschia/finschia-sdk/types"
    17  )
    18  
    19  const (
    20  	FlagHeight           = "height"
    21  	FlagForZeroHeight    = "for-zero-height"
    22  	FlagJailAllowedAddrs = "jail-allowed-addrs"
    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  		RunE: func(cmd *cobra.Command, args []string) error {
    31  			serverCtx := GetServerContextFromCmd(cmd)
    32  			config := serverCtx.Config
    33  
    34  			homeDir, _ := cmd.Flags().GetString(flags.FlagHome)
    35  			config.SetRoot(homeDir)
    36  
    37  			if _, err := os.Stat(config.GenesisFile()); os.IsNotExist(err) {
    38  				return err
    39  			}
    40  
    41  			db, err := openDB(config.RootDir)
    42  			if err != nil {
    43  				return err
    44  			}
    45  
    46  			if appExporter == nil {
    47  				if _, err := fmt.Fprintln(os.Stderr, "WARNING: App exporter not defined. Returning genesis file."); err != nil {
    48  					return err
    49  				}
    50  
    51  				genesis, err := os.ReadFile(config.GenesisFile())
    52  				if err != nil {
    53  					return err
    54  				}
    55  
    56  				fmt.Println(string(genesis))
    57  				return nil
    58  			}
    59  
    60  			traceWriterFile, _ := cmd.Flags().GetString(flagTraceStore)
    61  			traceWriter, err := openTraceWriter(traceWriterFile)
    62  			if err != nil {
    63  				return err
    64  			}
    65  
    66  			height, _ := cmd.Flags().GetInt64(FlagHeight)
    67  			forZeroHeight, _ := cmd.Flags().GetBool(FlagForZeroHeight)
    68  			jailAllowedAddrs, _ := cmd.Flags().GetStringSlice(FlagJailAllowedAddrs)
    69  
    70  			exported, err := appExporter(serverCtx.Logger, db, traceWriter, height, forZeroHeight, jailAllowedAddrs, serverCtx.Viper)
    71  			if err != nil {
    72  				return fmt.Errorf("error exporting state: %v", err)
    73  			}
    74  
    75  			doc, err := octypes.GenesisDocFromFile(serverCtx.Config.GenesisFile())
    76  			if err != nil {
    77  				return err
    78  			}
    79  
    80  			doc.AppState = exported.AppState
    81  			doc.Validators = exported.Validators
    82  			doc.InitialHeight = exported.Height
    83  			doc.ConsensusParams = &tmproto.ConsensusParams{
    84  				Block: tmproto.BlockParams{
    85  					MaxBytes:   exported.ConsensusParams.Block.MaxBytes,
    86  					MaxGas:     exported.ConsensusParams.Block.MaxGas,
    87  					TimeIotaMs: doc.ConsensusParams.Block.TimeIotaMs,
    88  				},
    89  				Evidence: tmproto.EvidenceParams{
    90  					MaxAgeNumBlocks: exported.ConsensusParams.Evidence.MaxAgeNumBlocks,
    91  					MaxAgeDuration:  exported.ConsensusParams.Evidence.MaxAgeDuration,
    92  					MaxBytes:        exported.ConsensusParams.Evidence.MaxBytes,
    93  				},
    94  				Validator: tmproto.ValidatorParams{
    95  					PubKeyTypes: exported.ConsensusParams.Validator.PubKeyTypes,
    96  				},
    97  			}
    98  
    99  			// NOTE: Tendermint uses a custom JSON decoder for GenesisDoc
   100  			// (except for stuff inside AppState). Inside AppState, we're free
   101  			// to encode as protobuf or amino.
   102  			encoded, err := ostjson.Marshal(doc)
   103  			if err != nil {
   104  				return err
   105  			}
   106  
   107  			cmd.Println(string(sdk.MustSortJSON(encoded)))
   108  			return nil
   109  		},
   110  	}
   111  
   112  	cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory")
   113  	cmd.Flags().Int64(FlagHeight, -1, "Export state from a particular height (-1 means latest height)")
   114  	cmd.Flags().Bool(FlagForZeroHeight, false, "Export state to start at height zero (perform preproccessing)")
   115  	cmd.Flags().StringSlice(FlagJailAllowedAddrs, []string{}, "Comma-separated list of operator addresses of jailed validators to unjail")
   116  
   117  	return cmd
   118  }