github.com/MetalBlockchain/metalgo@v1.11.9/config/flags.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package config 5 6 import ( 7 "fmt" 8 "os" 9 "path/filepath" 10 "runtime" 11 "time" 12 13 "github.com/spf13/pflag" 14 "github.com/spf13/viper" 15 16 "github.com/MetalBlockchain/metalgo/database/leveldb" 17 "github.com/MetalBlockchain/metalgo/database/memdb" 18 "github.com/MetalBlockchain/metalgo/database/pebbledb" 19 "github.com/MetalBlockchain/metalgo/genesis" 20 "github.com/MetalBlockchain/metalgo/snow/consensus/snowball" 21 "github.com/MetalBlockchain/metalgo/trace" 22 "github.com/MetalBlockchain/metalgo/utils/compression" 23 "github.com/MetalBlockchain/metalgo/utils/constants" 24 "github.com/MetalBlockchain/metalgo/utils/dynamicip" 25 "github.com/MetalBlockchain/metalgo/utils/ulimit" 26 "github.com/MetalBlockchain/metalgo/utils/units" 27 ) 28 29 const ( 30 DefaultHTTPPort = 9650 31 DefaultStakingPort = 9651 32 33 AvalancheGoDataDirVar = "METALGO_DATA_DIR" 34 defaultUnexpandedDataDir = "$" + AvalancheGoDataDirVar 35 36 DefaultProcessContextFilename = "process.json" 37 ) 38 39 var ( 40 // [defaultUnexpandedDataDir] will be expanded when reading the flags 41 defaultDataDir = filepath.Join("$HOME", ".metalgo") 42 defaultDBDir = filepath.Join(defaultUnexpandedDataDir, "db") 43 defaultLogDir = filepath.Join(defaultUnexpandedDataDir, "logs") 44 defaultProfileDir = filepath.Join(defaultUnexpandedDataDir, "profiles") 45 defaultStakingPath = filepath.Join(defaultUnexpandedDataDir, "staking") 46 defaultStakingTLSKeyPath = filepath.Join(defaultStakingPath, "staker.key") 47 defaultStakingCertPath = filepath.Join(defaultStakingPath, "staker.crt") 48 defaultStakingSignerKeyPath = filepath.Join(defaultStakingPath, "signer.key") 49 defaultConfigDir = filepath.Join(defaultUnexpandedDataDir, "configs") 50 defaultChainConfigDir = filepath.Join(defaultConfigDir, "chains") 51 defaultVMConfigDir = filepath.Join(defaultConfigDir, "vms") 52 defaultVMAliasFilePath = filepath.Join(defaultVMConfigDir, "aliases.json") 53 defaultChainAliasFilePath = filepath.Join(defaultChainConfigDir, "aliases.json") 54 defaultSubnetConfigDir = filepath.Join(defaultConfigDir, "subnets") 55 defaultPluginDir = filepath.Join(defaultUnexpandedDataDir, "plugins") 56 defaultChainDataDir = filepath.Join(defaultUnexpandedDataDir, "chainData") 57 defaultProcessContextPath = filepath.Join(defaultUnexpandedDataDir, DefaultProcessContextFilename) 58 ) 59 60 func deprecateFlags(fs *pflag.FlagSet) error { 61 for key, message := range deprecatedKeys { 62 if err := fs.MarkDeprecated(key, message); err != nil { 63 return err 64 } 65 } 66 return nil 67 } 68 69 func addProcessFlags(fs *pflag.FlagSet) { 70 // If true, print the version and quit. 71 fs.Bool(VersionKey, false, "If true, print version and quit") 72 fs.Bool(VersionJSONKey, false, "If true, print version in JSON format and quit") 73 } 74 75 func addNodeFlags(fs *pflag.FlagSet) { 76 // Home directory 77 fs.String(DataDirKey, defaultDataDir, "Sets the base data directory where default sub-directories will be placed unless otherwise specified.") 78 // System 79 fs.Uint64(FdLimitKey, ulimit.DefaultFDLimit, "Attempts to raise the process file descriptor limit to at least this value and error if the value is above the system max") 80 81 // Plugin directory 82 fs.String(PluginDirKey, defaultPluginDir, "Path to the plugin directory") 83 84 // Config File 85 fs.String(ConfigFileKey, "", fmt.Sprintf("Specifies a config file. Ignored if %s is specified", ConfigContentKey)) 86 fs.String(ConfigContentKey, "", "Specifies base64 encoded config content") 87 fs.String(ConfigContentTypeKey, "json", "Specifies the format of the base64 encoded config content. Available values: 'json', 'yaml', 'toml'") 88 89 // Genesis 90 fs.String(GenesisFileKey, "", fmt.Sprintf("Specifies a genesis config file path. Ignored when running standard networks or if %s is specified", 91 GenesisFileContentKey)) 92 fs.String(GenesisFileContentKey, "", "Specifies base64 encoded genesis content") 93 94 // Network ID 95 fs.String(NetworkNameKey, constants.MainnetName, "Network ID this node will connect to") 96 97 // ACP flagging 98 fs.IntSlice(ACPSupportKey, nil, "ACPs to support adoption") 99 fs.IntSlice(ACPObjectKey, nil, "ACPs to object adoption") 100 101 // AVAX fees 102 fs.Uint64(TxFeeKey, genesis.LocalParams.TxFee, "Transaction fee, in nAVAX") 103 fs.Uint64(CreateAssetTxFeeKey, genesis.LocalParams.CreateAssetTxFee, "Transaction fee, in nAVAX, for transactions that create new assets") 104 fs.Uint64(CreateSubnetTxFeeKey, genesis.LocalParams.CreateSubnetTxFee, "Transaction fee, in nAVAX, for transactions that create new subnets") 105 fs.Uint64(TransformSubnetTxFeeKey, genesis.LocalParams.TransformSubnetTxFee, "Transaction fee, in nAVAX, for transactions that transform subnets") 106 fs.Uint64(CreateBlockchainTxFeeKey, genesis.LocalParams.CreateBlockchainTxFee, "Transaction fee, in nAVAX, for transactions that create new blockchains") 107 fs.Uint64(AddPrimaryNetworkValidatorFeeKey, genesis.LocalParams.AddPrimaryNetworkValidatorFee, "Transaction fee, in nAVAX, for transactions that add new primary network validators") 108 fs.Uint64(AddPrimaryNetworkDelegatorFeeKey, genesis.LocalParams.AddPrimaryNetworkDelegatorFee, "Transaction fee, in nAVAX, for transactions that add new primary network delegators") 109 fs.Uint64(AddSubnetValidatorFeeKey, genesis.LocalParams.AddSubnetValidatorFee, "Transaction fee, in nAVAX, for transactions that add new subnet validators") 110 fs.Uint64(AddSubnetDelegatorFeeKey, genesis.LocalParams.AddSubnetDelegatorFee, "Transaction fee, in nAVAX, for transactions that add new subnet delegators") 111 112 // Database 113 fs.String(DBTypeKey, leveldb.Name, fmt.Sprintf("Database type to use. Must be one of {%s, %s, %s}", leveldb.Name, memdb.Name, pebbledb.Name)) 114 fs.Bool(DBReadOnlyKey, false, "If true, database writes are to memory and never persisted. May still initialize database directory/files on disk if they don't exist") 115 fs.String(DBPathKey, defaultDBDir, "Path to database directory") 116 fs.String(DBConfigFileKey, "", fmt.Sprintf("Path to database config file. Ignored if %s is specified", DBConfigContentKey)) 117 fs.String(DBConfigContentKey, "", "Specifies base64 encoded database config content") 118 119 // Logging 120 fs.String(LogsDirKey, defaultLogDir, "Logging directory for Avalanche") 121 fs.String(LogLevelKey, "info", "The log level. Should be one of {verbo, debug, trace, info, warn, error, fatal, off}") 122 fs.String(LogDisplayLevelKey, "", "The log display level. If left blank, will inherit the value of log-level. Otherwise, should be one of {verbo, debug, trace, info, warn, error, fatal, off}") 123 fs.String(LogFormatKey, "auto", "The structure of log format. Defaults to 'auto' which formats terminal-like logs, when the output is a terminal. Otherwise, should be one of {auto, plain, colors, json}") 124 fs.Uint(LogRotaterMaxSizeKey, 8, "The maximum file size in megabytes of the log file before it gets rotated.") 125 fs.Uint(LogRotaterMaxFilesKey, 7, "The maximum number of old log files to retain. 0 means retain all old log files.") 126 fs.Uint(LogRotaterMaxAgeKey, 0, "The maximum number of days to retain old log files based on the timestamp encoded in their filename. 0 means retain all old log files.") 127 fs.Bool(LogRotaterCompressEnabledKey, false, "Enables the compression of rotated log files through gzip.") 128 fs.Bool(LogDisableDisplayPluginLogsKey, false, "Disables displaying plugin logs in stdout.") 129 130 // Peer List Gossip 131 fs.Uint(NetworkPeerListNumValidatorIPsKey, constants.DefaultNetworkPeerListNumValidatorIPs, "Number of validator IPs to gossip to other nodes") 132 fs.Duration(NetworkPeerListPullGossipFreqKey, constants.DefaultNetworkPeerListPullGossipFreq, "Frequency to request peers from other nodes") 133 fs.Duration(NetworkPeerListBloomResetFreqKey, constants.DefaultNetworkPeerListBloomResetFreq, "Frequency to recalculate the bloom filter used to request new peers from other nodes") 134 135 // Public IP Resolution 136 fs.String(PublicIPKey, "", "Public IP of this node for P2P communication") 137 fs.Duration(PublicIPResolutionFreqKey, 5*time.Minute, "Frequency at which this node resolves/updates its public IP and renew NAT mappings, if applicable") 138 fs.String(PublicIPResolutionServiceKey, "", fmt.Sprintf("Only acceptable values are %q, %q or %q. When provided, the node will use that service to periodically resolve/update its public IP", dynamicip.OpenDNSName, dynamicip.IFConfigCoName, dynamicip.IFConfigMeName)) 139 140 // Inbound Connection Throttling 141 fs.Duration(NetworkInboundConnUpgradeThrottlerCooldownKey, constants.DefaultInboundConnUpgradeThrottlerCooldown, "Upgrade an inbound connection from a given IP at most once per this duration. If 0, don't rate-limit inbound connection upgrades") 142 fs.Float64(NetworkInboundThrottlerMaxConnsPerSecKey, constants.DefaultInboundThrottlerMaxConnsPerSec, "Max number of inbound connections to accept (from all peers) per second") 143 // Outbound Connection Throttling 144 fs.Uint(NetworkOutboundConnectionThrottlingRpsKey, constants.DefaultOutboundConnectionThrottlingRps, "Make at most this number of outgoing peer connection attempts per second") 145 fs.Duration(NetworkOutboundConnectionTimeoutKey, constants.DefaultOutboundConnectionTimeout, "Timeout when dialing a peer") 146 // Timeouts 147 fs.Duration(NetworkInitialTimeoutKey, constants.DefaultNetworkInitialTimeout, "Initial timeout value of the adaptive timeout manager") 148 fs.Duration(NetworkMinimumTimeoutKey, constants.DefaultNetworkMinimumTimeout, "Minimum timeout value of the adaptive timeout manager") 149 fs.Duration(NetworkMaximumTimeoutKey, constants.DefaultNetworkMaximumTimeout, "Maximum timeout value of the adaptive timeout manager") 150 fs.Duration(NetworkMaximumInboundTimeoutKey, constants.DefaultNetworkMaximumInboundTimeout, "Maximum timeout value of an inbound message. Defines duration within which an incoming message must be fulfilled. Incoming messages containing deadline higher than this value will be overridden with this value.") 151 fs.Duration(NetworkTimeoutHalflifeKey, constants.DefaultNetworkTimeoutHalflife, "Halflife of average network response time. Higher value --> network timeout is less volatile. Can't be 0") 152 fs.Float64(NetworkTimeoutCoefficientKey, constants.DefaultNetworkTimeoutCoefficient, "Multiplied by average network response time to get the network timeout. Must be >= 1") 153 fs.Duration(NetworkReadHandshakeTimeoutKey, constants.DefaultNetworkReadHandshakeTimeout, "Timeout value for reading handshake messages") 154 fs.Duration(NetworkPingTimeoutKey, constants.DefaultPingPongTimeout, "Timeout value for Ping-Pong with a peer") 155 fs.Duration(NetworkPingFrequencyKey, constants.DefaultPingFrequency, "Frequency of pinging other peers") 156 157 fs.String(NetworkCompressionTypeKey, constants.DefaultNetworkCompressionType.String(), fmt.Sprintf("Compression type for outbound messages. Must be one of [%s, %s]", compression.TypeZstd, compression.TypeNone)) 158 159 fs.Duration(NetworkMaxClockDifferenceKey, constants.DefaultNetworkMaxClockDifference, "Max allowed clock difference value between this node and peers") 160 // Note: The default value is set to false here because the default 161 // networkID is mainnet. The real default value of NetworkAllowPrivateIPs is 162 // based on the networkID. 163 fs.Bool(NetworkAllowPrivateIPsKey, false, fmt.Sprintf("Allows the node to initiate outbound connection attempts to peers with private IPs. If the provided --%s is one of [%s, %s] the default is false. Oterhwise, the default is true", NetworkNameKey, constants.MainnetName, constants.TahoeName)) 164 fs.Bool(NetworkRequireValidatorToConnectKey, constants.DefaultNetworkRequireValidatorToConnect, "If true, this node will only maintain a connection with another node if this node is a validator, the other node is a validator, or the other node is a beacon") 165 fs.Uint(NetworkPeerReadBufferSizeKey, constants.DefaultNetworkPeerReadBufferSize, "Size, in bytes, of the buffer that we read peer messages into (there is one buffer per peer)") 166 fs.Uint(NetworkPeerWriteBufferSizeKey, constants.DefaultNetworkPeerWriteBufferSize, "Size, in bytes, of the buffer that we write peer messages into (there is one buffer per peer)") 167 168 fs.Bool(NetworkTCPProxyEnabledKey, constants.DefaultNetworkTCPProxyEnabled, "Require all P2P connections to be initiated with a TCP proxy header") 169 // The PROXY protocol specification recommends setting this value to be at 170 // least 3 seconds to cover a TCP retransmit. 171 // Ref: https://www.haproxy.org/download/2.3/doc/proxy-protocol.txt 172 // Specifying a timeout of 0 will actually result in a timeout of 200ms, but 173 // a timeout of 0 should generally not be provided. 174 fs.Duration(NetworkTCPProxyReadTimeoutKey, constants.DefaultNetworkTCPProxyReadTimeout, "Maximum duration to wait for a TCP proxy header") 175 176 fs.String(NetworkTLSKeyLogFileKey, "", "TLS key log file path. Should only be specified for debugging") 177 178 // Benchlist 179 fs.Int(BenchlistFailThresholdKey, constants.DefaultBenchlistFailThreshold, "Number of consecutive failed queries before benchlisting a node") 180 fs.Duration(BenchlistDurationKey, constants.DefaultBenchlistDuration, "Max amount of time a peer is benchlisted after surpassing the threshold") 181 fs.Duration(BenchlistMinFailingDurationKey, constants.DefaultBenchlistMinFailingDuration, "Minimum amount of time messages to a peer must be failing before the peer is benched") 182 183 // Router 184 fs.Uint(ConsensusAppConcurrencyKey, constants.DefaultConsensusAppConcurrency, "Maximum number of goroutines to use when handling App messages on a chain") 185 fs.Duration(ConsensusShutdownTimeoutKey, constants.DefaultConsensusShutdownTimeout, "Timeout before killing an unresponsive chain") 186 fs.Duration(ConsensusFrontierPollFrequencyKey, constants.DefaultFrontierPollFrequency, "Frequency of polling for new consensus frontiers") 187 188 // Inbound Throttling 189 fs.Uint64(InboundThrottlerAtLargeAllocSizeKey, constants.DefaultInboundThrottlerAtLargeAllocSize, "Size, in bytes, of at-large byte allocation in inbound message throttler") 190 fs.Uint64(InboundThrottlerVdrAllocSizeKey, constants.DefaultInboundThrottlerVdrAllocSize, "Size, in bytes, of validator byte allocation in inbound message throttler") 191 fs.Uint64(InboundThrottlerNodeMaxAtLargeBytesKey, constants.DefaultInboundThrottlerNodeMaxAtLargeBytes, "Max number of bytes a node can take from the inbound message throttler's at-large allocation. Must be at least the max message size") 192 fs.Uint64(InboundThrottlerMaxProcessingMsgsPerNodeKey, constants.DefaultInboundThrottlerMaxProcessingMsgsPerNode, "Max number of messages currently processing from a given node") 193 fs.Uint64(InboundThrottlerBandwidthRefillRateKey, constants.DefaultInboundThrottlerBandwidthRefillRate, "Max average inbound bandwidth usage of a peer, in bytes per second. See BandwidthThrottler") 194 fs.Uint64(InboundThrottlerBandwidthMaxBurstSizeKey, constants.DefaultInboundThrottlerBandwidthMaxBurstSize, "Max inbound bandwidth a node can use at once. Must be at least the max message size. See BandwidthThrottler") 195 fs.Duration(InboundThrottlerCPUMaxRecheckDelayKey, constants.DefaultInboundThrottlerCPUMaxRecheckDelay, "In the CPU-based network throttler, check at least this often whether the node's CPU usage has fallen to an acceptable level") 196 fs.Duration(InboundThrottlerDiskMaxRecheckDelayKey, constants.DefaultInboundThrottlerDiskMaxRecheckDelay, "In the disk-based network throttler, check at least this often whether the node's disk usage has fallen to an acceptable level") 197 198 // Outbound Throttling 199 fs.Uint64(OutboundThrottlerAtLargeAllocSizeKey, constants.DefaultOutboundThrottlerAtLargeAllocSize, "Size, in bytes, of at-large byte allocation in outbound message throttler") 200 fs.Uint64(OutboundThrottlerVdrAllocSizeKey, constants.DefaultOutboundThrottlerVdrAllocSize, "Size, in bytes, of validator byte allocation in outbound message throttler") 201 fs.Uint64(OutboundThrottlerNodeMaxAtLargeBytesKey, constants.DefaultOutboundThrottlerNodeMaxAtLargeBytes, "Max number of bytes a node can take from the outbound message throttler's at-large allocation. Must be at least the max message size") 202 203 // HTTP APIs 204 fs.String(HTTPHostKey, "127.0.0.1", "Address of the HTTP server. If the address is empty or a literal unspecified IP address, the server will bind on all available unicast and anycast IP addresses of the local system") 205 fs.Uint(HTTPPortKey, DefaultHTTPPort, "Port of the HTTP server. If the port is 0 a port number is automatically chosen") 206 fs.Bool(HTTPSEnabledKey, false, "Upgrade the HTTP server to HTTPs") 207 fs.String(HTTPSKeyFileKey, "", fmt.Sprintf("TLS private key file for the HTTPs server. Ignored if %s is specified", HTTPSKeyContentKey)) 208 fs.String(HTTPSKeyContentKey, "", "Specifies base64 encoded TLS private key for the HTTPs server") 209 fs.String(HTTPSCertFileKey, "", fmt.Sprintf("TLS certificate file for the HTTPs server. Ignored if %s is specified", HTTPSCertContentKey)) 210 fs.String(HTTPSCertContentKey, "", "Specifies base64 encoded TLS certificate for the HTTPs server") 211 fs.String(HTTPAllowedOrigins, "*", "Origins to allow on the HTTP port. Defaults to * which allows all origins. Example: https://*.avax.network https://*.avax-test.network") 212 fs.StringSlice(HTTPAllowedHostsKey, []string{"localhost"}, "List of acceptable host names in API requests. Provide the wildcard ('*') to accept requests from all hosts. API requests where the Host field is empty or an IP address will always be accepted. An API call whose HTTP Host field isn't acceptable will receive a 403 error code") 213 fs.Duration(HTTPShutdownWaitKey, 0, "Duration to wait after receiving SIGTERM or SIGINT before initiating shutdown. The /health endpoint will return unhealthy during this duration") 214 fs.Duration(HTTPShutdownTimeoutKey, 10*time.Second, "Maximum duration to wait for existing connections to complete during node shutdown") 215 fs.Duration(HTTPReadTimeoutKey, 30*time.Second, "Maximum duration for reading the entire request, including the body. A zero or negative value means there will be no timeout") 216 fs.Duration(HTTPReadHeaderTimeoutKey, 30*time.Second, fmt.Sprintf("Maximum duration to read request headers. The connection's read deadline is reset after reading the headers. If %s is zero, the value of %s is used. If both are zero, there is no timeout.", HTTPReadHeaderTimeoutKey, HTTPReadTimeoutKey)) 217 fs.Duration(HTTPWriteTimeoutKey, 30*time.Second, "Maximum duration before timing out writes of the response. It is reset whenever a new request's header is read. A zero or negative value means there will be no timeout.") 218 fs.Duration(HTTPIdleTimeoutKey, 120*time.Second, fmt.Sprintf("Maximum duration to wait for the next request when keep-alives are enabled. If %s is zero, the value of %s is used. If both are zero, there is no timeout.", HTTPIdleTimeoutKey, HTTPReadTimeoutKey)) 219 220 // Enable/Disable APIs 221 fs.Bool(AdminAPIEnabledKey, false, "If true, this node exposes the Admin API") 222 fs.Bool(InfoAPIEnabledKey, true, "If true, this node exposes the Info API") 223 fs.Bool(KeystoreAPIEnabledKey, false, "If true, this node exposes the Keystore API") 224 fs.Bool(MetricsAPIEnabledKey, true, "If true, this node exposes the Metrics API") 225 fs.Bool(HealthAPIEnabledKey, true, "If true, this node exposes the Health API") 226 227 // Health Checks 228 fs.Duration(HealthCheckFreqKey, 30*time.Second, "Time between health checks") 229 fs.Duration(HealthCheckAveragerHalflifeKey, constants.DefaultHealthCheckAveragerHalflife, "Halflife of averager when calculating a running average in a health check") 230 // Network Layer Health 231 fs.Duration(NetworkHealthMaxTimeSinceMsgSentKey, constants.DefaultNetworkHealthMaxTimeSinceMsgSent, "Network layer returns unhealthy if haven't sent a message for at least this much time") 232 fs.Duration(NetworkHealthMaxTimeSinceMsgReceivedKey, constants.DefaultNetworkHealthMaxTimeSinceMsgReceived, "Network layer returns unhealthy if haven't received a message for at least this much time") 233 fs.Float64(NetworkHealthMaxPortionSendQueueFillKey, constants.DefaultNetworkHealthMaxPortionSendQueueFill, "Network layer returns unhealthy if more than this portion of the pending send queue is full") 234 fs.Uint(NetworkHealthMinPeersKey, constants.DefaultNetworkHealthMinPeers, "Network layer returns unhealthy if connected to less than this many peers") 235 fs.Float64(NetworkHealthMaxSendFailRateKey, constants.DefaultNetworkHealthMaxSendFailRate, "Network layer reports unhealthy if more than this portion of attempted message sends fail") 236 // Router Health 237 fs.Float64(RouterHealthMaxDropRateKey, 1, "Node reports unhealthy if the router drops more than this portion of messages") 238 fs.Uint(RouterHealthMaxOutstandingRequestsKey, 1024, "Node reports unhealthy if there are more than this many outstanding consensus requests (Get, PullQuery, etc.) over all chains") 239 fs.Duration(NetworkHealthMaxOutstandingDurationKey, 5*time.Minute, "Node reports unhealthy if there has been a request outstanding for this duration") 240 241 // Staking 242 fs.String(StakingHostKey, "", "Address of the consensus server. If the address is empty or a literal unspecified IP address, the server will bind on all available unicast and anycast IP addresses of the local system") // Bind to all interfaces by default. 243 fs.Uint(StakingPortKey, DefaultStakingPort, "Port of the consensus server. If the port is 0 a port number is automatically chosen") 244 fs.Bool(StakingEphemeralCertEnabledKey, false, "If true, the node uses an ephemeral staking TLS key and certificate, and has an ephemeral node ID") 245 fs.String(StakingTLSKeyPathKey, defaultStakingTLSKeyPath, fmt.Sprintf("Path to the TLS private key for staking. Ignored if %s is specified", StakingTLSKeyContentKey)) 246 fs.String(StakingTLSKeyContentKey, "", "Specifies base64 encoded TLS private key for staking") 247 fs.String(StakingCertPathKey, defaultStakingCertPath, fmt.Sprintf("Path to the TLS certificate for staking. Ignored if %s is specified", StakingCertContentKey)) 248 fs.String(StakingCertContentKey, "", "Specifies base64 encoded TLS certificate for staking") 249 fs.Bool(StakingEphemeralSignerEnabledKey, false, "If true, the node uses an ephemeral staking signer key") 250 fs.String(StakingSignerKeyPathKey, defaultStakingSignerKeyPath, fmt.Sprintf("Path to the signer private key for staking. Ignored if %s is specified", StakingSignerKeyContentKey)) 251 fs.String(StakingSignerKeyContentKey, "", "Specifies base64 encoded signer private key for staking") 252 fs.Bool(SybilProtectionEnabledKey, true, "Enables sybil protection. If enabled, Network TLS is required") 253 fs.Uint64(SybilProtectionDisabledWeightKey, 100, "Weight to provide to each peer when sybil protection is disabled") 254 fs.Bool(PartialSyncPrimaryNetworkKey, false, "Only sync the P-chain on the Primary Network. If the node is a Primary Network validator, it will report unhealthy") 255 // Uptime Requirement 256 fs.Float64(UptimeRequirementKey, genesis.LocalParams.UptimeRequirement, "Fraction of time a validator must be online to receive rewards") 257 // Minimum Stake required to validate the Primary Network 258 fs.Uint64(MinValidatorStakeKey, genesis.LocalParams.MinValidatorStake, "Minimum stake, in nAVAX, required to validate the primary network") 259 // Maximum Stake that can be staked and delegated to a validator on the Primary Network 260 fs.Uint64(MaxValidatorStakeKey, genesis.LocalParams.MaxValidatorStake, "Maximum stake, in nAVAX, that can be placed on a validator on the primary network") 261 // Minimum Stake that can be delegated on the Primary Network 262 fs.Uint64(MinDelegatorStakeKey, genesis.LocalParams.MinDelegatorStake, "Minimum stake, in nAVAX, that can be delegated on the primary network") 263 fs.Uint64(MinDelegatorFeeKey, uint64(genesis.LocalParams.MinDelegationFee), "Minimum delegation fee, in the range [0, 1000000], that can be charged for delegation on the primary network") 264 // Minimum Stake Duration 265 fs.Duration(MinStakeDurationKey, genesis.LocalParams.MinStakeDuration, "Minimum staking duration") 266 // Maximum Stake Duration 267 fs.Duration(MaxStakeDurationKey, genesis.LocalParams.MaxStakeDuration, "Maximum staking duration") 268 // Stake Reward Configs 269 fs.Uint64(StakeMaxConsumptionRateKey, genesis.LocalParams.RewardConfig.MaxConsumptionRate, "Maximum consumption rate of the remaining tokens to mint in the staking function") 270 fs.Uint64(StakeMinConsumptionRateKey, genesis.LocalParams.RewardConfig.MinConsumptionRate, "Minimum consumption rate of the remaining tokens to mint in the staking function") 271 fs.Duration(StakeMintingPeriodKey, genesis.LocalParams.RewardConfig.MintingPeriod, "Consumption period of the staking function") 272 fs.Uint64(StakeSupplyCapKey, genesis.LocalParams.RewardConfig.SupplyCap, "Supply cap of the staking function") 273 // Subnets 274 fs.String(TrackSubnetsKey, "", "List of subnets for the node to track. A node tracking a subnet will track the uptimes of the subnet validators and attempt to sync all the chains in the subnet. Before validating a subnet, a node should be tracking the subnet to avoid impacting their subnet validation uptime") 275 276 // State syncing 277 fs.String(StateSyncIPsKey, "", "Comma separated list of state sync peer ips to connect to. Example: 127.0.0.1:9630,127.0.0.1:9631") 278 fs.String(StateSyncIDsKey, "", "Comma separated list of state sync peer ids to connect to. Example: NodeID-JR4dVmy6ffUGAKCBDkyCbeZbyHQBeDsET,NodeID-8CrVPQZ4VSqgL8zTdvL14G8HqAfrBr4z") 279 280 // Bootstrapping 281 // TODO: combine "BootstrapIPsKey" and "BootstrapIDsKey" into one flag 282 fs.String(BootstrapIPsKey, "", "Comma separated list of bootstrap peer ips to connect to. Example: 127.0.0.1:9630,127.0.0.1:9631") 283 fs.String(BootstrapIDsKey, "", "Comma separated list of bootstrap peer ids to connect to. Example: NodeID-JR4dVmy6ffUGAKCBDkyCbeZbyHQBeDsET,NodeID-8CrVPQZ4VSqgL8zTdvL14G8HqAfrBr4z") 284 fs.Duration(BootstrapBeaconConnectionTimeoutKey, time.Minute, "Timeout before emitting a warn log when connecting to bootstrapping beacons") 285 fs.Duration(BootstrapMaxTimeGetAncestorsKey, 50*time.Millisecond, "Max Time to spend fetching a container and its ancestors when responding to a GetAncestors") 286 fs.Uint(BootstrapAncestorsMaxContainersSentKey, 2000, "Max number of containers in an Ancestors message sent by this node") 287 fs.Uint(BootstrapAncestorsMaxContainersReceivedKey, 2000, "This node reads at most this many containers from an incoming Ancestors message") 288 289 // Consensus 290 fs.Int(SnowSampleSizeKey, snowball.DefaultParameters.K, "Number of nodes to query for each network poll") 291 fs.Int(SnowQuorumSizeKey, snowball.DefaultParameters.AlphaConfidence, "Threshold of nodes required to update this node's preference and increase its confidence in a network poll") 292 fs.Int(SnowPreferenceQuorumSizeKey, snowball.DefaultParameters.AlphaPreference, fmt.Sprintf("Threshold of nodes required to update this node's preference in a network poll. Ignored if %s is provided", SnowQuorumSizeKey)) 293 fs.Int(SnowConfidenceQuorumSizeKey, snowball.DefaultParameters.AlphaConfidence, fmt.Sprintf("Threshold of nodes required to increase this node's confidence in a network poll. Ignored if %s is provided", SnowQuorumSizeKey)) 294 295 fs.Int(SnowCommitThresholdKey, snowball.DefaultParameters.Beta, "Beta value to use for consensus") 296 297 fs.Int(SnowConcurrentRepollsKey, snowball.DefaultParameters.ConcurrentRepolls, "Minimum number of concurrent polls for finalizing consensus") 298 fs.Int(SnowOptimalProcessingKey, snowball.DefaultParameters.OptimalProcessing, "Optimal number of processing containers in consensus") 299 fs.Int(SnowMaxProcessingKey, snowball.DefaultParameters.MaxOutstandingItems, "Maximum number of processing items to be considered healthy") 300 fs.Duration(SnowMaxTimeProcessingKey, snowball.DefaultParameters.MaxItemProcessingTime, "Maximum amount of time an item should be processing and still be healthy") 301 302 // ProposerVM 303 fs.Bool(ProposerVMUseCurrentHeightKey, false, "Have the ProposerVM always report the last accepted P-chain block height") 304 305 // Metrics 306 fs.Bool(MeterVMsEnabledKey, true, "Enable Meter VMs to track VM performance with more granularity") 307 fs.Duration(UptimeMetricFreqKey, 30*time.Second, "Frequency of renewing this node's average uptime metric") 308 309 // Indexer 310 fs.Bool(IndexEnabledKey, false, "If true, index all accepted containers and transactions and expose them via an API") 311 fs.Bool(IndexAllowIncompleteKey, false, "If true, allow running the node in such a way that could cause an index to miss transactions. Ignored if index is disabled") 312 313 // Config Directories 314 fs.String(ChainConfigDirKey, defaultChainConfigDir, fmt.Sprintf("Chain specific configurations parent directory. Ignored if %s is specified", ChainConfigContentKey)) 315 fs.String(ChainConfigContentKey, "", "Specifies base64 encoded chains configurations") 316 fs.String(SubnetConfigDirKey, defaultSubnetConfigDir, fmt.Sprintf("Subnet specific configurations parent directory. Ignored if %s is specified", SubnetConfigContentKey)) 317 fs.String(SubnetConfigContentKey, "", "Specifies base64 encoded subnets configurations") 318 319 // Chain Data Directory 320 fs.String(ChainDataDirKey, defaultChainDataDir, "Chain specific data directory") 321 322 // Profiles 323 fs.String(ProfileDirKey, defaultProfileDir, "Path to the profile directory") 324 fs.Bool(ProfileContinuousEnabledKey, false, "Whether the app should continuously produce performance profiles") 325 fs.Duration(ProfileContinuousFreqKey, 15*time.Minute, "How frequently to rotate performance profiles") 326 fs.Int(ProfileContinuousMaxFilesKey, 5, "Maximum number of historical profiles to keep") 327 328 // Aliasing 329 fs.String(VMAliasesFileKey, defaultVMAliasFilePath, fmt.Sprintf("Specifies a JSON file that maps vmIDs with custom aliases. Ignored if %s is specified", VMAliasesContentKey)) 330 fs.String(VMAliasesContentKey, "", "Specifies base64 encoded maps vmIDs with custom aliases") 331 fs.String(ChainAliasesFileKey, defaultChainAliasFilePath, fmt.Sprintf("Specifies a JSON file that maps blockchainIDs with custom aliases. Ignored if %s is specified", ChainConfigContentKey)) 332 fs.String(ChainAliasesContentKey, "", "Specifies base64 encoded map from blockchainID to custom aliases") 333 334 // Delays 335 fs.Duration(NetworkInitialReconnectDelayKey, constants.DefaultNetworkInitialReconnectDelay, "Initial delay duration must be waited before attempting to reconnect a peer") 336 fs.Duration(NetworkMaxReconnectDelayKey, constants.DefaultNetworkMaxReconnectDelay, "Maximum delay duration must be waited before attempting to reconnect a peer") 337 338 // System resource trackers 339 fs.Duration(SystemTrackerFrequencyKey, 500*time.Millisecond, "Frequency to check the real system usage of tracked processes. More frequent checks --> usage metrics are more accurate, but more expensive to track") 340 fs.Duration(SystemTrackerProcessingHalflifeKey, 15*time.Second, "Halflife to use for the processing requests tracker. Larger halflife --> usage metrics change more slowly") 341 fs.Duration(SystemTrackerCPUHalflifeKey, 15*time.Second, "Halflife to use for the cpu tracker. Larger halflife --> cpu usage metrics change more slowly") 342 fs.Duration(SystemTrackerDiskHalflifeKey, time.Minute, "Halflife to use for the disk tracker. Larger halflife --> disk usage metrics change more slowly") 343 fs.Uint64(SystemTrackerRequiredAvailableDiskSpaceKey, units.GiB/2, "Minimum number of available bytes on disk, under which the node will shutdown.") 344 fs.Uint64(SystemTrackerWarningThresholdAvailableDiskSpaceKey, units.GiB, fmt.Sprintf("Warning threshold for the number of available bytes on disk, under which the node will be considered unhealthy. Must be >= [%s]", SystemTrackerRequiredAvailableDiskSpaceKey)) 345 346 // CPU management 347 fs.Float64(CPUVdrAllocKey, float64(runtime.NumCPU()), "Maximum number of CPUs to allocate for use by validators. Value should be in range [0, total core count]") 348 fs.Float64(CPUMaxNonVdrUsageKey, .8*float64(runtime.NumCPU()), "Number of CPUs that if fully utilized, will rate limit all non-validators. Value should be in range [0, total core count]") 349 fs.Float64(CPUMaxNonVdrNodeUsageKey, float64(runtime.NumCPU())/8, "Maximum number of CPUs that a non-validator can utilize. Value should be in range [0, total core count]") 350 351 // Disk management 352 fs.Float64(DiskVdrAllocKey, 1000*units.GiB, "Maximum number of disk reads/writes per second to allocate for use by validators. Must be > 0") 353 fs.Float64(DiskMaxNonVdrUsageKey, 1000*units.GiB, "Number of disk reads/writes per second that, if fully utilized, will rate limit all non-validators. Must be >= 0") 354 fs.Float64(DiskMaxNonVdrNodeUsageKey, 1000*units.GiB, "Maximum number of disk reads/writes per second that a non-validator can utilize. Must be >= 0") 355 356 // Opentelemetry tracing 357 fs.Bool(TracingEnabledKey, false, "If true, enable opentelemetry tracing") 358 fs.String(TracingExporterTypeKey, trace.GRPC.String(), fmt.Sprintf("Type of exporter to use for tracing. Options are [%s, %s]", trace.GRPC, trace.HTTP)) 359 fs.String(TracingEndpointKey, "localhost:4317", "The endpoint to send trace data to") 360 fs.Bool(TracingInsecureKey, true, "If true, don't use TLS when sending trace data") 361 fs.Float64(TracingSampleRateKey, 0.1, "The fraction of traces to sample. If >= 1, always sample. If <= 0, never sample") 362 fs.StringToString(TracingHeadersKey, map[string]string{}, "The headers to provide the trace indexer") 363 364 fs.String(ProcessContextFileKey, defaultProcessContextPath, "The path to write process context to (including PID, API URI, and staking address).") 365 } 366 367 // BuildFlagSet returns a complete set of flags for avalanchego 368 func BuildFlagSet() *pflag.FlagSet { 369 fs := pflag.NewFlagSet(constants.AppName, pflag.ContinueOnError) 370 addProcessFlags(fs) 371 addNodeFlags(fs) 372 return fs 373 } 374 375 // GetExpandedArg gets the string in viper corresponding to [key] and expands 376 // any variables using the OS env. If the [AvalancheGoDataDirVar] var is used, 377 // we expand the value of the variable with the string in viper corresponding to 378 // [DataDirKey]. 379 func GetExpandedArg(v *viper.Viper, key string) string { 380 return GetExpandedString(v, v.GetString(key)) 381 } 382 383 // GetExpandedString expands [s] with any variables using the OS env. If the 384 // [AvalancheGoDataDirVar] var is used, we expand the value of the variable with 385 // the string in viper corresponding to [DataDirKey]. 386 func GetExpandedString(v *viper.Viper, s string) string { 387 return os.Expand( 388 s, 389 func(strVar string) string { 390 if strVar == AvalancheGoDataDirVar { 391 return os.ExpandEnv(v.GetString(DataDirKey)) 392 } 393 return os.Getenv(strVar) 394 }, 395 ) 396 }