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  }