github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/server/start.go (about)

     1  package server
     2  
     3  // DONTCOVER
     4  
     5  import (
     6  	"os"
     7  	"runtime/pprof"
     8  
     9  	app2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server/types"
    10  
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server/grpc"
    12  	"github.com/fibonacci-chain/fbc/libs/tendermint/consensus"
    13  
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt"
    15  	"github.com/fibonacci-chain/fbc/libs/tendermint/rpc/client"
    16  
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/baseapp"
    18  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/lcd"
    20  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    21  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/iavl"
    22  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types"
    23  	"github.com/fibonacci-chain/fbc/libs/system"
    24  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/cli"
    25  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    26  	"github.com/fibonacci-chain/fbc/libs/tendermint/mempool"
    27  	"github.com/fibonacci-chain/fbc/libs/tendermint/node"
    28  	"github.com/fibonacci-chain/fbc/libs/tendermint/p2p"
    29  	"github.com/fibonacci-chain/fbc/libs/tendermint/proxy"
    30  	"github.com/fibonacci-chain/fbc/libs/tendermint/rpc/client/local"
    31  	"github.com/fibonacci-chain/fbc/libs/tendermint/state"
    32  	"github.com/gogo/protobuf/jsonpb"
    33  	"github.com/spf13/cobra"
    34  	"github.com/spf13/viper"
    35  
    36  	tmiavl "github.com/fibonacci-chain/fbc/libs/iavl"
    37  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    38  	bcv0 "github.com/fibonacci-chain/fbc/libs/tendermint/blockchain/v0"
    39  	tcmd "github.com/fibonacci-chain/fbc/libs/tendermint/cmd/tendermint/commands"
    40  	tmos "github.com/fibonacci-chain/fbc/libs/tendermint/libs/os"
    41  	pvm "github.com/fibonacci-chain/fbc/libs/tendermint/privval"
    42  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
    43  )
    44  
    45  // Tendermint full-node start flags
    46  const (
    47  	flagAddress            = "address"
    48  	flagTraceStore         = "trace-store"
    49  	flagCPUProfile         = "cpu-profile"
    50  	FlagMinGasPrices       = "minimum-gas-prices"
    51  	FlagHaltHeight         = "halt-height"
    52  	FlagHaltTime           = "halt-time"
    53  	FlagInterBlockCache    = "inter-block-cache"
    54  	FlagUnsafeSkipUpgrades = "unsafe-skip-upgrades"
    55  	FlagTrace              = "trace"
    56  
    57  	FlagPruning           = "pruning"
    58  	FlagPruningKeepRecent = "pruning-keep-recent"
    59  	FlagPruningKeepEvery  = "pruning-keep-every"
    60  	FlagPruningInterval   = "pruning-interval"
    61  	FlagLocalRpcPort      = "local-rpc-port"
    62  	FlagPortMonitor       = "netstat"
    63  	FlagEvmImportPath     = "evm-import-path"
    64  	FlagEvmImportMode     = "evm-import-mode"
    65  	FlagGoroutineNum      = "goroutine-num"
    66  
    67  	FlagPruningMaxWsNum = "pruning-max-worldstate-num"
    68  	FlagExportKeystore  = "export-keystore"
    69  	FlagLogServerUrl    = "log-server"
    70  
    71  	FlagActiveViewChange = "active-view-change"
    72  	FlagCommitGapHeight  = "commit-gap-height"
    73  
    74  	FlagBlockPartSizeBytes = "block-part-size"
    75  
    76  	FlagFastSyncGap = "fastsync-gap"
    77  
    78  	FlagEventBlockTime = "event-block-time"
    79  )
    80  
    81  // StartCmd runs the service passed in, either stand-alone or in-process with
    82  // Tendermint.
    83  func StartCmd(ctx *Context,
    84  	cdc *codec.CodecProxy,
    85  	registry jsonpb.AnyResolver,
    86  	appCreator AppCreator,
    87  	appStop AppStop,
    88  	registerRoutesFn func(restServer *lcd.RestServer),
    89  	registerAppFlagFn func(cmd *cobra.Command),
    90  	appPreRun func(ctx *Context, cmd *cobra.Command) error,
    91  	subFunc func(logger log.Logger) log.Subscriber,
    92  ) *cobra.Command {
    93  	cmd := &cobra.Command{
    94  		Use:   "start",
    95  		Short: "Run the full node",
    96  		Long: `Run the full node application with Tendermint in or out of process. By
    97  default, the application will run with Tendermint in process.
    98  
    99  Pruning options can be provided via the '--pruning' flag or alternatively with '--pruning-keep-recent',
   100  'pruning-keep-every', and 'pruning-interval' together.
   101  
   102  For '--pruning' the options are as follows:
   103  
   104  default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals
   105  nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node)
   106  everything: all saved states will be deleted, storing only the current state; pruning at 10 block intervals
   107  custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval'
   108  
   109  Node halting configurations exist in the form of two flags: '--halt-height' and '--halt-time'. During
   110  the ABCI Commit phase, the node will check if the current block height is greater than or equal to
   111  the halt-height or if the current block time is greater than or equal to the halt-time. If so, the
   112  node will attempt to gracefully shutdown and the block will not be committed. In addition, the node
   113  will not be able to commit subsequent blocks.
   114  
   115  For profiling and benchmarking purposes, CPU profiling can be enabled via the '--cpu-profile' flag
   116  which accepts a path for the resulting pprof file.
   117  `,
   118  		PreRunE: func(cmd *cobra.Command, args []string) error {
   119  			// app pre run
   120  			if err := appPreRun(ctx, cmd); err != nil {
   121  				return err
   122  			}
   123  			return nil
   124  		},
   125  		RunE: func(cmd *cobra.Command, args []string) error {
   126  
   127  			ctx.Logger.Info("Starting ABCI with Tendermint")
   128  
   129  			sub := subFunc(ctx.Logger)
   130  			log.SetSubscriber(sub)
   131  
   132  			setPID(ctx)
   133  			_, err := startInProcess(ctx, cdc, registry, appCreator, appStop, registerRoutesFn)
   134  			if err != nil {
   135  				tmos.Exit(err.Error())
   136  			}
   137  			return nil
   138  		},
   139  	}
   140  	RegisterServerFlags(cmd)
   141  	registerAppFlagFn(cmd)
   142  	// add support for all Tendermint-specific command line options
   143  	tcmd.AddNodeFlags(cmd)
   144  	cmd.AddCommand(nodeModeCmd(ctx))
   145  	return cmd
   146  }
   147  
   148  func startInProcess(ctx *Context, cdc *codec.CodecProxy, registry jsonpb.AnyResolver, appCreator AppCreator, appStop AppStop,
   149  	registerRoutesFn func(restServer *lcd.RestServer)) (*node.Node, error) {
   150  
   151  	cfg := ctx.Config
   152  	home := cfg.RootDir
   153  	//startInProcess hooker
   154  	callHooker(FlagHookstartInProcess, ctx)
   155  
   156  	traceWriterFile := viper.GetString(flagTraceStore)
   157  	db, err := openDB(home)
   158  	if err != nil {
   159  		return nil, err
   160  	}
   161  
   162  	traceWriter, err := openTraceWriter(traceWriterFile)
   163  	if err != nil {
   164  		return nil, err
   165  	}
   166  
   167  	app := appCreator(ctx.Logger, db, traceWriter)
   168  
   169  	nodeKey, err := p2p.LoadOrGenNodeKey(cfg.NodeKeyFile())
   170  	if err != nil {
   171  		return nil, err
   172  	}
   173  
   174  	// create & start tendermint node
   175  	tmNode, err := node.NewNode(
   176  		cfg,
   177  		pvm.LoadOrGenFilePV(cfg.PrivValidatorKeyFile(), cfg.PrivValidatorStateFile()),
   178  		nodeKey,
   179  		proxy.NewLocalClientCreator(app),
   180  		node.DefaultGenesisDocProviderFunc(cfg),
   181  		node.DefaultDBProvider,
   182  		node.DefaultMetricsProvider(cfg.Instrumentation),
   183  		ctx.Logger.With("module", "node"),
   184  	)
   185  	if err != nil {
   186  		return nil, err
   187  	}
   188  
   189  	app.SetOption(abci.RequestSetOption{
   190  		Key:   "CheckChainID",
   191  		Value: tmNode.ConsensusState().GetState().ChainID,
   192  	})
   193  
   194  	if clientSetter, ok := app.(interface {
   195  		SetTmClient(client client.Client)
   196  	}); ok {
   197  		clientSetter.SetTmClient(local.New(tmNode))
   198  	}
   199  
   200  	ctx.Logger.Info("startInProcess",
   201  		"ConsensusStateChainID", tmNode.ConsensusState().GetState().ChainID,
   202  		"GenesisDocChainID", tmNode.GenesisDoc().ChainID,
   203  	)
   204  	if err := tmNode.Start(); err != nil {
   205  		return nil, err
   206  	}
   207  
   208  	var cpuProfileCleanup func()
   209  
   210  	if cpuProfile := viper.GetString(flagCPUProfile); cpuProfile != "" {
   211  		f, err := os.Create(cpuProfile)
   212  		if err != nil {
   213  			return nil, err
   214  		}
   215  
   216  		ctx.Logger.Info("starting CPU profiler", "profile", cpuProfile)
   217  		if err := pprof.StartCPUProfile(f); err != nil {
   218  			return nil, err
   219  		}
   220  
   221  		cpuProfileCleanup = func() {
   222  			ctx.Logger.Info("stopping CPU profiler", "profile", cpuProfile)
   223  			pprof.StopCPUProfile()
   224  			f.Close()
   225  		}
   226  	}
   227  
   228  	TrapSignal(func() {
   229  		if tmNode.IsRunning() {
   230  			_ = tmNode.Stop()
   231  		}
   232  		appStop(app)
   233  
   234  		if cpuProfileCleanup != nil {
   235  			cpuProfileCleanup()
   236  		}
   237  
   238  		ctx.Logger.Info("exiting...")
   239  	})
   240  
   241  	if registerRoutesFn != nil {
   242  		go lcd.StartRestServer(cdc, registry, registerRoutesFn, tmNode, viper.GetString(FlagListenAddr))
   243  	}
   244  
   245  	if cfg.GRPC.Enable {
   246  		go grpc.StartGRPCServer(cdc, registry, app.(app2.ApplicationAdapter), cfg.GRPC, tmNode)
   247  	}
   248  
   249  	baseapp.SetGlobalMempool(tmNode.Mempool(), cfg.Mempool.SortTxByGp, cfg.Mempool.EnablePendingPool)
   250  
   251  	if cfg.Mempool.EnablePendingPool {
   252  		cliCtx := context.NewCLIContext().WithProxy(cdc)
   253  		cliCtx.Client = local.New(tmNode)
   254  		cliCtx.TrustNode = true
   255  		accRetriever := types.NewAccountRetriever(cliCtx)
   256  		tmNode.Mempool().SetAccountRetriever(accRetriever)
   257  	}
   258  
   259  	if parser, ok := app.(mempool.TxInfoParser); ok {
   260  		tmNode.Mempool().SetTxInfoParser(parser)
   261  	}
   262  
   263  	// run forever (the node will not be returned)
   264  	select {}
   265  }
   266  
   267  func StartRestWithNode(ctx *Context, cdc *codec.CodecProxy, blockStoreDir string,
   268  	registry jsonpb.AnyResolver, appCreator AppCreator,
   269  	registerRoutesFn func(restServer *lcd.RestServer)) (*node.Node, error) {
   270  
   271  	cfg := ctx.Config
   272  	home := cfg.RootDir
   273  	////startInProcess hooker
   274  	//callHooker(FlagHookstartInProcess, ctx)
   275  
   276  	traceWriterFile := viper.GetString(flagTraceStore)
   277  	db, err := openDB(home)
   278  	if err != nil {
   279  		return nil, err
   280  	}
   281  
   282  	traceWriter, err := openTraceWriter(traceWriterFile)
   283  	if err != nil {
   284  		return nil, err
   285  	}
   286  
   287  	app := appCreator(ctx.Logger, db, traceWriter)
   288  
   289  	nodeKey, err := p2p.LoadOrGenNodeKey(cfg.NodeKeyFile())
   290  	if err != nil {
   291  		return nil, err
   292  	}
   293  
   294  	// create & start tendermint node
   295  	tmNode, err := node.NewLRPNode(
   296  		cfg,
   297  		pvm.LoadFilePVEmptyState(cfg.PrivValidatorKeyFile(), cfg.PrivValidatorStateFile()),
   298  		nodeKey,
   299  		proxy.NewLocalClientCreator(app),
   300  		node.DefaultGenesisDocProviderFunc(cfg),
   301  		node.DefaultDBProvider,
   302  		blockStoreDir,
   303  		ctx.Logger.With("module", "node"),
   304  	)
   305  	if err != nil {
   306  		return nil, err
   307  	}
   308  
   309  	app.SetOption(abci.RequestSetOption{
   310  		Key:   "CheckChainID",
   311  		Value: tmNode.ConsensusState().GetState().ChainID,
   312  	})
   313  
   314  	if registerRoutesFn != nil {
   315  		go lcd.StartRestServer(cdc, registry, registerRoutesFn, tmNode, viper.GetString(FlagListenAddr))
   316  	}
   317  
   318  	// run forever (the node will not be returned)
   319  	//select {}
   320  	return tmNode, nil
   321  }
   322  
   323  // Use SetExternalPackageValue to set external package config value.
   324  func SetExternalPackageValue(cmd *cobra.Command) {
   325  	iavl.IavlCacheSize = viper.GetInt(iavl.FlagIavlCacheSize)
   326  	tmiavl.IavlCacheInitRatio = viper.GetFloat64(tmiavl.FlagIavlCacheInitRatio)
   327  	tmiavl.OutputModules, _ = cmd.Flags().GetStringToInt(tmiavl.FlagOutputModules)
   328  	tmiavl.CommitIntervalHeight = viper.GetInt64(tmiavl.FlagIavlCommitIntervalHeight)
   329  	tmiavl.MinCommitItemCount = viper.GetInt64(tmiavl.FlagIavlMinCommitItemCount)
   330  	tmiavl.HeightOrphansCacheSize = viper.GetInt(tmiavl.FlagIavlHeightOrphansCacheSize)
   331  	tmiavl.MaxCommittedHeightNum = viper.GetInt(tmiavl.FlagIavlMaxCommittedHeightNum)
   332  	tmiavl.EnableAsyncCommit = viper.GetBool(tmiavl.FlagIavlEnableAsyncCommit)
   333  	if viper.GetBool(tmiavl.FlagIavlDiscardFastStorage) {
   334  		tmiavl.SetEnableFastStorage(false)
   335  		viper.Set(tmiavl.FlagIavlEnableFastStorage, false)
   336  	}
   337  	system.EnableGid = viper.GetBool(system.FlagEnableGid)
   338  
   339  	state.ApplyBlockPprofTime = viper.GetInt(state.FlagApplyBlockPprofTime)
   340  	state.HomeDir = viper.GetString(cli.HomeFlag)
   341  
   342  	abci.SetDisableABCIQueryMutex(viper.GetBool(abci.FlagDisableABCIQueryMutex))
   343  	abci.SetDisableCheckTx(viper.GetBool(abci.FlagDisableCheckTx))
   344  
   345  	tmtypes.DownloadDelta = viper.GetBool(tmtypes.FlagDownloadDDS)
   346  	tmtypes.UploadDelta = viper.GetBool(tmtypes.FlagUploadDDS)
   347  	tmtypes.FastQuery = viper.GetBool(tmtypes.FlagFastQuery)
   348  	tmtypes.DeltaVersion = viper.GetInt(tmtypes.FlagDeltaVersion)
   349  	tmtypes.BlockCompressType = viper.GetInt(tmtypes.FlagBlockCompressType)
   350  	tmtypes.BlockCompressFlag = viper.GetInt(tmtypes.FlagBlockCompressFlag)
   351  	tmtypes.BlockCompressThreshold = viper.GetInt(tmtypes.FlagBlockCompressThreshold)
   352  
   353  	mpt.TrieCommitGap = viper.GetInt64(FlagCommitGapHeight)
   354  
   355  	bcv0.MaxIntervalForFastSync = viper.GetInt64(FlagFastSyncGap)
   356  
   357  	consensus.SetActiveVC(viper.GetBool(FlagActiveViewChange))
   358  
   359  	tmtypes.EnableEventBlockTime = viper.GetBool(FlagEventBlockTime)
   360  }