github.com/Finschia/finschia-sdk@v0.48.1/testutil/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 app.RegisterTxService(val.ClientCtx) 74 app.RegisterTendermintService(val.ClientCtx) 75 76 if a, ok := app.(srvtypes.ApplicationQueryService); ok { 77 a.RegisterNodeService(val.ClientCtx) 78 } 79 } 80 81 if val.APIAddress != "" { 82 apiSrv := api.New(val.ClientCtx, logger.With("module", "api-server")) 83 app.RegisterAPIRoutes(apiSrv, val.AppConfig.API) 84 85 errCh := make(chan error) 86 87 go func() { 88 if err := apiSrv.Start(*val.AppConfig); err != nil { 89 errCh <- err 90 } 91 }() 92 93 select { 94 case err := <-errCh: 95 return err 96 case <-time.After(srvtypes.ServerStartTime): // assume server started successfully 97 } 98 99 val.api = apiSrv 100 } 101 102 if val.AppConfig.GRPC.Enable { 103 grpcSrv, err := servergrpc.StartGRPCServer(val.ClientCtx, app, val.AppConfig.GRPC) 104 if err != nil { 105 return err 106 } 107 108 val.grpc = grpcSrv 109 110 if val.AppConfig.GRPCWeb.Enable { 111 val.grpcWeb, err = servergrpc.StartGRPCWeb(grpcSrv, *val.AppConfig) 112 if err != nil { 113 return err 114 } 115 } 116 } 117 118 return nil 119 } 120 121 func collectGenFiles(cfg Config, vals []*Validator, outputDir string) error { 122 genTime := osttime.Now() 123 124 for i := 0; i < cfg.NumValidators; i++ { 125 tmCfg := vals[i].Ctx.Config 126 127 nodeDir := filepath.Join(outputDir, vals[i].Moniker, "simd") 128 gentxsDir := filepath.Join(outputDir, "gentxs") 129 130 tmCfg.Moniker = vals[i].Moniker 131 tmCfg.SetRoot(nodeDir) 132 133 initCfg := genutiltypes.NewInitConfig(cfg.ChainID, gentxsDir, vals[i].NodeID, vals[i].PubKey) 134 135 genFile := tmCfg.GenesisFile() 136 genDoc, err := types.GenesisDocFromFile(genFile) 137 if err != nil { 138 return err 139 } 140 141 appState, err := genutil.GenAppStateFromConfig(cfg.Codec, cfg.TxConfig, 142 tmCfg, initCfg, *genDoc, banktypes.GenesisBalancesIterator{}) 143 if err != nil { 144 return err 145 } 146 147 // overwrite each validator's genesis file to have a canonical genesis time 148 if err := genutil.ExportGenesisFileWithTime(genFile, cfg.ChainID, nil, appState, genTime); err != nil { 149 return err 150 } 151 } 152 153 return nil 154 } 155 156 func initGenFiles(cfg Config, genAccounts []authtypes.GenesisAccount, genBalances []banktypes.Balance, genFiles []string) error { 157 // set the accounts in the genesis state 158 var authGenState authtypes.GenesisState 159 cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[authtypes.ModuleName], &authGenState) 160 161 accounts, err := authtypes.PackAccounts(genAccounts) 162 if err != nil { 163 return err 164 } 165 166 authGenState.Accounts = append(authGenState.Accounts, accounts...) 167 cfg.GenesisState[authtypes.ModuleName] = cfg.Codec.MustMarshalJSON(&authGenState) 168 169 // set the balances in the genesis state 170 var bankGenState banktypes.GenesisState 171 cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[banktypes.ModuleName], &bankGenState) 172 173 bankGenState.Balances = append(bankGenState.Balances, genBalances...) 174 cfg.GenesisState[banktypes.ModuleName] = cfg.Codec.MustMarshalJSON(&bankGenState) 175 176 appGenStateJSON, err := json.MarshalIndent(cfg.GenesisState, "", " ") 177 if err != nil { 178 return err 179 } 180 181 genDoc := types.GenesisDoc{ 182 ChainID: cfg.ChainID, 183 AppState: appGenStateJSON, 184 Validators: nil, 185 } 186 187 // generate empty genesis files for each validator and save 188 for i := 0; i < cfg.NumValidators; i++ { 189 if err := genDoc.SaveAs(genFiles[i]); err != nil { 190 return err 191 } 192 } 193 194 return nil 195 } 196 197 func writeFile(name string, dir string, contents []byte) error { 198 writePath := filepath.Join(dir) //nolint:gocritic 199 file := filepath.Join(writePath, name) 200 201 err := ostos.EnsureDir(writePath, 0755) 202 if err != nil { 203 return err 204 } 205 206 err = ostos.WriteFile(file, contents, 0644) 207 if err != nil { 208 return err 209 } 210 211 return nil 212 }