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  }