github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/server/start_fbchain.go (about) 1 package server 2 3 import ( 4 "bufio" 5 "errors" 6 "fmt" 7 "os" 8 "path/filepath" 9 "reflect" 10 "strconv" 11 12 "github.com/spf13/cobra" 13 "github.com/spf13/viper" 14 15 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/baseapp" 16 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags" 17 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/flatkv" 18 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/iavl" 19 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt" 20 mpttypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt/types" 21 sdkstoretypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types" 22 storetypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types" 23 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 24 tmiavl "github.com/fibonacci-chain/fbc/libs/iavl" 25 "github.com/fibonacci-chain/fbc/libs/system" 26 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 27 cmn "github.com/fibonacci-chain/fbc/libs/tendermint/libs/os" 28 "github.com/fibonacci-chain/fbc/libs/tendermint/state" 29 tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types" 30 evmtypes "github.com/fibonacci-chain/fbc/x/evm/types" 31 ) 32 33 // fbc full-node start flags 34 const ( 35 FlagListenAddr = "rest.laddr" 36 FlagUlockKey = "rest.unlock_key" 37 FlagUlockKeyHome = "rest.unlock_key_home" 38 FlagRestPathPrefix = "rest.path_prefix" 39 FlagCORS = "cors" 40 FlagMaxOpenConnections = "max-open" 41 FlagHookstartInProcess = "startInProcess" 42 FlagWsMaxConnections = "ws.max_connections" 43 FlagWsSubChannelLength = "ws.sub_channel_length" 44 ) 45 46 var ( 47 ChainID = "fbc-1230" 48 ) 49 50 //module hook 51 52 type fnHookstartInProcess func(ctx *Context) error 53 54 type serverHofiboable struct { 55 hofiboable map[string]interface{} 56 } 57 58 var gSrvHofiboable = serverHofiboable{make(map[string]interface{})} 59 60 func InstallHookEx(flag string, hooker fnHookstartInProcess) { 61 gSrvHofiboable.hofiboable[flag] = hooker 62 } 63 64 // call hooker function 65 func callHooker(flag string, args ...interface{}) error { 66 params := make([]interface{}, 0) 67 switch flag { 68 case FlagHookstartInProcess: 69 { 70 //none hook func, return nil 71 function, ok := gSrvHofiboable.hofiboable[FlagHookstartInProcess] 72 if !ok { 73 return nil 74 } 75 params = append(params, args...) 76 if len(params) != 1 { 77 return errors.New("too many or less parameter called, want 1") 78 } 79 80 //param type check 81 p1, ok := params[0].(*Context) 82 if !ok { 83 return errors.New("wrong param 1 type. want *Context, got" + reflect.TypeOf(params[0]).String()) 84 } 85 86 //get hook function and call it 87 caller := function.(fnHookstartInProcess) 88 return caller(p1) 89 } 90 default: 91 break 92 } 93 return nil 94 } 95 96 //end of hook 97 98 func setPID(ctx *Context) { 99 pid := os.Getpid() 100 f, err := os.OpenFile(filepath.Join(ctx.Config.RootDir, "config", "pid"), os.O_RDWR|os.O_CREATE, 0644) 101 if err != nil { 102 cmn.Exit(err.Error()) 103 } 104 defer f.Close() 105 writer := bufio.NewWriter(f) 106 _, err = writer.WriteString(strconv.Itoa(pid)) 107 if err != nil { 108 fmt.Println(err.Error()) 109 } 110 writer.Flush() 111 } 112 113 // StopCmd stop the node gracefully 114 // Tendermint. 115 func StopCmd(ctx *Context) *cobra.Command { 116 cmd := &cobra.Command{ 117 Use: "stop", 118 Short: "Stop the node gracefully", 119 RunE: func(cmd *cobra.Command, args []string) error { 120 f, err := os.Open(filepath.Join(ctx.Config.RootDir, "config", "pid")) 121 if err != nil { 122 errStr := fmt.Sprintf("%s Please finish the process of fbchaind through kill -2 pid to stop gracefully", err.Error()) 123 cmn.Exit(errStr) 124 } 125 defer f.Close() 126 in := bufio.NewScanner(f) 127 in.Scan() 128 pid, err := strconv.Atoi(in.Text()) 129 if err != nil { 130 errStr := fmt.Sprintf("%s Please finish the process of fbchaind through kill -2 pid to stop gracefully", err.Error()) 131 cmn.Exit(errStr) 132 } 133 process, err := os.FindProcess(pid) 134 if err != nil { 135 cmn.Exit(err.Error()) 136 } 137 err = process.Signal(os.Interrupt) 138 if err != nil { 139 cmn.Exit(err.Error()) 140 } 141 fmt.Println("pid", pid, "has been sent SIGINT") 142 return nil 143 }, 144 } 145 return cmd 146 } 147 148 var sem *nodeSemaphore 149 150 type nodeSemaphore struct { 151 done chan struct{} 152 } 153 154 func Stop() { 155 sem.done <- struct{}{} 156 } 157 158 // RegisterServerFlags registers the flags required for rest server 159 func RegisterServerFlags(cmd *cobra.Command) *cobra.Command { 160 // core flags for the ABCI application 161 cmd.Flags().String(flagAddress, "tcp://0.0.0.0:26658", "Listen address") 162 cmd.Flags().String(flagTraceStore, "", "Enable KVStore tracing to an output file") 163 cmd.Flags().Bool(FlagTrace, false, "Provide full stack traces for errors in ABCI Log") 164 cmd.Flags().String( 165 FlagMinGasPrices, "", 166 "Minimum gas prices to accept for transactions; Any fee in a tx must meet this minimum (e.g. 0.01photino;0.0001stake)", 167 ) 168 cmd.Flags().IntSlice(FlagUnsafeSkipUpgrades, []int{}, "Skip a set of upgrade heights to continue the old binary") 169 cmd.Flags().Uint64(FlagHaltHeight, 0, "Block height at which to gracefully halt the chain and shutdown the node") 170 cmd.Flags().Uint64(FlagHaltTime, 0, "Minimum block time (in Unix seconds) at which to gracefully halt the chain and shutdown the node") 171 cmd.Flags().Bool(FlagInterBlockCache, true, "Enable inter-block caching") 172 cmd.Flags().String(flagCPUProfile, "", "Enable CPU profiling and write to the provided file") 173 174 cmd.Flags().String(FlagPruning, storetypes.PruningOptionEverything, "Pruning strategy (default|nothing|everything|custom)") 175 cmd.Flags().Uint64(FlagPruningKeepRecent, 0, "Number of recent heights to keep on disk (ignored if pruning is not 'custom')") 176 cmd.Flags().Uint64(FlagPruningKeepEvery, 0, "Offset heights to keep on disk after 'keep-every' (ignored if pruning is not 'custom')") 177 cmd.Flags().Uint64(FlagPruningInterval, 0, "Height interval at which pruned heights are removed from disk (ignored if pruning is not 'custom')") 178 cmd.Flags().Uint64(FlagPruningMaxWsNum, 0, "Max number of historic states to keep on disk (ignored if pruning is not 'custom')") 179 cmd.Flags().String(FlagLocalRpcPort, "", "Local rpc port for mempool and block monitor on cosmos layer(ignored if mempool/block monitoring is not required)") 180 cmd.Flags().String(FlagPortMonitor, "", "Local target ports for connecting number monitoring(ignored if connecting number monitoring is not required)") 181 cmd.Flags().String(FlagEvmImportMode, "default", "Select import mode for evm state (default|files|db)") 182 cmd.Flags().String(FlagEvmImportPath, "", "Evm contract & storage db or files used for InitGenesis") 183 cmd.Flags().Uint64(FlagGoroutineNum, 0, "Limit on the number of goroutines used to import evm data(ignored if evm-import-mode is 'default')") 184 185 cmd.Flags().Bool(tmtypes.FlagDownloadDDS, false, "Download delta") 186 cmd.Flags().Bool(tmtypes.FlagUploadDDS, false, "Upload delta") 187 cmd.Flags().Bool(tmtypes.FlagAppendPid, false, "Append pid to the identity of delta producer") 188 cmd.Flags().String(tmtypes.FlagRedisUrl, "localhost:6379", "redis url") 189 cmd.Flags().String(tmtypes.FlagRedisAuth, "", "redis auth") 190 cmd.Flags().Int(tmtypes.FlagRedisExpire, 300, "delta expiration time. unit is second") 191 cmd.Flags().Int(tmtypes.FlagRedisDB, 0, "delta db num") 192 cmd.Flags().Int(tmtypes.FlagDDSCompressType, 0, "delta compress type. 0|1|2|3") 193 cmd.Flags().Int(tmtypes.FlagDDSCompressFlag, 0, "delta compress flag. 0|1|2") 194 cmd.Flags().Int(tmtypes.FlagBufferSize, 10, "delta buffer size") 195 cmd.Flags().String(FlagLogServerUrl, "", "log server url") 196 cmd.Flags().Int(tmtypes.FlagDeltaVersion, tmtypes.DeltaVersion, "Specify delta version") 197 cmd.Flags().Int(tmtypes.FlagBlockCompressType, 0, "block compress type. 0|1|2|3") 198 cmd.Flags().Int(tmtypes.FlagBlockCompressFlag, 0, "block compress flag. 0|1|2") 199 cmd.Flags().Int(tmtypes.FlagBlockCompressThreshold, 1024000, "Compress only if block size exceeds the threshold.") 200 cmd.Flags().Bool(FlagActiveViewChange, false, "Enable active view change") 201 202 cmd.Flags().Int(iavl.FlagIavlCacheSize, 10000000, "Max size of iavl cache") 203 cmd.Flags().Float64(tmiavl.FlagIavlCacheInitRatio, 1, "iavl cache init ratio, 0.0~1.0, default is 0, iavl cache map would be init with (cache size * init ratio)") 204 cmd.Flags().Bool(tmiavl.FlagIavlCommitAsyncNoBatch, false, "experimental: iavl commit async without batch") 205 cmd.Flags().StringToInt(tmiavl.FlagOutputModules, map[string]int{"evm": 1, "acc": 1}, "decide which module in iavl to be printed") 206 cmd.Flags().Int64(tmiavl.FlagIavlCommitIntervalHeight, 100, "Max interval to commit node cache into leveldb") 207 cmd.Flags().Int64(tmiavl.FlagIavlMinCommitItemCount, 1000000, "Min nodes num to triggle node cache commit") 208 cmd.Flags().Int(tmiavl.FlagIavlHeightOrphansCacheSize, 8, "Max orphan version to cache in memory") 209 cmd.Flags().Int(tmiavl.FlagIavlMaxCommittedHeightNum, 30, "Max committed version to cache in memory") 210 cmd.Flags().Bool(tmiavl.FlagIavlEnableAsyncCommit, true, "Enable async commit") 211 cmd.Flags().Bool(tmiavl.FlagIavlDiscardFastStorage, false, "Discard fast storage") 212 cmd.Flags().MarkHidden(tmiavl.FlagIavlDiscardFastStorage) 213 cmd.Flags().Bool(tmiavl.FlagIavlEnableFastStorage, false, "Enable fast storage") 214 cmd.Flags().MarkHidden(tmiavl.FlagIavlEnableFastStorage) 215 cmd.Flags().Int(tmiavl.FlagIavlFastStorageCacheSize, tmiavl.DefaultIavlFastStorageCacheSize, "Max size of iavl fast storage cache") 216 cmd.Flags().Bool(abci.FlagDisableABCIQueryMutex, true, "Disable local client query mutex for better concurrency") 217 cmd.Flags().Bool(abci.FlagDisableCheckTx, false, "Disable checkTx for test") 218 cmd.Flags().Bool(sdkstoretypes.FlagLoadVersionAsync, false, "Enable async for each kvstore to load version") 219 cmd.Flags().MarkHidden(abci.FlagDisableCheckTx) 220 cmd.Flags().Bool(abci.FlagCloseMutex, false, fmt.Sprintf("Deprecated in v0.19.13 version, use --%s instead.", abci.FlagDisableABCIQueryMutex)) 221 cmd.Flags().MarkHidden(abci.FlagCloseMutex) 222 cmd.Flags().Bool(FlagExportKeystore, false, "export keystore file when call newaccount ") 223 cmd.Flags().Bool(system.FlagEnableGid, false, "Display goroutine id in log") 224 cmd.Flags().Int(FlagBlockPartSizeBytes, 65536, "Size of one block part by byte") 225 cmd.Flags().Int(state.FlagApplyBlockPprofTime, -1, "time(ms) of executing ApplyBlock, if it is higher than this value, save pprof") 226 227 cmd.Flags().Float64Var(&baseapp.GasUsedFactor, baseapp.FlagGasUsedFactor, 0.4, "factor to calculate history gas used") 228 229 cmd.Flags().Bool(sdk.FlagMultiCache, false, "Enable multi cache") 230 cmd.Flags().MarkHidden(sdk.FlagMultiCache) 231 cmd.Flags().Int(sdk.MaxAccInMultiCache, 0, "max acc in multi cache") 232 cmd.Flags().Int(sdk.MaxStorageInMultiCache, 0, "max storage in multi cache") 233 cmd.Flags().Bool(flatkv.FlagEnable, false, "Enable flat kv storage for read performance") 234 235 cmd.Flags().Bool(FlagEventBlockTime, false, "Enable to publish event of latest block time") 236 237 // Don`t use cmd.Flags().*Var functions(such as cmd.Flags.IntVar) here, because it doesn't work with environment variables. 238 // Use setExternalPackageValue function instead. 239 viper.BindPFlag(FlagTrace, cmd.Flags().Lookup(FlagTrace)) 240 viper.BindPFlag(FlagPruning, cmd.Flags().Lookup(FlagPruning)) 241 viper.BindPFlag(FlagPruningKeepRecent, cmd.Flags().Lookup(FlagPruningKeepRecent)) 242 viper.BindPFlag(FlagPruningKeepEvery, cmd.Flags().Lookup(FlagPruningKeepEvery)) 243 viper.BindPFlag(FlagPruningInterval, cmd.Flags().Lookup(FlagPruningInterval)) 244 viper.BindPFlag(FlagPruningMaxWsNum, cmd.Flags().Lookup(FlagPruningMaxWsNum)) 245 viper.BindPFlag(FlagLocalRpcPort, cmd.Flags().Lookup(FlagLocalRpcPort)) 246 viper.BindPFlag(FlagPortMonitor, cmd.Flags().Lookup(FlagPortMonitor)) 247 viper.BindPFlag(FlagEvmImportMode, cmd.Flags().Lookup(FlagEvmImportMode)) 248 viper.BindPFlag(FlagEvmImportPath, cmd.Flags().Lookup(FlagEvmImportPath)) 249 viper.BindPFlag(FlagGoroutineNum, cmd.Flags().Lookup(FlagGoroutineNum)) 250 251 cmd.Flags().Int(state.FlagDeliverTxsExecMode, 0, "Execution mode for deliver txs, (0:serial[default], 1:deprecated, 2:parallel)") 252 cmd.Flags().Bool(state.FlagEnableConcurrency, false, "Enable concurrency for deliver txs") 253 254 cmd.Flags().String(FlagListenAddr, "tcp://0.0.0.0:26659", "EVM RPC and cosmos-sdk REST API listen address.") 255 cmd.Flags().String(FlagUlockKey, "", "Select the keys to unlock on the RPC server") 256 cmd.Flags().String(FlagUlockKeyHome, os.ExpandEnv("$HOME/.fbchaincli"), "The keybase home path") 257 cmd.Flags().String(FlagRestPathPrefix, "fbc", "Path prefix for registering rest api route.") 258 cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)") 259 cmd.Flags().String(FlagCORS, "", "Set the rest-server domains that can make CORS requests (* for all)") 260 cmd.Flags().Bool(flags.FlagUnsafeCORS, false, "Allows CORS requests from all domains. For development purposes only, use it at your own risk.") 261 262 cmd.Flags().Int(FlagMaxOpenConnections, 1000, "The number of maximum open connections of rest-server") 263 cmd.Flags().Int(FlagWsMaxConnections, 20000, "the max capacity number of websocket client connections") 264 cmd.Flags().Int(FlagWsSubChannelLength, 100, "the length of subscription channel") 265 cmd.Flags().String(flags.FlagChainID, ChainID, "Chain ID of tendermint node for web3") 266 cmd.Flags().StringP(flags.FlagBroadcastMode, "b", flags.BroadcastSync, "Transaction broadcasting mode (sync|async|block) for web3") 267 268 cmd.Flags().UintVar(&mpttypes.TrieRocksdbBatchSize, mpttypes.FlagTrieRocksdbBatchSize, 10, "Concurrent rocksdb batch size for mpt") 269 cmd.Flags().BoolVar(&mpt.TrieWriteAhead, mpt.FlagTrieWriteAhead, false, "Enable double write data (acc & evm) to the MPT tree when using the IAVL tree") 270 cmd.Flags().BoolVar(&mpt.TrieDirtyDisabled, mpt.FlagTrieDirtyDisabled, false, "Disable cache dirty trie nodes") 271 cmd.Flags().UintVar(&mpt.TrieCacheSize, mpt.FlagTrieCacheSize, 2048, "Size (MB) to cache trie nodes") 272 cmd.Flags().UintVar(&mpt.TrieNodesLimit, mpt.FlagTrieNodesLimit, 256, "Max node size (MB) cached in triedb") 273 cmd.Flags().UintVar(&mpt.TrieImgsLimit, mpt.FlagTrieImgsLimit, 4, "Max img size (MB) cached in triedb") 274 cmd.Flags().UintVar(&mpt.TrieAccStoreCache, mpt.FlagTrieAccStoreCache, 32, "Size (MB) to cache account") 275 cmd.Flags().BoolVar(&evmtypes.TrieUseCompositeKey, evmtypes.FlagTrieUseCompositeKey, false, "Use composite key to store contract state in mpt") 276 cmd.Flags().Int64(FlagCommitGapHeight, 100, "Block interval to commit cached data into db, affects iavl & mpt") 277 278 cmd.Flags().Int64(FlagFastSyncGap, 20, "Block height interval to switch fast-sync mode") 279 280 return cmd 281 } 282 283 func nodeModeCmd(ctx *Context) *cobra.Command { 284 cmd := &cobra.Command{ 285 Use: "node-mode", 286 Short: "fbchaind start --node-mode help info", 287 Long: `There are three node modes that can be set when the fbchaind start 288 set --node-mode=rpc to manage the following flags: 289 --disable-checktx-mutex=true 290 --disable-query-mutex=true 291 --enable-bloom-filter=true 292 --fast-lru=10000 293 --fast-query=true 294 --iavl-enable-async-commit=true 295 --max-open=20000 296 --mempool.enable_pending_pool=true 297 --cors=* 298 299 set --node-mode=val to manage the following flags: 300 --disable-checktx-mutex=true 301 --disable-query-mutex=true 302 --dynamic-gp-mode=2 303 --iavl-enable-async-commit=true 304 --iavl-cache-size=10000000 305 --pruning=everything 306 307 set --node-mode=archive to manage the following flags: 308 --pruning=nothing 309 --disable-checktx-mutex=true 310 --disable-query-mutex=true 311 --enable-bloom-filter=true 312 --iavl-enable-async-commit=true 313 --max-open=20000 314 --cors=*`, 315 Run: func(cmd *cobra.Command, args []string) { 316 }, 317 } 318 return cmd 319 }