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  }