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 }