github.com/Finschia/finschia-proxy/v2@v2.0.1/cli_test/network/util.go (about) 1 package network 2 3 import ( 4 "encoding/json" 5 "path/filepath" 6 "time" 7 8 ostos "github.com/Finschia/ostracon/libs/os" 9 "github.com/Finschia/ostracon/node" 10 "github.com/Finschia/ostracon/p2p" 11 pvm "github.com/Finschia/ostracon/privval" 12 "github.com/Finschia/ostracon/proxy" 13 "github.com/Finschia/ostracon/rpc/client/local" 14 "github.com/Finschia/ostracon/types" 15 osttime "github.com/Finschia/ostracon/types/time" 16 17 "github.com/Finschia/finschia-sdk/server/api" 18 servergrpc "github.com/Finschia/finschia-sdk/server/grpc" 19 srvtypes "github.com/Finschia/finschia-sdk/server/types" 20 authtypes "github.com/Finschia/finschia-sdk/x/auth/types" 21 banktypes "github.com/Finschia/finschia-sdk/x/bank/types" 22 "github.com/Finschia/finschia-sdk/x/genutil" 23 genutiltypes "github.com/Finschia/finschia-sdk/x/genutil/types" 24 ) 25 26 func startInProcess(cfg Config, val *Validator) error { 27 logger := val.Ctx.Logger 28 tmCfg := val.Ctx.Config 29 tmCfg.Instrumentation.Prometheus = false 30 31 if err := val.AppConfig.ValidateBasic(); err != nil { 32 return err 33 } 34 35 nodeKey, err := p2p.LoadOrGenNodeKey(tmCfg.NodeKeyFile()) 36 if err != nil { 37 return err 38 } 39 40 app := cfg.AppConstructor(*val) 41 42 genDocProvider := node.DefaultGenesisDocProviderFunc(tmCfg) 43 pv := pvm.LoadOrGenFilePV(tmCfg.PrivValidatorKeyFile(), tmCfg.PrivValidatorStateFile()) 44 tmNode, err := node.NewNode( 45 tmCfg, 46 pv, 47 nodeKey, 48 proxy.NewLocalClientCreator(app), 49 genDocProvider, 50 node.DefaultDBProvider, 51 node.DefaultMetricsProvider(tmCfg.Instrumentation), 52 logger.With("module", val.Moniker), 53 ) 54 if err != nil { 55 return err 56 } 57 58 if err := tmNode.Start(); err != nil { 59 return err 60 } 61 62 val.tmNode = tmNode 63 64 if val.RPCAddress != "" { 65 val.RPCClient = local.New(tmNode) 66 } 67 68 // We'll need a RPC client if the validator exposes a gRPC or REST endpoint. 69 if val.APIAddress != "" || val.AppConfig.GRPC.Enable { 70 val.ClientCtx = val.ClientCtx. 71 WithClient(val.RPCClient) 72 73 // Add the tx service in the gRPC router. 74 app.RegisterTxService(val.ClientCtx) 75 76 // Add the tendermint queries service in the gRPC router. 77 app.RegisterTendermintService(val.ClientCtx) 78 } 79 80 if val.APIAddress != "" { 81 apiSrv := api.New(val.ClientCtx, logger.With("module", "api-server")) 82 app.RegisterAPIRoutes(apiSrv, val.AppConfig.API) 83 84 errCh := make(chan error) 85 86 go func() { 87 if err := apiSrv.Start(val.AppConfig.Config); err != nil { 88 errCh <- err 89 } 90 }() 91 92 select { 93 case err := <-errCh: 94 return err 95 case <-time.After(srvtypes.ServerStartTime): // assume server started successfully 96 } 97 98 val.api = apiSrv 99 } 100 101 if val.AppConfig.GRPC.Enable { 102 grpcSrv, err := servergrpc.StartGRPCServer(val.ClientCtx, app, val.AppConfig.GRPC) 103 if err != nil { 104 return err 105 } 106 107 val.grpc = grpcSrv 108 109 if val.AppConfig.GRPCWeb.Enable { 110 val.grpcWeb, err = servergrpc.StartGRPCWeb(grpcSrv, val.AppConfig.Config) 111 if err != nil { 112 return err 113 } 114 } 115 } 116 117 return nil 118 } 119 120 func collectGenFiles(cfg Config, vals []*Validator, outputDir string) error { 121 genTime := osttime.Now() 122 123 for i := 0; i < cfg.NumValidators; i++ { 124 tmCfg := vals[i].Ctx.Config 125 126 nodeDir := filepath.Join(outputDir, vals[i].Moniker, "simd") 127 gentxsDir := filepath.Join(outputDir, "gentxs") 128 129 tmCfg.Moniker = vals[i].Moniker 130 tmCfg.SetRoot(nodeDir) 131 132 initCfg := genutiltypes.NewInitConfig(cfg.ChainID, gentxsDir, vals[i].NodeID, vals[i].PubKey) 133 134 genFile := tmCfg.GenesisFile() 135 genDoc, err := types.GenesisDocFromFile(genFile) 136 if err != nil { 137 return err 138 } 139 140 appState, err := genutil.GenAppStateFromConfig(cfg.Codec, cfg.TxConfig, 141 tmCfg, initCfg, *genDoc, banktypes.GenesisBalancesIterator{}) 142 if err != nil { 143 return err 144 } 145 146 // overwrite each validator's genesis file to have a canonical genesis time 147 if err := genutil.ExportGenesisFileWithTime(genFile, cfg.ChainID, nil, appState, genTime); err != nil { 148 return err 149 } 150 } 151 152 return nil 153 } 154 155 func initGenFiles(cfg Config, genAccounts []authtypes.GenesisAccount, genBalances []banktypes.Balance, genFiles []string) error { 156 // set the accounts in the genesis state 157 var authGenState authtypes.GenesisState 158 cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[authtypes.ModuleName], &authGenState) 159 160 accounts, err := authtypes.PackAccounts(genAccounts) 161 if err != nil { 162 return err 163 } 164 165 authGenState.Accounts = append(authGenState.Accounts, accounts...) 166 cfg.GenesisState[authtypes.ModuleName] = cfg.Codec.MustMarshalJSON(&authGenState) 167 168 // set the balances in the genesis state 169 var bankGenState banktypes.GenesisState 170 cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[banktypes.ModuleName], &bankGenState) 171 172 bankGenState.Balances = append(bankGenState.Balances, genBalances...) 173 cfg.GenesisState[banktypes.ModuleName] = cfg.Codec.MustMarshalJSON(&bankGenState) 174 175 appGenStateJSON, err := json.MarshalIndent(cfg.GenesisState, "", " ") 176 if err != nil { 177 return err 178 } 179 180 genDoc := types.GenesisDoc{ 181 ChainID: cfg.ChainID, 182 AppState: appGenStateJSON, 183 Validators: nil, 184 } 185 186 // generate empty genesis files for each validator and save 187 for i := 0; i < cfg.NumValidators; i++ { 188 if err := genDoc.SaveAs(genFiles[i]); err != nil { 189 return err 190 } 191 } 192 193 return nil 194 } 195 196 func writeFile(name string, dir string, contents []byte) error { 197 file := filepath.Join(dir, name) 198 199 err := ostos.EnsureDir(dir, 0755) 200 if err != nil { 201 return err 202 } 203 204 err = ostos.WriteFile(file, contents, 0644) 205 if err != nil { 206 return err 207 } 208 209 return nil 210 }