github.com/klaytn/klaytn@v1.10.2/cmd/utils/flags.go (about)

     1  // Modifications Copyright 2018 The klaytn Authors
     2  // Copyright 2015 The go-ethereum Authors
     3  // This file is part of go-ethereum.
     4  //
     5  // go-ethereum is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  //
    10  // go-ethereum is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  // GNU General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU General Public License
    16  // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
    17  //
    18  // This file is derived from cmd/utils/flags.go (2018/06/04).
    19  // Modified and improved for the klaytn development.
    20  
    21  package utils
    22  
    23  import (
    24  	"fmt"
    25  	"io/ioutil"
    26  	"os"
    27  	"path/filepath"
    28  	"strings"
    29  	"time"
    30  
    31  	"github.com/klaytn/klaytn/blockchain"
    32  	"github.com/klaytn/klaytn/common"
    33  	"github.com/klaytn/klaytn/datasync/chaindatafetcher"
    34  	"github.com/klaytn/klaytn/datasync/chaindatafetcher/kafka"
    35  	"github.com/klaytn/klaytn/datasync/dbsyncer"
    36  	"github.com/klaytn/klaytn/log"
    37  	metricutils "github.com/klaytn/klaytn/metrics/utils"
    38  	"github.com/klaytn/klaytn/networks/rpc"
    39  	"github.com/klaytn/klaytn/node"
    40  	"github.com/klaytn/klaytn/node/cn"
    41  	"github.com/klaytn/klaytn/node/cn/filters"
    42  	"github.com/klaytn/klaytn/node/sc"
    43  	"github.com/klaytn/klaytn/params"
    44  	"github.com/klaytn/klaytn/storage/database"
    45  	"github.com/klaytn/klaytn/storage/statedb"
    46  	"gopkg.in/urfave/cli.v1"
    47  )
    48  
    49  func InitHelper() {
    50  	cli.AppHelpTemplate = AppHelpTemplate
    51  	cli.CommandHelpTemplate = CommandHelpTemplate
    52  }
    53  
    54  // NewApp creates an app with sane defaults.
    55  func NewApp(gitCommit, usage string) *cli.App {
    56  	app := cli.NewApp()
    57  	app.Name = filepath.Base(os.Args[0])
    58  	app.Author = ""
    59  	// app.Authors = nil
    60  	app.Email = ""
    61  	app.Version = params.Version
    62  	if len(gitCommit) >= 8 {
    63  		app.Version += "-" + gitCommit[:8]
    64  	}
    65  	app.Usage = usage
    66  	return app
    67  }
    68  
    69  var (
    70  	// General settings
    71  	ConfFlag = cli.StringFlag{
    72  		Name: "conf",
    73  	}
    74  	NtpDisableFlag = cli.BoolFlag{
    75  		Name:   "ntp.disable",
    76  		Usage:  "Disable checking if the local time is synchronized with ntp server. If this flag is not set, the local time is checked with the time of the server specified by ntp.server.",
    77  		EnvVar: "KLAYTN_NTP_DISABLE",
    78  	}
    79  	NtpServerFlag = cli.StringFlag{
    80  		Name:   "ntp.server",
    81  		Usage:  "Remote ntp server:port to get the time",
    82  		Value:  "pool.ntp.org:123",
    83  		EnvVar: "KLAYTN_NTP_SERVER",
    84  	}
    85  	NetworkTypeFlag = cli.StringFlag{
    86  		Name:   "networktype",
    87  		Usage:  "Klaytn network type (main-net (mn), service chain-net (scn))",
    88  		Value:  "mn",
    89  		EnvVar: "KLAYTN_NETWORKTYPE",
    90  	}
    91  	DbTypeFlag = cli.StringFlag{
    92  		Name:   "dbtype",
    93  		Usage:  `Blockchain storage database type ("LevelDB", "BadgerDB", "MemoryDB", "DynamoDBS3")`,
    94  		Value:  "LevelDB",
    95  		EnvVar: "KLAYTN_DBTYPE",
    96  	}
    97  	SrvTypeFlag = cli.StringFlag{
    98  		Name:   "srvtype",
    99  		Usage:  `json rpc server type ("http", "fasthttp")`,
   100  		Value:  "fasthttp",
   101  		EnvVar: "KLAYTN_SRVTYPE",
   102  	}
   103  	DataDirFlag = DirectoryFlag{
   104  		Name:   "datadir",
   105  		Value:  DirectoryString{node.DefaultDataDir()},
   106  		Usage:  "Data directory for the databases and keystore. This value is only used in local DB.",
   107  		EnvVar: "KLAYTN_DATADIR",
   108  	}
   109  	KeyStoreDirFlag = DirectoryFlag{
   110  		Name:   "keystore",
   111  		Usage:  "Directory for the keystore (default = inside the datadir)",
   112  		EnvVar: "KLAYTN_KEYSTORE",
   113  	}
   114  	// TODO-Klaytn-Bootnode: redefine networkid
   115  	NetworkIdFlag = cli.Uint64Flag{
   116  		Name:   "networkid",
   117  		Usage:  "Network identifier (integer, 8217=Cypress (Mainnet) , 1000=Aspen, 1001=Baobab)",
   118  		Value:  cn.GetDefaultConfig().NetworkId,
   119  		EnvVar: "KLAYTN_NETWORKID",
   120  	}
   121  	IdentityFlag = cli.StringFlag{
   122  		Name:   "identity",
   123  		Usage:  "Custom node name",
   124  		EnvVar: "KLAYTN_IDENTITY",
   125  	}
   126  	DocRootFlag = DirectoryFlag{
   127  		Name:   "docroot",
   128  		Usage:  "Document Root for HTTPClient file scheme",
   129  		Value:  DirectoryString{homeDir()},
   130  		EnvVar: "KLAYTN_DOCROOT",
   131  	}
   132  	defaultSyncMode = cn.GetDefaultConfig().SyncMode
   133  	SyncModeFlag    = TextMarshalerFlag{
   134  		Name:   "syncmode",
   135  		Usage:  `Blockchain sync mode ("full" or "snap")`,
   136  		Value:  &defaultSyncMode,
   137  		EnvVar: "KLAYTN_SYNCMODE",
   138  	}
   139  	GCModeFlag = cli.StringFlag{
   140  		Name:   "gcmode",
   141  		Usage:  `Blockchain garbage collection mode ("full", "archive")`,
   142  		Value:  "full",
   143  		EnvVar: "KLAYTN_GCMODE",
   144  	}
   145  	LightKDFFlag = cli.BoolFlag{
   146  		Name:   "lightkdf",
   147  		Usage:  "Reduce key-derivation RAM & CPU usage at some expense of KDF strength",
   148  		EnvVar: "KLAYTN_LIGHTKDF",
   149  	}
   150  	OverwriteGenesisFlag = cli.BoolFlag{
   151  		Name:   "overwrite-genesis",
   152  		Usage:  "Overwrites genesis block with the given new genesis block for testing purpose",
   153  		EnvVar: "KLAYTN_OVERWRITE_GENESIS",
   154  	}
   155  	StartBlockNumberFlag = cli.Uint64Flag{
   156  		Name:   "start-block-num",
   157  		Usage:  "Starts the node from the given block number. Starting from 0 is not supported.",
   158  		EnvVar: "KLAYTN_START_BLOCK_NUM",
   159  	}
   160  	// Transaction pool settings
   161  	TxPoolNoLocalsFlag = cli.BoolFlag{
   162  		Name:   "txpool.nolocals",
   163  		Usage:  "Disables price exemptions for locally submitted transactions",
   164  		EnvVar: "KLAYTN_TXPOOL_NOLOCALS",
   165  	}
   166  	TxPoolAllowLocalAnchorTxFlag = cli.BoolFlag{
   167  		Name:   "txpool.allow-local-anchortx",
   168  		Usage:  "Allow locally submitted anchoring transactions",
   169  		EnvVar: "KLAYTN_TXPOOL_ALLOW_LOCAL_ANCHORTX",
   170  	}
   171  	TxPoolDenyRemoteTxFlag = cli.BoolFlag{
   172  		Name:   "txpool.deny.remotetx",
   173  		Usage:  "Deny remote transaction receiving from other peers. Use only for emergency cases",
   174  		EnvVar: "KLAYTN_TXPOOL_DENY_REMOTETX",
   175  	}
   176  	TxPoolJournalFlag = cli.StringFlag{
   177  		Name:   "txpool.journal",
   178  		Usage:  "Disk journal for local transaction to survive node restarts",
   179  		Value:  blockchain.DefaultTxPoolConfig.Journal,
   180  		EnvVar: "KLAYTN_TXPOOL_JOURNAL",
   181  	}
   182  	TxPoolJournalIntervalFlag = cli.DurationFlag{
   183  		Name:   "txpool.journal-interval",
   184  		Usage:  "Time interval to regenerate the local transaction journal",
   185  		Value:  blockchain.DefaultTxPoolConfig.JournalInterval,
   186  		EnvVar: "KLAYTN_TXPOOL_JOURNAL_INTERVAL",
   187  	}
   188  	TxPoolPriceLimitFlag = cli.Uint64Flag{
   189  		Name:   "txpool.pricelimit",
   190  		Usage:  "Minimum gas price limit to enforce for acceptance into the pool",
   191  		Value:  cn.GetDefaultConfig().TxPool.PriceLimit,
   192  		EnvVar: "KLAYTN_TXPOOL_PRICELIMIT",
   193  	}
   194  	TxPoolPriceBumpFlag = cli.Uint64Flag{
   195  		Name:   "txpool.pricebump",
   196  		Usage:  "Price bump percentage to replace an already existing transaction",
   197  		Value:  cn.GetDefaultConfig().TxPool.PriceBump,
   198  		EnvVar: "KLAYTN_TXPOOL_PRICEBUMP",
   199  	}
   200  	TxPoolExecSlotsAccountFlag = cli.Uint64Flag{
   201  		Name:   "txpool.exec-slots.account",
   202  		Usage:  "Number of executable transaction slots guaranteed per account",
   203  		Value:  cn.GetDefaultConfig().TxPool.ExecSlotsAccount,
   204  		EnvVar: "KLAYTN_TXPOOL_EXEC_SLOTS_ACCOUNT",
   205  	}
   206  	TxPoolExecSlotsAllFlag = cli.Uint64Flag{
   207  		Name:   "txpool.exec-slots.all",
   208  		Usage:  "Maximum number of executable transaction slots for all accounts",
   209  		Value:  cn.GetDefaultConfig().TxPool.ExecSlotsAll,
   210  		EnvVar: "KLAYTN_TXPOOL_EXEC_SLOTS_ALL",
   211  	}
   212  	TxPoolNonExecSlotsAccountFlag = cli.Uint64Flag{
   213  		Name:   "txpool.nonexec-slots.account",
   214  		Usage:  "Maximum number of non-executable transaction slots permitted per account",
   215  		Value:  cn.GetDefaultConfig().TxPool.NonExecSlotsAccount,
   216  		EnvVar: "KLAYTN_TXPOOL_NONEXEC_SLOTS_ACCOUNT",
   217  	}
   218  	TxPoolNonExecSlotsAllFlag = cli.Uint64Flag{
   219  		Name:   "txpool.nonexec-slots.all",
   220  		Usage:  "Maximum number of non-executable transaction slots for all accounts",
   221  		Value:  cn.GetDefaultConfig().TxPool.NonExecSlotsAll,
   222  		EnvVar: "KLAYTN_TXPOOL_NONEXEC_SLOTS_ALL",
   223  	}
   224  	TxPoolKeepLocalsFlag = cli.BoolFlag{
   225  		Name:   "txpool.keeplocals",
   226  		Usage:  "Disables removing timed-out local transactions",
   227  		EnvVar: "KLAYTN_TXPOOL_KEEPLOCALS",
   228  	}
   229  	TxPoolLifetimeFlag = cli.DurationFlag{
   230  		Name:   "txpool.lifetime",
   231  		Usage:  "Maximum amount of time non-executable transaction are queued",
   232  		Value:  cn.GetDefaultConfig().TxPool.Lifetime,
   233  		EnvVar: "KLAYTN_TXPOOL_LIFETIME",
   234  	}
   235  	// PN specific txpool settings
   236  	TxPoolSpamThrottlerDisableFlag = cli.BoolFlag{
   237  		Name:   "txpool.spamthrottler.disable",
   238  		Usage:  "Disable txpool spam throttler prototype",
   239  		EnvVar: "KLAYTN_TXPOOL_SPAMTHROTTLER_DISABLE",
   240  	}
   241  
   242  	// KES
   243  	KESNodeTypeServiceFlag = cli.BoolFlag{
   244  		Name:   "kes.nodetype.service",
   245  		Usage:  "Run as a KES Service Node (Disable fetcher, downloader, and worker)",
   246  		EnvVar: "KLAYTN_KES_NODETYPE_SERVICE",
   247  	}
   248  	SingleDBFlag = cli.BoolFlag{
   249  		Name:   "db.single",
   250  		Usage:  "Create a single persistent storage. MiscDB, headerDB and etc are stored in one DB.",
   251  		EnvVar: "KLAYTN_DB_SINGLE",
   252  	}
   253  	NumStateTrieShardsFlag = cli.UintFlag{
   254  		Name:   "db.num-statetrie-shards",
   255  		Usage:  "Number of internal shards of state trie DB shards. Should be power of 2",
   256  		Value:  4,
   257  		EnvVar: "KLAYTN_DB_NUM_STATETRIE_SHARDS",
   258  	}
   259  	LevelDBCacheSizeFlag = cli.IntFlag{
   260  		Name:   "db.leveldb.cache-size",
   261  		Usage:  "Size of in-memory cache in LevelDB (MiB)",
   262  		Value:  768,
   263  		EnvVar: "KLAYTN_DB_LEVELDB_CACHE_SIZE",
   264  	}
   265  	// TODO-Klaytn-Database LevelDBCompressionTypeFlag should be removed before main-net release.
   266  	LevelDBCompressionTypeFlag = cli.IntFlag{
   267  		Name:   "db.leveldb.compression",
   268  		Usage:  "Determines the compression method for LevelDB. 0=AllNoCompression, 1=ReceiptOnlySnappyCompression, 2=StateTrieOnlyNoCompression, 3=AllSnappyCompression",
   269  		Value:  0,
   270  		EnvVar: "KLAYTN_DB_LEVELDB_COMPRESSION",
   271  	}
   272  	LevelDBNoBufferPoolFlag = cli.BoolFlag{
   273  		Name:   "db.leveldb.no-buffer-pool",
   274  		Usage:  "Disables using buffer pool for LevelDB's block allocation",
   275  		EnvVar: "KLAYTN_DB_LEVELDB_NO_BUFFER_POOL",
   276  	}
   277  	DynamoDBTableNameFlag = cli.StringFlag{
   278  		Name:   "db.dynamo.tablename",
   279  		Usage:  "Specifies DynamoDB table name. This is mandatory to use dynamoDB. (Set dbtype to use DynamoDBS3)",
   280  		EnvVar: "KLAYTN_DB_DYNAMO_TABLENAME",
   281  	}
   282  	DynamoDBRegionFlag = cli.StringFlag{
   283  		Name:   "db.dynamo.region",
   284  		Usage:  "AWS region where the DynamoDB will be created.",
   285  		Value:  database.GetDefaultDynamoDBConfig().Region,
   286  		EnvVar: "KLAYTN_DB_DYNAMO_REGION",
   287  	}
   288  	DynamoDBIsProvisionedFlag = cli.BoolFlag{
   289  		Name:   "db.dynamo.is-provisioned",
   290  		Usage:  "Set DynamoDB billing mode to provision. The default billing mode is on-demand.",
   291  		EnvVar: "KLAYTN_DB_DYNAMO_IS_PROVISIONED",
   292  	}
   293  	DynamoDBReadCapacityFlag = cli.Int64Flag{
   294  		Name:   "db.dynamo.read-capacity",
   295  		Usage:  "Read capacity unit of dynamoDB. If is-provisioned is not set, this flag will not be applied.",
   296  		Value:  database.GetDefaultDynamoDBConfig().ReadCapacityUnits,
   297  		EnvVar: "KLAYTN_DB_DYNAMO_READ_CAPACITY",
   298  	}
   299  	DynamoDBWriteCapacityFlag = cli.Int64Flag{
   300  		Name:   "db.dynamo.write-capacity",
   301  		Usage:  "Write capacity unit of dynamoDB. If is-provisioned is not set, this flag will not be applied",
   302  		Value:  database.GetDefaultDynamoDBConfig().WriteCapacityUnits,
   303  		EnvVar: "KLAYTN_DB_DYNAMO_WRITE_CAPACITY",
   304  	}
   305  	DynamoDBReadOnlyFlag = cli.BoolFlag{
   306  		Name:   "db.dynamo.read-only",
   307  		Usage:  "Disables write to DynamoDB. Only read is possible.",
   308  		EnvVar: "KLAYTN_DB_DYNAMO_READ_ONLY",
   309  	}
   310  	NoParallelDBWriteFlag = cli.BoolFlag{
   311  		Name:   "db.no-parallel-write",
   312  		Usage:  "Disables parallel writes of block data to persistent database",
   313  		EnvVar: "KLAYTN_DB_NO_PARALLEL_WRITE",
   314  	}
   315  	DBNoPerformanceMetricsFlag = cli.BoolFlag{
   316  		Name:   "db.no-perf-metrics",
   317  		Usage:  "Disables performance metrics of database's read and write operations",
   318  		EnvVar: "KLAYTN_DB_NO_PERF_METRICS",
   319  	}
   320  	SnapshotFlag = cli.BoolFlag{
   321  		Name:   "snapshot",
   322  		Usage:  "Enables snapshot-database mode",
   323  		EnvVar: "KLAYTN_SNAPSHOT",
   324  	}
   325  	SnapshotCacheSizeFlag = cli.IntFlag{
   326  		Name:   "snapshot.cache-size",
   327  		Usage:  "Size of in-memory cache of the state snapshot cache (in MiB)",
   328  		Value:  512,
   329  		EnvVar: "KLAYTN_SNAPSHOT_CACHE_SIZE",
   330  	}
   331  	SnapshotAsyncGen = cli.BoolTFlag{
   332  		Name:   "snapshot.async-gen",
   333  		Usage:  "Enables snapshot data generation in background",
   334  		EnvVar: "KLAYTN_SNAPSHOT_BACKGROUND_GENERATION",
   335  	}
   336  	TrieMemoryCacheSizeFlag = cli.IntFlag{
   337  		Name:   "state.cache-size",
   338  		Usage:  "Size of in-memory cache of the global state (in MiB) to flush matured singleton trie nodes to disk",
   339  		Value:  512,
   340  		EnvVar: "KLAYTN_STATE_CACHE_SIZE",
   341  	}
   342  	TrieBlockIntervalFlag = cli.UintFlag{
   343  		Name:   "state.block-interval",
   344  		Usage:  "An interval in terms of block number to commit the global state to disk",
   345  		Value:  blockchain.DefaultBlockInterval,
   346  		EnvVar: "KLAYTN_STATE_BLOCK_INTERVAL",
   347  	}
   348  	TriesInMemoryFlag = cli.Uint64Flag{
   349  		Name:   "state.tries-in-memory",
   350  		Usage:  "The number of recent state tries residing in the memory",
   351  		Value:  blockchain.DefaultTriesInMemory,
   352  		EnvVar: "KLAYTN_STATE_TRIES_IN_MEMORY",
   353  	}
   354  	CacheTypeFlag = cli.IntFlag{
   355  		Name:   "cache.type",
   356  		Usage:  "Cache Type: 0=LRUCache, 1=LRUShardCache, 2=FIFOCache",
   357  		Value:  int(common.DefaultCacheType),
   358  		EnvVar: "KLAYTN_CACHE_TYPE",
   359  	}
   360  	CacheScaleFlag = cli.IntFlag{
   361  		Name:   "cache.scale",
   362  		Usage:  "Scale of cache (cache size = preset size * scale of cache(%))",
   363  		EnvVar: "KLAYTN_CACHE_SCALE",
   364  	}
   365  	CacheUsageLevelFlag = cli.StringFlag{
   366  		Name:   "cache.level",
   367  		Usage:  "Set the cache usage level ('saving', 'normal', 'extreme')",
   368  		EnvVar: "KLAYTN_CACHE_LEVEL",
   369  	}
   370  	MemorySizeFlag = cli.IntFlag{
   371  		Name:   "cache.memory",
   372  		Usage:  "Set the physical RAM size (GB, Default: 16GB)",
   373  		EnvVar: "KLAYTN_CACHE_MEMORY",
   374  	}
   375  	TrieNodeCacheTypeFlag = cli.StringFlag{
   376  		Name: "statedb.cache.type",
   377  		Usage: "Set trie node cache type ('LocalCache', 'RemoteCache', " +
   378  			"'HybridCache') (default = 'LocalCache')",
   379  		Value:  string(statedb.CacheTypeLocal),
   380  		EnvVar: "KLAYTN_STATEDB_CACHE_TYPE",
   381  	}
   382  	NumFetcherPrefetchWorkerFlag = cli.IntFlag{
   383  		Name:   "statedb.cache.num-fetcher-prefetch-worker",
   384  		Usage:  "Number of workers used to prefetch block when fetcher fetches block",
   385  		Value:  32,
   386  		EnvVar: "KLAYTN_STATEDB_CACHE_NUM_FETCHER_PREFETCH_WORKER",
   387  	}
   388  	UseSnapshotForPrefetchFlag = cli.BoolFlag{
   389  		Name:   "statedb.cache.use-snapshot-for-prefetch",
   390  		Usage:  "Use state snapshot functionality while prefetching",
   391  		EnvVar: "KLAYTN_STATEDB_CACHE_USE_SNAPSHOT_FOR_PREFETCH",
   392  	}
   393  	TrieNodeCacheRedisEndpointsFlag = cli.StringSliceFlag{
   394  		Name:   "statedb.cache.redis.endpoints",
   395  		Usage:  "Set endpoints of redis trie node cache. More than one endpoints can be set",
   396  		EnvVar: "KLAYTN_STATEDB_CACHE_REDIS_ENDPOINTS",
   397  	}
   398  	TrieNodeCacheRedisClusterFlag = cli.BoolFlag{
   399  		Name:   "statedb.cache.redis.cluster",
   400  		Usage:  "Enables cluster-enabled mode of redis trie node cache",
   401  		EnvVar: "KLAYTN_STATEDB_CACHE_REDIS_CLUSTER",
   402  	}
   403  	TrieNodeCacheRedisPublishBlockFlag = cli.BoolFlag{
   404  		Name:   "statedb.cache.redis.publish",
   405  		Usage:  "Publishes every committed block to redis trie node cache",
   406  		EnvVar: "KLAYTN_STATEDB_CACHE_REDIS_PUBLISH",
   407  	}
   408  	TrieNodeCacheRedisSubscribeBlockFlag = cli.BoolFlag{
   409  		Name:   "statedb.cache.redis.subscribe",
   410  		Usage:  "Subscribes blocks from redis trie node cache",
   411  		EnvVar: "KLAYTN_STATEDB_CACHE_REDIS_SUBSCRIBE",
   412  	}
   413  	TrieNodeCacheLimitFlag = cli.IntFlag{
   414  		Name:   "state.trie-cache-limit",
   415  		Usage:  "Memory allowance (MiB) to use for caching trie nodes in memory. -1 is for auto-scaling",
   416  		Value:  -1,
   417  		EnvVar: "KLAYTN_STATE_TRIE_CACHE_LIMIT",
   418  	}
   419  	TrieNodeCacheSavePeriodFlag = cli.DurationFlag{
   420  		Name:   "state.trie-cache-save-period",
   421  		Usage:  "Period of saving in memory trie cache to file if fastcache is used, 0 means disabled",
   422  		Value:  0,
   423  		EnvVar: "KLAYTN_STATE_TRIE_CACHE_SAVE_PERIOD",
   424  	}
   425  	SenderTxHashIndexingFlag = cli.BoolFlag{
   426  		Name:   "sendertxhashindexing",
   427  		Usage:  "Enables storing mapping information of senderTxHash to txHash",
   428  		EnvVar: "KLAYTN_SENDERTXHASHINDEXING",
   429  	}
   430  	ChildChainIndexingFlag = cli.BoolFlag{
   431  		Name:   "childchainindexing",
   432  		Usage:  "Enables storing transaction hash of child chain transaction for fast access to child chain data",
   433  		EnvVar: "KLAYTN_CHILDCHAININDEXING",
   434  	}
   435  	TargetGasLimitFlag = cli.Uint64Flag{
   436  		Name:   "targetgaslimit",
   437  		Usage:  "Target gas limit sets the artificial target gas floor for the blocks to mine",
   438  		Value:  params.GenesisGasLimit,
   439  		EnvVar: "KLAYTN_TARGETGASLIMIT",
   440  	}
   441  	ServiceChainSignerFlag = cli.StringFlag{
   442  		Name:   "scsigner",
   443  		Usage:  "Public address for signing blocks in the service chain (default = first account created)",
   444  		Value:  "0",
   445  		EnvVar: "KLAYTN_SCSIGNER",
   446  	}
   447  	RewardbaseFlag = cli.StringFlag{
   448  		Name:   "rewardbase",
   449  		Usage:  "Public address for block consensus rewards (default = first account created)",
   450  		Value:  "0",
   451  		EnvVar: "KLAYTN_REWARDBASE",
   452  	}
   453  	ExtraDataFlag = cli.StringFlag{
   454  		Name:   "extradata",
   455  		Usage:  "Block extra data set by the work (default = client version)",
   456  		EnvVar: "KLAYTN_EXTRADATA",
   457  	}
   458  
   459  	TxResendIntervalFlag = cli.Uint64Flag{
   460  		Name:   "txresend.interval",
   461  		Usage:  "Set the transaction resend interval in seconds",
   462  		Value:  uint64(cn.DefaultTxResendInterval),
   463  		EnvVar: "KLAYTN_TXRESEND_INTERVAL",
   464  	}
   465  	TxResendCountFlag = cli.IntFlag{
   466  		Name:   "txresend.max-count",
   467  		Usage:  "Set the max count of resending transactions",
   468  		Value:  cn.DefaultMaxResendTxCount,
   469  		EnvVar: "KLAYTN_TXRESEND_MAX_COUNT",
   470  	}
   471  	// TODO-Klaytn-RemoveLater Remove this flag when we are confident with the new transaction resend logic
   472  	TxResendUseLegacyFlag = cli.BoolFlag{
   473  		Name:   "txresend.use-legacy",
   474  		Usage:  "Enable the legacy transaction resend logic (For testing only)",
   475  		EnvVar: "KLAYTN_TXRESEND_USE_LEGACY",
   476  	}
   477  	// Account settings
   478  	UnlockedAccountFlag = cli.StringFlag{
   479  		Name:   "unlock",
   480  		Usage:  "Comma separated list of accounts to unlock",
   481  		Value:  "",
   482  		EnvVar: "KLAYTN_UNLOCK",
   483  	}
   484  	PasswordFileFlag = cli.StringFlag{
   485  		Name:   "password",
   486  		Usage:  "Password file to use for non-interactive password input",
   487  		Value:  "",
   488  		EnvVar: "KLAYTN_PASSWORD",
   489  	}
   490  
   491  	VMEnableDebugFlag = cli.BoolFlag{
   492  		Name:   "vmdebug",
   493  		Usage:  "Record information useful for VM and contract debugging",
   494  		EnvVar: "KLAYTN_VMDEBUG",
   495  	}
   496  	VMLogTargetFlag = cli.IntFlag{
   497  		Name:   "vmlog",
   498  		Usage:  "Set the output target of vmlog precompiled contract (0: no output, 1: file, 2: stdout, 3: both)",
   499  		Value:  0,
   500  		EnvVar: "KLAYTN_VMLOG",
   501  	}
   502  	VMTraceInternalTxFlag = cli.BoolFlag{
   503  		Name:   "vm.internaltx",
   504  		Usage:  "Collect internal transaction data while processing a block",
   505  		EnvVar: "KLAYTN_VM_INTERNALTX",
   506  	}
   507  
   508  	// Logging and debug settings
   509  	MetricsEnabledFlag = cli.BoolFlag{
   510  		Name:   metricutils.MetricsEnabledFlag,
   511  		Usage:  "Enable metrics collection and reporting",
   512  		EnvVar: "KLAYTN_METRICUTILS_METRICSENABLEDFLAG",
   513  	}
   514  	PrometheusExporterFlag = cli.BoolFlag{
   515  		Name:   metricutils.PrometheusExporterFlag,
   516  		Usage:  "Enable prometheus exporter",
   517  		EnvVar: "KLAYTN_METRICUTILS_PROMETHEUSEXPORTERFLAG",
   518  	}
   519  	PrometheusExporterPortFlag = cli.IntFlag{
   520  		Name:   metricutils.PrometheusExporterPortFlag,
   521  		Usage:  "Prometheus exporter listening port",
   522  		Value:  61001,
   523  		EnvVar: "KLAYTN_METRICUTILS_PROMETHEUSEXPORTERPORTFLAG",
   524  	}
   525  	// RPC settings
   526  	RPCEnabledFlag = cli.BoolFlag{
   527  		Name:   "rpc",
   528  		Usage:  "Enable the HTTP-RPC server",
   529  		EnvVar: "KLAYTN_RPC",
   530  	}
   531  	RPCListenAddrFlag = cli.StringFlag{
   532  		Name:   "rpcaddr",
   533  		Usage:  "HTTP-RPC server listening interface",
   534  		Value:  node.DefaultHTTPHost,
   535  		EnvVar: "KLAYTN_RPCADDR",
   536  	}
   537  	RPCPortFlag = cli.IntFlag{
   538  		Name:   "rpcport",
   539  		Usage:  "HTTP-RPC server listening port",
   540  		Value:  node.DefaultHTTPPort,
   541  		EnvVar: "KLAYTN_RPCPORT",
   542  	}
   543  	RPCCORSDomainFlag = cli.StringFlag{
   544  		Name:   "rpccorsdomain",
   545  		Usage:  "Comma separated list of domains from which to accept cross origin requests (browser enforced)",
   546  		Value:  "",
   547  		EnvVar: "KLAYTN_RPCCORSDOMAIN",
   548  	}
   549  	RPCVirtualHostsFlag = cli.StringFlag{
   550  		Name:   "rpcvhosts",
   551  		Usage:  "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.",
   552  		Value:  strings.Join(node.DefaultConfig.HTTPVirtualHosts, ","),
   553  		EnvVar: "KLAYTN_RPCVHOSTS",
   554  	}
   555  	RPCApiFlag = cli.StringFlag{
   556  		Name:   "rpcapi",
   557  		Usage:  "API's offered over the HTTP-RPC interface",
   558  		Value:  "",
   559  		EnvVar: "KLAYTN_RPCAPI",
   560  	}
   561  	RPCGlobalGasCap = cli.Uint64Flag{
   562  		Name:   "rpc.gascap",
   563  		Usage:  "Sets a cap on gas that can be used in klay_call/estimateGas",
   564  		EnvVar: "KLAYTN_RPC_GASCAP",
   565  	}
   566  	RPCGlobalEVMTimeoutFlag = cli.DurationFlag{
   567  		Name:   "rpc.evmtimeout",
   568  		Usage:  "Sets a timeout used for eth_call (0=infinite)",
   569  		EnvVar: "KLAYTN_RPC_EVMTIMEOUT",
   570  	}
   571  	RPCGlobalEthTxFeeCapFlag = cli.Float64Flag{
   572  		Name:   "rpc.ethtxfeecap",
   573  		Usage:  "Sets a cap on transaction fee (in klay) that can be sent via the eth namespace RPC APIs (0 = no cap)",
   574  		EnvVar: "KLAYTN_RPC_ETHTXFEECAP",
   575  	}
   576  	RPCConcurrencyLimit = cli.IntFlag{
   577  		Name:   "rpc.concurrencylimit",
   578  		Usage:  "Sets a limit of concurrent connection number of HTTP-RPC server",
   579  		Value:  rpc.ConcurrencyLimit,
   580  		EnvVar: "KLAYTN_RPC_CONCURRENCYLIMIT",
   581  	}
   582  	RPCNonEthCompatibleFlag = cli.BoolFlag{
   583  		Name:   "rpc.eth.noncompatible",
   584  		Usage:  "Disables the eth namespace API return formatting for compatibility",
   585  		EnvVar: "KLAYTN_RPC_ETH_NONCOMPATIBLE",
   586  	}
   587  	WSEnabledFlag = cli.BoolFlag{
   588  		Name:   "ws",
   589  		Usage:  "Enable the WS-RPC server",
   590  		EnvVar: "KLAYTN_WS",
   591  	}
   592  	WSListenAddrFlag = cli.StringFlag{
   593  		Name:   "wsaddr",
   594  		Usage:  "WS-RPC server listening interface",
   595  		Value:  node.DefaultWSHost,
   596  		EnvVar: "KLAYTN_WSADDR",
   597  	}
   598  	WSPortFlag = cli.IntFlag{
   599  		Name:   "wsport",
   600  		Usage:  "WS-RPC server listening port",
   601  		Value:  node.DefaultWSPort,
   602  		EnvVar: "KLAYTN_WSPORT",
   603  	}
   604  	WSApiFlag = cli.StringFlag{
   605  		Name:   "wsapi",
   606  		Usage:  "API's offered over the WS-RPC interface",
   607  		Value:  "",
   608  		EnvVar: "KLAYTN_WSAPI",
   609  	}
   610  	WSAllowedOriginsFlag = cli.StringFlag{
   611  		Name:   "wsorigins",
   612  		Usage:  "Origins from which to accept websockets requests",
   613  		Value:  "",
   614  		EnvVar: "KLAYTN_WSORIGINS",
   615  	}
   616  	WSMaxSubscriptionPerConn = cli.IntFlag{
   617  		Name:   "wsmaxsubscriptionperconn",
   618  		Usage:  "Allowed maximum subscription number per a websocket connection",
   619  		Value:  int(rpc.MaxSubscriptionPerWSConn),
   620  		EnvVar: "KLAYTN_WSMAXSUBSCRIPTIONPERCONN",
   621  	}
   622  	WSReadDeadLine = cli.Int64Flag{
   623  		Name:   "wsreaddeadline",
   624  		Usage:  "Set the read deadline on the underlying network connection in seconds. 0 means read will not timeout",
   625  		Value:  rpc.WebsocketReadDeadline,
   626  		EnvVar: "KLAYTN_WSREADDEADLINE",
   627  	}
   628  	WSWriteDeadLine = cli.Int64Flag{
   629  		Name:   "wswritedeadline",
   630  		Usage:  "Set the Write deadline on the underlying network connection in seconds. 0 means write will not timeout",
   631  		Value:  rpc.WebsocketWriteDeadline,
   632  		EnvVar: "KLAYTN_WSWRITEDEADLINE",
   633  	}
   634  	WSMaxConnections = cli.IntFlag{
   635  		Name:   "wsmaxconnections",
   636  		Usage:  "Allowed maximum websocket connection number",
   637  		Value:  3000,
   638  		EnvVar: "KLAYTN_WSMAXCONNECTIONS",
   639  	}
   640  	GRPCEnabledFlag = cli.BoolFlag{
   641  		Name:   "grpc",
   642  		Usage:  "Enable the gRPC server",
   643  		EnvVar: "KLAYTN_GRPC",
   644  	}
   645  	GRPCListenAddrFlag = cli.StringFlag{
   646  		Name:   "grpcaddr",
   647  		Usage:  "gRPC server listening interface",
   648  		Value:  node.DefaultGRPCHost,
   649  		EnvVar: "KLAYTN_GRPCADDR",
   650  	}
   651  	GRPCPortFlag = cli.IntFlag{
   652  		Name:   "grpcport",
   653  		Usage:  "gRPC server listening port",
   654  		Value:  node.DefaultGRPCPort,
   655  		EnvVar: "KLAYTN_GRPCPORT",
   656  	}
   657  	IPCDisabledFlag = cli.BoolFlag{
   658  		Name:   "ipcdisable",
   659  		Usage:  "Disable the IPC-RPC server",
   660  		EnvVar: "KLAYTN_IPCDISABLE",
   661  	}
   662  	IPCPathFlag = DirectoryFlag{
   663  		Name:   "ipcpath",
   664  		Usage:  "Filename for IPC socket/pipe within the datadir (explicit paths escape it)",
   665  		EnvVar: "KLAYTN_IPCPATH",
   666  	}
   667  	ExecFlag = cli.StringFlag{
   668  		Name:   "exec",
   669  		Usage:  "Execute JavaScript statement",
   670  		EnvVar: "KLAYTN_EXEC",
   671  	}
   672  	PreloadJSFlag = cli.StringFlag{
   673  		Name:   "preload",
   674  		Usage:  "Comma separated list of JavaScript files to preload into the console",
   675  		EnvVar: "KLAYTN_PRELOAD",
   676  	}
   677  	APIFilterGetLogsDeadlineFlag = cli.DurationFlag{
   678  		Name:   "api.filter.getLogs.deadline",
   679  		Usage:  "Execution deadline for log collecting filter APIs",
   680  		Value:  filters.GetLogsDeadline,
   681  		EnvVar: "KLAYTN_API_FILTER_GETLOGS_DEADLINE",
   682  	}
   683  	APIFilterGetLogsMaxItemsFlag = cli.IntFlag{
   684  		Name:   "api.filter.getLogs.maxitems",
   685  		Usage:  "Maximum allowed number of return items for log collecting filter API",
   686  		Value:  filters.GetLogsMaxItems,
   687  		EnvVar: "KLAYTN_API_FILTER_GETLOGS_MAXITEMS",
   688  	}
   689  	RPCReadTimeout = cli.IntFlag{
   690  		Name:   "rpcreadtimeout",
   691  		Usage:  "HTTP-RPC server read timeout (seconds)",
   692  		Value:  int(rpc.DefaultHTTPTimeouts.ReadTimeout / time.Second),
   693  		EnvVar: "KLAYTN_RPCREADTIMEOUT",
   694  	}
   695  	RPCWriteTimeoutFlag = cli.IntFlag{
   696  		Name:   "rpcwritetimeout",
   697  		Usage:  "HTTP-RPC server write timeout (seconds)",
   698  		Value:  int(rpc.DefaultHTTPTimeouts.WriteTimeout / time.Second),
   699  		EnvVar: "KLAYTN_RPCWRITETIMEOUT",
   700  	}
   701  	RPCIdleTimeoutFlag = cli.IntFlag{
   702  		Name:   "rpcidletimeout",
   703  		Usage:  "HTTP-RPC server idle timeout (seconds)",
   704  		Value:  int(rpc.DefaultHTTPTimeouts.IdleTimeout / time.Second),
   705  		EnvVar: "KLAYTN_RPCIDLETIMEOUT",
   706  	}
   707  	RPCExecutionTimeoutFlag = cli.IntFlag{
   708  		Name:   "rpcexecutiontimeout",
   709  		Usage:  "HTTP-RPC server execution timeout (seconds)",
   710  		Value:  int(rpc.DefaultHTTPTimeouts.ExecutionTimeout / time.Second),
   711  		EnvVar: "KLAYTN_RPCEXECUTIONTIMEOUT",
   712  	}
   713  	UnsafeDebugDisableFlag = cli.BoolFlag{
   714  		Name:   "rpc.unsafe-debug.disable",
   715  		Usage:  "Disable unsafe debug APIs (traceTransaction, writeXXX, ...).",
   716  		EnvVar: "KLAYTN_RPC_UNSAFE_DEBUG_DISABLE",
   717  	}
   718  
   719  	// Network Settings
   720  	NodeTypeFlag = cli.StringFlag{
   721  		Name:   "nodetype",
   722  		Usage:  "Klaytn node type (consensus node (cn), proxy node (pn), endpoint node (en))",
   723  		Value:  "en",
   724  		EnvVar: "KLAYTN_NODETYPE",
   725  	}
   726  	MaxConnectionsFlag = cli.IntFlag{
   727  		Name:   "maxconnections",
   728  		Usage:  "Maximum number of physical connections. All single channel peers can be maxconnections peers. All multi channel peers can be maxconnections/2 peers. (network disabled if set to 0)",
   729  		Value:  node.DefaultMaxPhysicalConnections,
   730  		EnvVar: "KLAYTN_MAXCONNECTIONS",
   731  	}
   732  	MaxPendingPeersFlag = cli.IntFlag{
   733  		Name:   "maxpendpeers",
   734  		Usage:  "Maximum number of pending connection attempts (defaults used if set to 0)",
   735  		Value:  0,
   736  		EnvVar: "KLAYTN_MAXPENDPEERS",
   737  	}
   738  	ListenPortFlag = cli.IntFlag{
   739  		Name:   "port",
   740  		Usage:  "Network listening port",
   741  		Value:  node.DefaultP2PPort,
   742  		EnvVar: "KLAYTN_PORT",
   743  	}
   744  	SubListenPortFlag = cli.IntFlag{
   745  		Name:   "subport",
   746  		Usage:  "Network sub listening port",
   747  		Value:  node.DefaultP2PSubPort,
   748  		EnvVar: "KLAYTN_SUBPORT",
   749  	}
   750  	MultiChannelUseFlag = cli.BoolFlag{
   751  		Name:   "multichannel",
   752  		Usage:  "Create a dedicated channel for block propagation",
   753  		EnvVar: "KLAYTN_MULTICHANNEL",
   754  	}
   755  	BootnodesFlag = cli.StringFlag{
   756  		Name:   "bootnodes",
   757  		Usage:  "Comma separated kni URLs for P2P discovery bootstrap",
   758  		Value:  "",
   759  		EnvVar: "KLAYTN_BOOTNODES",
   760  	}
   761  	NodeKeyFileFlag = cli.StringFlag{
   762  		Name:   "nodekey",
   763  		Usage:  "P2P node key file",
   764  		EnvVar: "KLAYTN_NODEKEY",
   765  	}
   766  	NodeKeyHexFlag = cli.StringFlag{
   767  		Name:   "nodekeyhex",
   768  		Usage:  "P2P node key as hex (for testing)",
   769  		EnvVar: "KLAYTN_NODEKEYHEX",
   770  	}
   771  	NATFlag = cli.StringFlag{
   772  		Name:   "nat",
   773  		Usage:  "NAT port mapping mechanism (any|none|upnp|pmp|extip:<IP>)",
   774  		Value:  "any",
   775  		EnvVar: "KLAYTN_NAT",
   776  	}
   777  	NoDiscoverFlag = cli.BoolFlag{
   778  		Name:   "nodiscover",
   779  		Usage:  "Disables the peer discovery mechanism (manual peer addition)",
   780  		EnvVar: "KLAYTN_NODISCOVER",
   781  	}
   782  	NetrestrictFlag = cli.StringFlag{
   783  		Name:   "netrestrict",
   784  		Usage:  "Restricts network communication to the given IP network (CIDR masks)",
   785  		EnvVar: "KLAYTN_NETRESTRICT",
   786  	}
   787  	AnchoringPeriodFlag = cli.Uint64Flag{
   788  		Name:   "chaintxperiod",
   789  		Usage:  "The period to make and send a chain transaction to the parent chain",
   790  		Value:  1,
   791  		EnvVar: "KLAYTN_CHAINTXPERIOD",
   792  	}
   793  	SentChainTxsLimit = cli.Uint64Flag{
   794  		Name:   "chaintxlimit",
   795  		Usage:  "Number of service chain transactions stored for resending",
   796  		Value:  100,
   797  		EnvVar: "KLAYTN_CHAINTXLIMIT",
   798  	}
   799  	RWTimerIntervalFlag = cli.Uint64Flag{
   800  		Name:   "rwtimerinterval",
   801  		Usage:  "Interval of using rw timer to check if it works well",
   802  		Value:  1000,
   803  		EnvVar: "KLAYTN_RWTIMERINTERVAL",
   804  	}
   805  	RWTimerWaitTimeFlag = cli.DurationFlag{
   806  		Name:   "rwtimerwaittime",
   807  		Usage:  "Wait time the rw timer waits for message writing",
   808  		Value:  15 * time.Second,
   809  		EnvVar: "KLAYTN_RWTIMERWAITTIME",
   810  	}
   811  	MaxRequestContentLengthFlag = cli.IntFlag{
   812  		Name:   "maxRequestContentLength",
   813  		Usage:  "Max request content length in byte for http, websocket and gRPC",
   814  		Value:  common.MaxRequestContentLength,
   815  		EnvVar: "KLAYTN_MAXREQUESTCONTENTLENGTH",
   816  	}
   817  
   818  	// ATM the url is left to the user and deployment to
   819  	JSpathFlag = cli.StringFlag{
   820  		Name:   "jspath",
   821  		Usage:  "JavaScript root path for `loadScript`",
   822  		Value:  ".",
   823  		EnvVar: "KLAYTN_JSPATH",
   824  	}
   825  	CypressFlag = cli.BoolFlag{
   826  		Name:   "cypress",
   827  		Usage:  "Pre-configured Klaytn Cypress network",
   828  		EnvVar: "KLAYTN_CYPRESS",
   829  	}
   830  	// Baobab bootnodes setting
   831  	BaobabFlag = cli.BoolFlag{
   832  		Name:   "baobab",
   833  		Usage:  "Pre-configured Klaytn baobab network",
   834  		EnvVar: "KLAYTN_BAOBAB",
   835  	}
   836  	// Bootnode's settings
   837  	AuthorizedNodesFlag = cli.StringFlag{
   838  		Name:   "authorized-nodes",
   839  		Usage:  "Comma separated kni URLs for authorized nodes list",
   840  		Value:  "",
   841  		EnvVar: "KLAYTN_AUTHORIZED_NODES",
   842  	}
   843  	// TODO-Klaytn-Bootnode the boodnode flags should be updated when it is implemented
   844  	BNAddrFlag = cli.StringFlag{
   845  		Name:   "bnaddr",
   846  		Usage:  `udp address to use node discovery`,
   847  		Value:  ":32323",
   848  		EnvVar: "KLAYTN_BNADDR",
   849  	}
   850  	GenKeyFlag = cli.StringFlag{
   851  		Name:   "genkey",
   852  		Usage:  "generate a node private key and write to given filename",
   853  		EnvVar: "KLAYTN_GENKEY",
   854  	}
   855  	WriteAddressFlag = cli.BoolFlag{
   856  		Name:   "writeaddress",
   857  		Usage:  `write out the node's public key which is given by "--nodekeyfile" or "--nodekeyhex"`,
   858  		EnvVar: "KLAYTN_WRITEADDRESS",
   859  	}
   860  	// ServiceChain's settings
   861  	MainBridgeFlag = cli.BoolFlag{
   862  		Name:   "mainbridge",
   863  		Usage:  "Enable main bridge service for service chain",
   864  		EnvVar: "KLAYTN_MAINBRIDGE",
   865  	}
   866  	SubBridgeFlag = cli.BoolFlag{
   867  		Name:   "subbridge",
   868  		Usage:  "Enable sub bridge service for service chain",
   869  		EnvVar: "KLAYTN_SUBBRIDGE",
   870  	}
   871  	MainBridgeListenPortFlag = cli.IntFlag{
   872  		Name:   "mainbridgeport",
   873  		Usage:  "main bridge listen port",
   874  		Value:  50505,
   875  		EnvVar: "KLAYTN_MAINBRIDGEPORT",
   876  	}
   877  	SubBridgeListenPortFlag = cli.IntFlag{
   878  		Name:   "subbridgeport",
   879  		Usage:  "sub bridge listen port",
   880  		Value:  50506,
   881  		EnvVar: "KLAYTN_SUBBRIDGEPORT",
   882  	}
   883  	ParentChainIDFlag = cli.IntFlag{
   884  		Name:   "parentchainid",
   885  		Usage:  "parent chain ID",
   886  		Value:  8217, // Klaytn mainnet chain ID
   887  		EnvVar: "KLAYTN_PARENTCHAINID",
   888  	}
   889  	VTRecoveryFlag = cli.BoolFlag{
   890  		Name:   "vtrecovery",
   891  		Usage:  "Enable value transfer recovery (default: false)",
   892  		EnvVar: "KLAYTN_VTRECOVERY",
   893  	}
   894  	VTRecoveryIntervalFlag = cli.Uint64Flag{
   895  		Name:   "vtrecoveryinterval",
   896  		Usage:  "Set the value transfer recovery interval (seconds)",
   897  		Value:  5,
   898  		EnvVar: "KLAYTN_VTRECOVERYINTERVAL",
   899  	}
   900  	ServiceChainParentOperatorTxGasLimitFlag = cli.Uint64Flag{
   901  		Name:   "sc.parentoperator.gaslimit",
   902  		Usage:  "Set the default value of gas limit for transactions made by bridge parent operator",
   903  		Value:  10000000,
   904  		EnvVar: "KLAYTN_SC_PARENTOPERATOR_GASLIMIT",
   905  	}
   906  	ServiceChainChildOperatorTxGasLimitFlag = cli.Uint64Flag{
   907  		Name:   "sc.childoperator.gaslimit",
   908  		Usage:  "Set the default value of gas limit for transactions made by bridge child operator",
   909  		Value:  10000000,
   910  		EnvVar: "KLAYTN_SC_CHILDOPERATOR_GASLIMIT",
   911  	}
   912  	ServiceChainNewAccountFlag = cli.BoolFlag{
   913  		Name:   "scnewaccount",
   914  		Usage:  "Enable account creation for the service chain (default: false). If set true, generated account can't be synced with the parent chain.",
   915  		EnvVar: "KLAYTN_SCNEWACCOUNT",
   916  	}
   917  	ServiceChainConsensusFlag = cli.StringFlag{
   918  		Name:   "scconsensus",
   919  		Usage:  "Set the service chain consensus (\"istanbul\", \"clique\")",
   920  		Value:  "istanbul",
   921  		EnvVar: "KLAYTN_SCCONSENSUS",
   922  	}
   923  	ServiceChainAnchoringFlag = cli.BoolFlag{
   924  		Name:   "anchoring",
   925  		Usage:  "Enable anchoring for service chain",
   926  		EnvVar: "KLAYTN_ANCHORING",
   927  	}
   928  
   929  	// KAS
   930  	KASServiceChainAnchorFlag = cli.BoolFlag{
   931  		Name:   "kas.sc.anchor",
   932  		Usage:  "Enable KAS anchoring for service chain",
   933  		EnvVar: "KLAYTN_KAS_SC_ANCHOR",
   934  	}
   935  	KASServiceChainAnchorPeriodFlag = cli.Uint64Flag{
   936  		Name:   "kas.sc.anchor.period",
   937  		Usage:  "The period to anchor service chain blocks to KAS",
   938  		Value:  1,
   939  		EnvVar: "KLAYTN_KAS_SC_ANCHOR_PERIOD",
   940  	}
   941  	KASServiceChainAnchorUrlFlag = cli.StringFlag{
   942  		Name:   "kas.sc.anchor.url",
   943  		Usage:  "The url for KAS anchor",
   944  		EnvVar: "KLAYTN_KAS_SC_ANCHOR_URL",
   945  	}
   946  	KASServiceChainAnchorOperatorFlag = cli.StringFlag{
   947  		Name:   "kas.sc.anchor.operator",
   948  		Usage:  "The operator address for KAS anchor",
   949  		EnvVar: "KLAYTN_KAS_SC_ANCHOR_OPERATOR",
   950  	}
   951  	KASServiceChainAnchorRequestTimeoutFlag = cli.DurationFlag{
   952  		Name:   "kas.sc.anchor.request.timeout",
   953  		Usage:  "The reuqest timeout for KAS Anchoring API call",
   954  		Value:  500 * time.Millisecond,
   955  		EnvVar: "KLAYTN_KAS_SC_ANCHOR_REQUEST_TIMEOUT",
   956  	}
   957  	KASServiceChainXChainIdFlag = cli.StringFlag{
   958  		Name:   "kas.x-chain-id",
   959  		Usage:  "The x-chain-id for KAS",
   960  		EnvVar: "KLAYTN_KAS_X_CHAIN_ID",
   961  	}
   962  	KASServiceChainAccessKeyFlag = cli.StringFlag{
   963  		Name:   "kas.accesskey",
   964  		Usage:  "The access key id for KAS",
   965  		EnvVar: "KLAYTN_KAS_ACCESSKEY",
   966  	}
   967  	KASServiceChainSecretKeyFlag = cli.StringFlag{
   968  		Name:   "kas.secretkey",
   969  		Usage:  "The secret key for KAS",
   970  		EnvVar: "KLAYTN_KAS_SECRETKEY",
   971  	}
   972  
   973  	// ChainDataFetcher
   974  	EnableChainDataFetcherFlag = cli.BoolFlag{
   975  		Name:   "chaindatafetcher",
   976  		Usage:  "Enable the ChainDataFetcher Service",
   977  		EnvVar: "KLAYTN_CHAINDATAFETCHER",
   978  	}
   979  	ChainDataFetcherMode = cli.StringFlag{
   980  		Name:   "chaindatafetcher.mode",
   981  		Usage:  "The mode of chaindatafetcher (\"kas\", \"kafka\")",
   982  		Value:  "kas",
   983  		EnvVar: "KLAYTN_CHAINDATAFETCHER_MODE",
   984  	}
   985  	ChainDataFetcherNoDefault = cli.BoolFlag{
   986  		Name:   "chaindatafetcher.no.default",
   987  		Usage:  "Turn off the starting of the chaindatafetcher",
   988  		EnvVar: "KLAYTN_CHAINDATAFETCHER_NO_DEFAULT",
   989  	}
   990  	ChainDataFetcherNumHandlers = cli.IntFlag{
   991  		Name:   "chaindatafetcher.num.handlers",
   992  		Usage:  "Number of chaindata handlers",
   993  		Value:  chaindatafetcher.DefaultNumHandlers,
   994  		EnvVar: "KLAYTN_CHAINDATAFETCHER_NUM_HANDLERS",
   995  	}
   996  	ChainDataFetcherJobChannelSize = cli.IntFlag{
   997  		Name:   "chaindatafetcher.job.channel.size",
   998  		Usage:  "Job channel size",
   999  		Value:  chaindatafetcher.DefaultJobChannelSize,
  1000  		EnvVar: "KLAYTN_CHAINDATAFETCHER_JOB_CHANNEL_SIZE",
  1001  	}
  1002  	ChainDataFetcherChainEventSizeFlag = cli.IntFlag{
  1003  		Name:   "chaindatafetcher.block.channel.size",
  1004  		Usage:  "Block received channel size",
  1005  		Value:  chaindatafetcher.DefaultJobChannelSize,
  1006  		EnvVar: "KLAYTN_CHAINDATAFETCHER_BLOCK_CHANNEL_SIZE",
  1007  	}
  1008  	ChainDataFetcherMaxProcessingDataSize = cli.IntFlag{
  1009  		Name:   "chaindatafetcher.max.processing.data.size",
  1010  		Usage:  "Maximum size of processing data before requesting range fetching of blocks (in MB)",
  1011  		Value:  chaindatafetcher.DefaultMaxProcessingDataSize,
  1012  		EnvVar: "KLAYTN_CHAINDATAFETCHER_MAX_PROCESSING_DATA_SIZE",
  1013  	}
  1014  	ChainDataFetcherKASDBHostFlag = cli.StringFlag{
  1015  		Name:   "chaindatafetcher.kas.db.host",
  1016  		Usage:  "KAS specific DB host in chaindatafetcher",
  1017  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_DB_HOST",
  1018  	}
  1019  	ChainDataFetcherKASDBPortFlag = cli.StringFlag{
  1020  		Name:   "chaindatafetcher.kas.db.port",
  1021  		Usage:  "KAS specific DB port in chaindatafetcher",
  1022  		Value:  chaindatafetcher.DefaultDBPort,
  1023  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_DB_PORT",
  1024  	}
  1025  	ChainDataFetcherKASDBNameFlag = cli.StringFlag{
  1026  		Name:   "chaindatafetcher.kas.db.name",
  1027  		Usage:  "KAS specific DB name in chaindatafetcher",
  1028  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_DB_NAME",
  1029  	}
  1030  	ChainDataFetcherKASDBUserFlag = cli.StringFlag{
  1031  		Name:   "chaindatafetcher.kas.db.user",
  1032  		Usage:  "KAS specific DB user in chaindatafetcher",
  1033  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_DB_USER",
  1034  	}
  1035  	ChainDataFetcherKASDBPasswordFlag = cli.StringFlag{
  1036  		Name:   "chaindatafetcher.kas.db.password",
  1037  		Usage:  "KAS specific DB password in chaindatafetcher",
  1038  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_DB_PASSWORD",
  1039  	}
  1040  	ChainDataFetcherKASCacheUse = cli.BoolFlag{
  1041  		Name:   "chaindatafetcher.kas.cache.use",
  1042  		Usage:  "Enable KAS cache invalidation",
  1043  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_CACHE_USE",
  1044  	}
  1045  	ChainDataFetcherKASCacheURLFlag = cli.StringFlag{
  1046  		Name:   "chaindatafetcher.kas.cache.url",
  1047  		Usage:  "KAS specific cache invalidate API endpoint in chaindatafetcher",
  1048  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_CACHE_URL",
  1049  	}
  1050  	ChainDataFetcherKASXChainIdFlag = cli.StringFlag{
  1051  		Name:   "chaindatafetcher.kas.xchainid",
  1052  		Usage:  "KAS specific header x-chain-id in chaindatafetcher",
  1053  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_XCHAINID",
  1054  	}
  1055  	ChainDataFetcherKASBasicAuthParamFlag = cli.StringFlag{
  1056  		Name:   "chaindatafetcher.kas.basic.auth.param",
  1057  		Usage:  "KAS specific header basic authorization parameter in chaindatafetcher",
  1058  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAS_BASIC_AUTH_PARAM",
  1059  	}
  1060  	ChainDataFetcherKafkaBrokersFlag = cli.StringSliceFlag{
  1061  		Name:   "chaindatafetcher.kafka.brokers",
  1062  		Usage:  "Kafka broker URL list",
  1063  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_BROKERS",
  1064  	}
  1065  	ChainDataFetcherKafkaTopicEnvironmentFlag = cli.StringFlag{
  1066  		Name:   "chaindatafetcher.kafka.topic.environment",
  1067  		Usage:  "Kafka topic environment prefix",
  1068  		Value:  kafka.DefaultTopicEnvironmentName,
  1069  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_TOPIC_ENVIRONMENT",
  1070  	}
  1071  	ChainDataFetcherKafkaTopicResourceFlag = cli.StringFlag{
  1072  		Name:   "chaindatafetcher.kafka.topic.resource",
  1073  		Usage:  "Kafka topic resource name",
  1074  		Value:  kafka.DefaultTopicResourceName,
  1075  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_TOPIC_RESOURCE",
  1076  	}
  1077  	ChainDataFetcherKafkaReplicasFlag = cli.Int64Flag{
  1078  		Name:   "chaindatafetcher.kafka.replicas",
  1079  		Usage:  "Kafka partition replication factor",
  1080  		Value:  kafka.DefaultReplicas,
  1081  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_REPLICAS",
  1082  	}
  1083  	ChainDataFetcherKafkaPartitionsFlag = cli.IntFlag{
  1084  		Name:   "chaindatafetcher.kafka.partitions",
  1085  		Usage:  "The number of partitions in a topic",
  1086  		Value:  kafka.DefaultPartitions,
  1087  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_PARTITIONS",
  1088  	}
  1089  	ChainDataFetcherKafkaMaxMessageBytesFlag = cli.Int64Flag{
  1090  		Name:   "chaindatafetcher.kafka.max.message.bytes",
  1091  		Usage:  "The max size of a message produced by Kafka producer ",
  1092  		Value:  kafka.DefaultMaxMessageBytes,
  1093  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_MAX_MESSAGE_BYTES",
  1094  	}
  1095  	ChainDataFetcherKafkaSegmentSizeBytesFlag = cli.IntFlag{
  1096  		Name:   "chaindatafetcher.kafka.segment.size",
  1097  		Usage:  "The kafka data segment size (in byte)",
  1098  		Value:  kafka.DefaultSegmentSizeBytes,
  1099  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_SEGMENT_SIZE",
  1100  	}
  1101  	ChainDataFetcherKafkaRequiredAcksFlag = cli.IntFlag{
  1102  		Name:   "chaindatafetcher.kafka.required.acks",
  1103  		Usage:  "The level of acknowledgement reliability needed from Kafka broker (0: NoResponse, 1: WaitForLocal, -1: WaitForAll)",
  1104  		Value:  kafka.DefaultRequiredAcks,
  1105  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_REQUIRED_ACKS",
  1106  	}
  1107  	ChainDataFetcherKafkaMessageVersionFlag = cli.StringFlag{
  1108  		Name:   "chaindatafetcher.kafka.msg.version",
  1109  		Usage:  "The version of Kafka message",
  1110  		Value:  kafka.DefaultKafkaMessageVersion,
  1111  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_MSG_VERSION",
  1112  	}
  1113  	ChainDataFetcherKafkaProducerIdFlag = cli.StringFlag{
  1114  		Name:   "chaindatafetcher.kafka.producer.id",
  1115  		Usage:  "The identifier of kafka message producer",
  1116  		Value:  kafka.GetDefaultProducerId(),
  1117  		EnvVar: "KLAYTN_CHAINDATAFETCHER_KAFKA_PRODUCER_ID",
  1118  	}
  1119  	// DBSyncer
  1120  	EnableDBSyncerFlag = cli.BoolFlag{
  1121  		Name:   "dbsyncer",
  1122  		Usage:  "Enable the DBSyncer",
  1123  		EnvVar: "KLAYTN_DBSYNCER",
  1124  	}
  1125  	DBHostFlag = cli.StringFlag{
  1126  		Name:   "dbsyncer.db.host",
  1127  		Usage:  "db.host in dbsyncer",
  1128  		EnvVar: "KLAYTN_DBSYNCER_DB_HOST",
  1129  	}
  1130  	DBPortFlag = cli.StringFlag{
  1131  		Name:   "dbsyncer.db.port",
  1132  		Usage:  "db.port in dbsyncer",
  1133  		Value:  "3306",
  1134  		EnvVar: "KLAYTN_DBSYNCER_DB_PORT",
  1135  	}
  1136  	DBNameFlag = cli.StringFlag{
  1137  		Name:   "dbsyncer.db.name",
  1138  		Usage:  "db.name in dbsyncer",
  1139  		EnvVar: "KLAYTN_DBSYNCER_DB_NAME",
  1140  	}
  1141  	DBUserFlag = cli.StringFlag{
  1142  		Name:   "dbsyncer.db.user",
  1143  		Usage:  "db.user in dbsyncer",
  1144  		EnvVar: "KLAYTN_DBSYNCER_DB_USER",
  1145  	}
  1146  	DBPasswordFlag = cli.StringFlag{
  1147  		Name:   "dbsyncer.db.password",
  1148  		Usage:  "db.password in dbsyncer",
  1149  		EnvVar: "KLAYTN_DBSYNCER_DB_PASSWORD",
  1150  	}
  1151  	EnabledLogModeFlag = cli.BoolFlag{
  1152  		Name:   "dbsyncer.logmode",
  1153  		Usage:  "Enable the dbsyncer logmode",
  1154  		EnvVar: "KLAYTN_DBSYNCER_LOGMODE",
  1155  	}
  1156  	MaxIdleConnsFlag = cli.IntFlag{
  1157  		Name:   "dbsyncer.db.max.idle",
  1158  		Usage:  "The maximum number of connections in the idle connection pool",
  1159  		Value:  50,
  1160  		EnvVar: "KLAYTN_DBSYNCER_DB_MAX_IDLE",
  1161  	}
  1162  	MaxOpenConnsFlag = cli.IntFlag{
  1163  		Name:   "dbsyncer.db.max.open",
  1164  		Usage:  "The maximum number of open connections to the database",
  1165  		Value:  30,
  1166  		EnvVar: "KLAYTN_DBSYNCER_DB_MAX_OPEN",
  1167  	}
  1168  	ConnMaxLifeTimeFlag = cli.DurationFlag{
  1169  		Name:   "dbsyncer.db.max.lifetime",
  1170  		Usage:  "The maximum amount of time a connection may be reused (default : 1h), ex: 300ms, 2h45m, 60s, ...",
  1171  		Value:  1 * time.Hour,
  1172  		EnvVar: "KLAYTN_DBSYNCER_DB_MAX_LIFETIME",
  1173  	}
  1174  	BlockSyncChannelSizeFlag = cli.IntFlag{
  1175  		Name:   "dbsyncer.block.channel.size",
  1176  		Usage:  "Block received channel size",
  1177  		Value:  5,
  1178  		EnvVar: "KLAYTN_DBSYNCER_BLOCK_CHANNEL_SIZE",
  1179  	}
  1180  	DBSyncerModeFlag = cli.StringFlag{
  1181  		Name:   "dbsyncer.mode",
  1182  		Usage:  "The mode of dbsyncer is way which handle block/tx data to insert db (multi, single, context)",
  1183  		Value:  "multi",
  1184  		EnvVar: "KLAYTN_DBSYNCER_MODE",
  1185  	}
  1186  	GenQueryThreadFlag = cli.IntFlag{
  1187  		Name:   "dbsyncer.genquery.th",
  1188  		Usage:  "The amount of thread of generation query in multi mode",
  1189  		Value:  50,
  1190  		EnvVar: "KLAYTN_DBSYNCER_GENQUERY_TH",
  1191  	}
  1192  	InsertThreadFlag = cli.IntFlag{
  1193  		Name:   "dbsyncer.insert.th",
  1194  		Usage:  "The amount of thread of insert operation in multi mode",
  1195  		Value:  30,
  1196  		EnvVar: "KLAYTN_DBSYNCER_INSERT_TH",
  1197  	}
  1198  	BulkInsertSizeFlag = cli.IntFlag{
  1199  		Name:   "dbsyncer.bulk.size",
  1200  		Usage:  "The amount of row for bulk-insert",
  1201  		Value:  200,
  1202  		EnvVar: "KLAYTN_DBSYNCER_BULK_SIZE",
  1203  	}
  1204  	EventModeFlag = cli.StringFlag{
  1205  		Name:   "dbsyncer.event.mode",
  1206  		Usage:  "The way how to sync all block or last block (block, head)",
  1207  		Value:  "head",
  1208  		EnvVar: "KLAYTN_DBSYNCER_EVENT_MODE",
  1209  	}
  1210  	MaxBlockDiffFlag = cli.Uint64Flag{
  1211  		Name:   "dbsyncer.max.block.diff",
  1212  		Usage:  "The maximum difference between current block and event block. 0 means off",
  1213  		Value:  0,
  1214  		EnvVar: "KLAYTN_DBSYNCER_MAX_BLOCK_DIFF",
  1215  	}
  1216  	AutoRestartFlag = cli.BoolFlag{
  1217  		Name:   "autorestart.enable",
  1218  		Usage:  "Node can restart itself when there is a problem in making consensus",
  1219  		EnvVar: "KLAYTN_AUTORESTART_ENABLE",
  1220  	}
  1221  	RestartTimeOutFlag = cli.DurationFlag{
  1222  		Name:   "autorestart.timeout",
  1223  		Usage:  "The elapsed time to wait auto restart (minutes)",
  1224  		Value:  15 * time.Minute,
  1225  		EnvVar: "KLAYTN_AUTORESTART_TIMEOUT",
  1226  	}
  1227  	DaemonPathFlag = cli.StringFlag{
  1228  		Name:   "autorestart.daemon.path",
  1229  		Usage:  "Path of node daemon. Used to give signal to kill",
  1230  		Value:  "~/klaytn/bin/kcnd",
  1231  		EnvVar: "KLAYTN_AUTORESTART_DAEMON_PATH",
  1232  	}
  1233  
  1234  	// db migration vars
  1235  	DstDbTypeFlag = cli.StringFlag{
  1236  		Name:   "dst.dbtype",
  1237  		Usage:  `Blockchain storage database type ("LevelDB", "BadgerDB", "DynamoDBS3")`,
  1238  		Value:  "LevelDB",
  1239  		EnvVar: "KLAYTN_DST_DBTYPE",
  1240  	}
  1241  	DstDataDirFlag = DirectoryFlag{
  1242  		Name:   "dst.datadir",
  1243  		Usage:  "Data directory for the databases and keystore. This value is only used in local DB.",
  1244  		EnvVar: "KLAYTN_DST_DATADIR",
  1245  	}
  1246  	DstSingleDBFlag = cli.BoolFlag{
  1247  		Name:   "db.dst.single",
  1248  		Usage:  "Create a single persistent storage. MiscDB, headerDB and etc are stored in one DB.",
  1249  		EnvVar: "KLAYTN_DB_DST_SINGLE",
  1250  	}
  1251  	DstLevelDBCacheSizeFlag = cli.IntFlag{
  1252  		Name:   "db.dst.leveldb.cache-size",
  1253  		Usage:  "Size of in-memory cache in LevelDB (MiB)",
  1254  		Value:  768,
  1255  		EnvVar: "KLAYTN_DB_DST_LEVELDB_CACHE_SIZE",
  1256  	}
  1257  	DstLevelDBCompressionTypeFlag = cli.IntFlag{
  1258  		Name:   "db.dst.leveldb.compression",
  1259  		Usage:  "Determines the compression method for LevelDB. 0=AllNoCompression, 1=ReceiptOnlySnappyCompression, 2=StateTrieOnlyNoCompression, 3=AllSnappyCompression",
  1260  		Value:  0,
  1261  		EnvVar: "KLAYTN_DB_DST_LEVELDB_COMPRESSION",
  1262  	}
  1263  	DstNumStateTrieShardsFlag = cli.UintFlag{
  1264  		Name:   "db.dst.num-statetrie-shards",
  1265  		Usage:  "Number of internal shards of state trie DB shards. Should be power of 2",
  1266  		Value:  4,
  1267  		EnvVar: "KLAYTN_DB_DST_NUM_STATETRIE_SHARDS",
  1268  	}
  1269  	DstDynamoDBTableNameFlag = cli.StringFlag{
  1270  		Name:   "db.dst.dynamo.tablename",
  1271  		Usage:  "Specifies DynamoDB table name. This is mandatory to use dynamoDB. (Set dbtype to use DynamoDBS3). If dstDB is singleDB, tableName should be in form of 'PREFIX-TABLENAME'.(e.g. 'klaytn-misc', 'klaytn-statetrie')",
  1272  		EnvVar: "KLAYTN_DB_DST_DYNAMO_TABLENAME",
  1273  	}
  1274  	DstDynamoDBRegionFlag = cli.StringFlag{
  1275  		Name:   "db.dst.dynamo.region",
  1276  		Usage:  "AWS region where the DynamoDB will be created.",
  1277  		Value:  database.GetDefaultDynamoDBConfig().Region,
  1278  		EnvVar: "KLAYTN_DB_DST_DYNAMO_REGION",
  1279  	}
  1280  	DstDynamoDBIsProvisionedFlag = cli.BoolFlag{
  1281  		Name:   "db.dst.dynamo.is-provisioned",
  1282  		Usage:  "Set DynamoDB billing mode to provision. The default billing mode is on-demand.",
  1283  		EnvVar: "KLAYTN_DB_DST_DYNAMO_IS_PROVISIONED",
  1284  	}
  1285  	DstDynamoDBReadCapacityFlag = cli.Int64Flag{
  1286  		Name:   "db.dst.dynamo.read-capacity",
  1287  		Usage:  "Read capacity unit of dynamoDB. If is-provisioned is not set, this flag will not be applied.",
  1288  		Value:  database.GetDefaultDynamoDBConfig().ReadCapacityUnits,
  1289  		EnvVar: "KLAYTN_DB_DST_DYNAMO_READ_CAPACITY",
  1290  	}
  1291  	DstDynamoDBWriteCapacityFlag = cli.Int64Flag{
  1292  		Name:   "db.dst.dynamo.write-capacity",
  1293  		Usage:  "Write capacity unit of dynamoDB. If is-provisioned is not set, this flag will not be applied",
  1294  		Value:  database.GetDefaultDynamoDBConfig().WriteCapacityUnits,
  1295  		EnvVar: "KLAYTN_DB_DST_DYNAMO_WRITE_CAPACITY",
  1296  	}
  1297  
  1298  	// Config
  1299  	ConfigFileFlag = cli.StringFlag{
  1300  		Name:   "config",
  1301  		Usage:  "TOML configuration file",
  1302  		EnvVar: "KLAYTN_CONFIG",
  1303  	}
  1304  	BlockGenerationIntervalFlag = cli.Int64Flag{
  1305  		Name: "block-generation-interval",
  1306  		Usage: "(experimental option) Set the block generation interval in seconds. " +
  1307  			"It should be equal or larger than 1. This flag is only applicable to CN.",
  1308  		Value:  params.DefaultBlockGenerationInterval,
  1309  		EnvVar: "KLAYTN_BLOCK_GENERATION_INTERVAL",
  1310  	}
  1311  	BlockGenerationTimeLimitFlag = cli.DurationFlag{
  1312  		Name: "block-generation-time-limit",
  1313  		Usage: "(experimental option) Set the vm execution time limit during block generation. " +
  1314  			"Less than half of the block generation interval is recommended for this value. " +
  1315  			"This flag is only applicable to CN",
  1316  		Value:  params.DefaultBlockGenerationTimeLimit,
  1317  		EnvVar: "KLAYTN_BLOCK_GENERATION_TIME_LIMIT",
  1318  	}
  1319  	OpcodeComputationCostLimitFlag = cli.Uint64Flag{
  1320  		Name: "opcode-computation-cost-limit",
  1321  		Usage: "(experimental option) Set the computation cost limit for a tx. " +
  1322  			"Should set the same value within the network",
  1323  		Value:  params.DefaultOpcodeComputationCostLimit,
  1324  		EnvVar: "KLAYTN_OPCODE_COMPUTATION_COST_LIMIT",
  1325  	}
  1326  
  1327  	// TODO-Klaytn-Bootnode: Add bootnode's metric options
  1328  	// TODO-Klaytn-Bootnode: Implements bootnode's RPC
  1329  )
  1330  
  1331  // MakeDataDir retrieves the currently requested data directory, terminating
  1332  // if none (or the empty string) is specified. If the node is starting a baobab,
  1333  // the a subdirectory of the specified datadir will be used.
  1334  func MakeDataDir(ctx *cli.Context) string {
  1335  	if path := ctx.GlobalString(DataDirFlag.Name); path != "" {
  1336  		if ctx.GlobalBool(BaobabFlag.Name) {
  1337  			return filepath.Join(path, "baobab")
  1338  		}
  1339  		return path
  1340  	}
  1341  	log.Fatalf("Cannot determine default data directory, please set manually (--datadir)")
  1342  	return ""
  1343  }
  1344  
  1345  // splitAndTrim splits input separated by a comma
  1346  // and trims excessive white space from the substrings.
  1347  func SplitAndTrim(input string) []string {
  1348  	result := strings.Split(input, ",")
  1349  	for i, r := range result {
  1350  		result[i] = strings.TrimSpace(r)
  1351  	}
  1352  	return result
  1353  }
  1354  
  1355  // MakePasswordList reads password lines from the file specified by the global --password flag.
  1356  func MakePasswordList(ctx *cli.Context) []string {
  1357  	path := ctx.GlobalString(PasswordFileFlag.Name)
  1358  	if path == "" {
  1359  		return nil
  1360  	}
  1361  	text, err := ioutil.ReadFile(path)
  1362  	if err != nil {
  1363  		log.Fatalf("Failed to read password file: %v", err)
  1364  	}
  1365  	lines := strings.Split(string(text), "\n")
  1366  	// Sanitise DOS line endings.
  1367  	for i := range lines {
  1368  		lines[i] = strings.TrimRight(lines[i], "\r")
  1369  	}
  1370  	return lines
  1371  }
  1372  
  1373  // RegisterCNService adds a CN client to the stack.
  1374  func RegisterCNService(stack *node.Node, cfg *cn.Config) {
  1375  	// TODO-Klaytn add syncMode.LightSync func and add LesServer
  1376  
  1377  	err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
  1378  		cfg.WsEndpoint = stack.WSEndpoint()
  1379  		fullNode, err := cn.New(ctx, cfg)
  1380  		return fullNode, err
  1381  	})
  1382  	if err != nil {
  1383  		log.Fatalf("Failed to register the CN service: %v", err)
  1384  	}
  1385  }
  1386  
  1387  func RegisterService(stack *node.Node, cfg *sc.SCConfig) {
  1388  	if cfg.EnabledMainBridge {
  1389  		err := stack.RegisterSubService(func(ctx *node.ServiceContext) (node.Service, error) {
  1390  			mainBridge, err := sc.NewMainBridge(ctx, cfg)
  1391  			return mainBridge, err
  1392  		})
  1393  		if err != nil {
  1394  			log.Fatalf("Failed to register the main bridge service: %v", err)
  1395  		}
  1396  	}
  1397  
  1398  	if cfg.EnabledSubBridge {
  1399  		err := stack.RegisterSubService(func(ctx *node.ServiceContext) (node.Service, error) {
  1400  			subBridge, err := sc.NewSubBridge(ctx, cfg)
  1401  			return subBridge, err
  1402  		})
  1403  		if err != nil {
  1404  			log.Fatalf("Failed to register the sub bridge service: %v", err)
  1405  		}
  1406  	}
  1407  }
  1408  
  1409  // RegisterChainDataFetcherService adds a ChainDataFetcher to the stack
  1410  func RegisterChainDataFetcherService(stack *node.Node, cfg *chaindatafetcher.ChainDataFetcherConfig) {
  1411  	if cfg.EnabledChainDataFetcher {
  1412  		err := stack.RegisterSubService(func(ctx *node.ServiceContext) (node.Service, error) {
  1413  			chainDataFetcher, err := chaindatafetcher.NewChainDataFetcher(ctx, cfg)
  1414  			return chainDataFetcher, err
  1415  		})
  1416  		if err != nil {
  1417  			log.Fatalf("Failed to register the service: %v", err)
  1418  		}
  1419  	}
  1420  }
  1421  
  1422  // RegisterDBSyncerService adds a DBSyncer to the stack
  1423  func RegisterDBSyncerService(stack *node.Node, cfg *dbsyncer.DBConfig) {
  1424  	if cfg.EnabledDBSyncer {
  1425  		err := stack.RegisterSubService(func(ctx *node.ServiceContext) (node.Service, error) {
  1426  			dbImporter, err := dbsyncer.NewDBSyncer(ctx, cfg)
  1427  			return dbImporter, err
  1428  		})
  1429  		if err != nil {
  1430  			log.Fatalf("Failed to register the service: %v", err)
  1431  		}
  1432  	}
  1433  }
  1434  
  1435  // MakeConsolePreloads retrieves the absolute paths for the console JavaScript
  1436  // scripts to preload before starting.
  1437  func MakeConsolePreloads(ctx *cli.Context) []string {
  1438  	// Skip preloading if there's nothing to preload
  1439  	if ctx.GlobalString(PreloadJSFlag.Name) == "" {
  1440  		return nil
  1441  	}
  1442  	// Otherwise resolve absolute paths and return them
  1443  	var preloads []string
  1444  
  1445  	assets := ctx.GlobalString(JSpathFlag.Name)
  1446  	for _, file := range strings.Split(ctx.GlobalString(PreloadJSFlag.Name), ",") {
  1447  		preloads = append(preloads, common.AbsolutePath(assets, strings.TrimSpace(file)))
  1448  	}
  1449  	return preloads
  1450  }
  1451  
  1452  // MigrateFlags sets the global flag from a local flag when it's set.
  1453  // This is a temporary function used for migrating old command/flags to the
  1454  // new format.
  1455  //
  1456  // e.g. ken account new --keystore /tmp/mykeystore --lightkdf
  1457  //
  1458  // is equivalent after calling this method with:
  1459  //
  1460  // ken --keystore /tmp/mykeystore --lightkdf account new
  1461  //
  1462  // This allows the use of the existing configuration functionality.
  1463  // When all flags are migrated this function can be removed and the existing
  1464  // configuration functionality must be changed that is uses local flags
  1465  func MigrateFlags(action func(ctx *cli.Context) error) func(*cli.Context) error {
  1466  	return func(ctx *cli.Context) error {
  1467  		for _, name := range ctx.FlagNames() {
  1468  			if ctx.IsSet(name) {
  1469  				ctx.GlobalSet(name, ctx.String(name))
  1470  			}
  1471  		}
  1472  		return action(ctx)
  1473  	}
  1474  }
  1475  
  1476  // CheckExclusive verifies that only a single instance of the provided flags was
  1477  // set by the user. Each flag might optionally be followed by a string type to
  1478  // specialize it further.
  1479  func CheckExclusive(ctx *cli.Context, args ...interface{}) {
  1480  	set := make([]string, 0, 1)
  1481  	for i := 0; i < len(args); i++ {
  1482  		// Make sure the next argument is a flag and skip if not set
  1483  		flag, ok := args[i].(cli.Flag)
  1484  		if !ok {
  1485  			panic(fmt.Sprintf("invalid argument, not cli.Flag type: %T", args[i]))
  1486  		}
  1487  		// Check if next arg extends current and expand its name if so
  1488  		name := flag.GetName()
  1489  
  1490  		if i+1 < len(args) {
  1491  			switch option := args[i+1].(type) {
  1492  			case string:
  1493  				// Extended flag, expand the name and shift the arguments
  1494  				if ctx.GlobalString(flag.GetName()) == option {
  1495  					name += "=" + option
  1496  				}
  1497  				i++
  1498  
  1499  			case cli.Flag:
  1500  			default:
  1501  				panic(fmt.Sprintf("invalid argument, not cli.Flag or string extension: %T", args[i+1]))
  1502  			}
  1503  		}
  1504  		// Mark the flag if it's set
  1505  		if ctx.GlobalIsSet(flag.GetName()) {
  1506  			set = append(set, "--"+name)
  1507  		}
  1508  	}
  1509  	if len(set) > 1 {
  1510  		log.Fatalf("Flags %v can't be used at the same time", strings.Join(set, ", "))
  1511  	}
  1512  }