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 }