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 }