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 }