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  }