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

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