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 }