github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/cmd/geth/usage.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2015 Go Ethereum作者 10 //此文件是Go以太坊的一部分。 11 // 12 //Go以太坊是免费软件:您可以重新发布和/或修改它 13 //根据GNU通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊的分布希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU通用公共许可证了解更多详细信息。 21 // 22 //你应该已经收到一份GNU通用公共许可证的副本 23 //一起去以太坊吧。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 //包含geth命令用法模板和生成器。 26 27 package main 28 29 import ( 30 "io" 31 "sort" 32 33 "strings" 34 35 "github.com/ethereum/go-ethereum/cmd/utils" 36 "github.com/ethereum/go-ethereum/internal/debug" 37 "gopkg.in/urfave/cli.v1" 38 ) 39 40 //AppHelpTemplate是默认全局应用程序帮助主题的测试模板。 41 var AppHelpTemplate = `NAME: 42 {{.App.Name}} - {{.App.Usage}} 43 44 Copyright 2013-2018 The go-ethereum Authors 45 46 USAGE: 47 {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} 48 {{if .App.Version}} 49 VERSION: 50 {{.App.Version}} 51 {{end}}{{if len .App.Authors}} 52 AUTHOR(S): 53 {{range .App.Authors}}{{ . }}{{end}} 54 {{end}}{{if .App.Commands}} 55 COMMANDS: 56 {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} 57 {{end}}{{end}}{{if .FlagGroups}} 58 {{range .FlagGroups}}{{.Name}} OPTIONS: 59 {{range .Flags}}{{.}} 60 {{end}} 61 {{end}}{{end}}{{if .App.Copyright }} 62 COPYRIGHT: 63 {{.App.Copyright}} 64 {{end}} 65 ` 66 67 //FlagGroup是属于单个主题的标志集合。 68 type flagGroup struct { 69 Name string 70 Flags []cli.Flag 71 } 72 73 // 74 var AppHelpFlagGroups = []flagGroup{ 75 { 76 Name: "ETHEREUM", 77 Flags: []cli.Flag{ 78 configFileFlag, 79 utils.DataDirFlag, 80 utils.KeyStoreDirFlag, 81 utils.NoUSBFlag, 82 utils.NetworkIdFlag, 83 utils.TestnetFlag, 84 utils.RinkebyFlag, 85 utils.SyncModeFlag, 86 utils.GCModeFlag, 87 utils.EthStatsURLFlag, 88 utils.IdentityFlag, 89 utils.LightServFlag, 90 utils.LightPeersFlag, 91 utils.LightKDFFlag, 92 }, 93 }, 94 { 95 Name: "DEVELOPER CHAIN", 96 Flags: []cli.Flag{ 97 utils.DeveloperFlag, 98 utils.DeveloperPeriodFlag, 99 }, 100 }, 101 { 102 Name: "ETHASH", 103 Flags: []cli.Flag{ 104 utils.EthashCacheDirFlag, 105 utils.EthashCachesInMemoryFlag, 106 utils.EthashCachesOnDiskFlag, 107 utils.EthashDatasetDirFlag, 108 utils.EthashDatasetsInMemoryFlag, 109 utils.EthashDatasetsOnDiskFlag, 110 }, 111 }, 112 //{ 113 //名称:“仪表板”, 114 //标志:[]cli.flag_ 115 //utils.dashboard启用的标志, 116 //实用程序。仪表板添加标记, 117 //utils.dashboardportflag, 118 //utils.dashboard刷新标记, 119 //utils.dashboardassetsflag, 120 //} 121 //} 122 { 123 Name: "TRANSACTION POOL", 124 Flags: []cli.Flag{ 125 utils.TxPoolLocalsFlag, 126 utils.TxPoolNoLocalsFlag, 127 utils.TxPoolJournalFlag, 128 utils.TxPoolRejournalFlag, 129 utils.TxPoolPriceLimitFlag, 130 utils.TxPoolPriceBumpFlag, 131 utils.TxPoolAccountSlotsFlag, 132 utils.TxPoolGlobalSlotsFlag, 133 utils.TxPoolAccountQueueFlag, 134 utils.TxPoolGlobalQueueFlag, 135 utils.TxPoolLifetimeFlag, 136 }, 137 }, 138 { 139 Name: "PERFORMANCE TUNING", 140 Flags: []cli.Flag{ 141 utils.CacheFlag, 142 utils.CacheDatabaseFlag, 143 utils.CacheGCFlag, 144 utils.TrieCacheGenFlag, 145 }, 146 }, 147 { 148 Name: "ACCOUNT", 149 Flags: []cli.Flag{ 150 utils.UnlockedAccountFlag, 151 utils.PasswordFileFlag, 152 }, 153 }, 154 { 155 Name: "API AND CONSOLE", 156 Flags: []cli.Flag{ 157 utils.RPCEnabledFlag, 158 utils.RPCListenAddrFlag, 159 utils.RPCPortFlag, 160 utils.RPCApiFlag, 161 utils.WSEnabledFlag, 162 utils.WSListenAddrFlag, 163 utils.WSPortFlag, 164 utils.WSApiFlag, 165 utils.WSAllowedOriginsFlag, 166 utils.IPCDisabledFlag, 167 utils.IPCPathFlag, 168 utils.RPCCORSDomainFlag, 169 utils.RPCVirtualHostsFlag, 170 utils.JSpathFlag, 171 utils.ExecFlag, 172 utils.PreloadJSFlag, 173 }, 174 }, 175 { 176 Name: "NETWORKING", 177 Flags: []cli.Flag{ 178 utils.BootnodesFlag, 179 utils.BootnodesV4Flag, 180 utils.BootnodesV5Flag, 181 utils.ListenPortFlag, 182 utils.MaxPeersFlag, 183 utils.MaxPendingPeersFlag, 184 utils.NATFlag, 185 utils.NoDiscoverFlag, 186 utils.DiscoveryV5Flag, 187 utils.NetrestrictFlag, 188 utils.NodeKeyFileFlag, 189 utils.NodeKeyHexFlag, 190 }, 191 }, 192 { 193 Name: "MINER", 194 Flags: []cli.Flag{ 195 utils.MiningEnabledFlag, 196 utils.MinerThreadsFlag, 197 utils.MinerNotifyFlag, 198 utils.MinerGasPriceFlag, 199 utils.MinerGasTargetFlag, 200 //utils.mineretherbaseflag(实用程序.mineretherbaseflag) 201 utils.MinerExtraDataFlag, 202 utils.MinerRecommitIntervalFlag, 203 }, 204 }, 205 { 206 Name: "GAS PRICE ORACLE", 207 Flags: []cli.Flag{ 208 utils.GpoBlocksFlag, 209 utils.GpoPercentileFlag, 210 }, 211 }, 212 { 213 Name: "VIRTUAL MACHINE", 214 Flags: []cli.Flag{ 215 utils.VMEnableDebugFlag, 216 }, 217 }, 218 { 219 Name: "LOGGING AND DEBUGGING", 220 Flags: append([]cli.Flag{ 221 utils.FakePoWFlag, 222 utils.NoCompactionFlag, 223 }, debug.Flags...), 224 }, 225 { 226 Name: "METRICS AND STATS", 227 Flags: []cli.Flag{ 228 utils.MetricsEnabledFlag, 229 utils.MetricsEnableInfluxDBFlag, 230 utils.MetricsInfluxDBEndpointFlag, 231 utils.MetricsInfluxDBDatabaseFlag, 232 utils.MetricsInfluxDBUsernameFlag, 233 utils.MetricsInfluxDBPasswordFlag, 234 utils.MetricsInfluxDBHostTagFlag, 235 }, 236 }, 237 { 238 Name: "WHISPER (EXPERIMENTAL)", 239 Flags: whisperFlags, 240 }, 241 { 242 Name: "DEPRECATED", 243 Flags: []cli.Flag{ 244 utils.MinerLegacyThreadsFlag, 245 utils.MinerLegacyGasTargetFlag, 246 utils.MinerLegacyGasPriceFlag, 247 utils.MinerLegacyEtherbaseFlag, 248 utils.MinerLegacyExtraDataFlag, 249 }, 250 }, 251 { 252 Name: "MISC", 253 }, 254 } 255 256 //ByCategory按顺序按名称对FlagGroup数组排序 257 //在AppHelpFlagGroups中定义。 258 type byCategory []flagGroup 259 260 func (a byCategory) Len() int { return len(a) } 261 func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 262 func (a byCategory) Less(i, j int) bool { 263 iCat, jCat := a[i].Name, a[j].Name 264 iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) //确保非分类标志排在最后 265 266 for i, group := range AppHelpFlagGroups { 267 if iCat == group.Name { 268 iIdx = i 269 } 270 if jCat == group.Name { 271 jIdx = i 272 } 273 } 274 275 return iIdx < jIdx 276 } 277 278 func flagCategory(flag cli.Flag) string { 279 for _, category := range AppHelpFlagGroups { 280 for _, flg := range category.Flags { 281 if flg.GetName() == flag.GetName() { 282 return category.Name 283 } 284 } 285 } 286 return "MISC" 287 } 288 289 func init() { 290 //覆盖默认的应用程序帮助模板 291 cli.AppHelpTemplate = AppHelpTemplate 292 293 //定义一个要传递到使用模板的一次性结构 294 type helpData struct { 295 App interface{} 296 FlagGroups []flagGroup 297 } 298 299 //覆盖默认的应用程序帮助打印机,但仅用于全局应用程序帮助 300 originalHelpPrinter := cli.HelpPrinter 301 cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) { 302 if tmpl == AppHelpTemplate { 303 //遍历所有标志并添加任何未分类的标志 304 categorized := make(map[string]struct{}) 305 for _, group := range AppHelpFlagGroups { 306 for _, flag := range group.Flags { 307 categorized[flag.String()] = struct{}{} 308 } 309 } 310 uncategorized := []cli.Flag{} 311 for _, flag := range data.(*cli.App).Flags { 312 if _, ok := categorized[flag.String()]; !ok { 313 if strings.HasPrefix(flag.GetName(), "dashboard") { 314 continue 315 } 316 uncategorized = append(uncategorized, flag) 317 } 318 } 319 if len(uncategorized) > 0 { 320 //将所有未分类的选项附加到misc组 321 miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags) 322 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...) 323 324 //确保之后将其拆下 325 defer func() { 326 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs] 327 }() 328 } 329 //呈现自定义使用屏幕 330 originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups}) 331 } else if tmpl == utils.CommandHelpTemplate { 332 //遍历所有特定于命令的标志并对其进行分类 333 categorized := make(map[string][]cli.Flag) 334 for _, flag := range data.(cli.Command).Flags { 335 if _, ok := categorized[flag.String()]; !ok { 336 categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag) 337 } 338 } 339 340 //排序以获得稳定的排序 341 sorted := make([]flagGroup, 0, len(categorized)) 342 for cat, flgs := range categorized { 343 sorted = append(sorted, flagGroup{cat, flgs}) 344 } 345 sort.Sort(byCategory(sorted)) 346 347 //将排序数组添加到数据并使用默认打印机呈现 348 originalHelpPrinter(w, tmpl, map[string]interface{}{ 349 "cmd": data, 350 "categorizedFlags": sorted, 351 }) 352 } else { 353 originalHelpPrinter(w, tmpl, data) 354 } 355 } 356 }