github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/genutil/client/cli/init.go (about)

     1  package cli
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	cfg "github.com/fibonacci-chain/fbc/libs/tendermint/config"
    10  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/cli"
    11  	tmos "github.com/fibonacci-chain/fbc/libs/tendermint/libs/os"
    12  	tmrand "github.com/fibonacci-chain/fbc/libs/tendermint/libs/rand"
    13  	"github.com/fibonacci-chain/fbc/libs/tendermint/types"
    14  	"github.com/pkg/errors"
    15  	"github.com/spf13/cobra"
    16  	"github.com/spf13/viper"
    17  
    18  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    20  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server"
    21  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    22  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/module"
    23  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/genutil"
    24  )
    25  
    26  const (
    27  	flagOverwrite  = "overwrite"
    28  	flagClientHome = "home-client"
    29  )
    30  
    31  type printInfo struct {
    32  	Moniker    string          `json:"moniker" yaml:"moniker"`
    33  	ChainID    string          `json:"chain_id" yaml:"chain_id"`
    34  	NodeID     string          `json:"node_id" yaml:"node_id"`
    35  	GenTxsDir  string          `json:"gentxs_dir" yaml:"gentxs_dir"`
    36  	AppMessage json.RawMessage `json:"app_message" yaml:"app_message"`
    37  }
    38  
    39  func newPrintInfo(moniker, chainID, nodeID, genTxsDir string,
    40  	appMessage json.RawMessage) printInfo {
    41  
    42  	return printInfo{
    43  		Moniker:    moniker,
    44  		ChainID:    chainID,
    45  		NodeID:     nodeID,
    46  		GenTxsDir:  genTxsDir,
    47  		AppMessage: appMessage,
    48  	}
    49  }
    50  
    51  func displayInfo(cdc *codec.Codec, info printInfo) error {
    52  	out, err := codec.MarshalJSONIndent(cdc, info)
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	_, err = fmt.Fprintf(os.Stderr, "%s\n", string(sdk.MustSortJSON(out)))
    58  	return err
    59  }
    60  
    61  // InitCmd returns a command that initializes all files needed for Tendermint
    62  // and the respective application.
    63  func InitCmd(ctx *server.Context, cdc *codec.Codec, mbm module.BasicManager,
    64  	defaultNodeHome string) *cobra.Command { // nolint: golint
    65  	cmd := &cobra.Command{
    66  		Use:   "init [moniker]",
    67  		Short: "Initialize private validator, p2p, genesis, and application configuration files",
    68  		Long:  `Initialize validators's and node's configuration files.`,
    69  		Args:  cobra.ExactArgs(1),
    70  		RunE: func(_ *cobra.Command, args []string) error {
    71  			config := ctx.Config
    72  			config.SetRoot(viper.GetString(cli.HomeFlag))
    73  
    74  			chainID := viper.GetString(flags.FlagChainID)
    75  			if chainID == "" {
    76  				chainID = fmt.Sprintf("test-chain-%v", tmrand.Str(6))
    77  			}
    78  
    79  			nodeID, _, err := genutil.InitializeNodeValidatorFiles(config)
    80  			if err != nil {
    81  				return err
    82  			}
    83  
    84  			config.Moniker = args[0]
    85  
    86  			genFile := config.GenesisFile()
    87  			if !viper.GetBool(flagOverwrite) && tmos.FileExists(genFile) {
    88  				return fmt.Errorf("genesis.json file already exists: %v", genFile)
    89  			}
    90  			appState, err := codec.MarshalJSONIndent(cdc, mbm.DefaultGenesis())
    91  			if err != nil {
    92  				return errors.Wrap(err, "Failed to marshall default genesis state")
    93  			}
    94  
    95  			genDoc := &types.GenesisDoc{}
    96  			if _, err := os.Stat(genFile); err != nil {
    97  				if !os.IsNotExist(err) {
    98  					return err
    99  				}
   100  			} else {
   101  				genDoc, err = types.GenesisDocFromFile(genFile)
   102  				if err != nil {
   103  					return errors.Wrap(err, "Failed to read genesis doc from file")
   104  				}
   105  			}
   106  
   107  			genDoc.ChainID = chainID
   108  			genDoc.Validators = nil
   109  			genDoc.AppState = appState
   110  			if err = genutil.ExportGenesisFile(genDoc, genFile); err != nil {
   111  				return errors.Wrap(err, "Failed to export gensis file")
   112  			}
   113  
   114  			toPrint := newPrintInfo(config.Moniker, chainID, nodeID, "", appState)
   115  
   116  			cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config)
   117  			return displayInfo(cdc, toPrint)
   118  		},
   119  	}
   120  
   121  	cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory")
   122  	cmd.Flags().BoolP(flagOverwrite, "o", false, "overwrite the genesis.json file")
   123  	cmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created")
   124  
   125  	return cmd
   126  }