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  }