github.com/prysmaticlabs/prysm@v1.4.4/cmd/slasher/main.go (about) 1 // Package main defines slasher server implementation for Ethereum. A slasher 2 // listens for all broadcasted messages using a running beacon node in order 3 // to detect malicious attestations and block proposals. 4 package main 5 6 import ( 7 "fmt" 8 "os" 9 "runtime" 10 11 joonix "github.com/joonix/log" 12 "github.com/prysmaticlabs/prysm/cmd/slasher/flags" 13 "github.com/prysmaticlabs/prysm/shared/cmd" 14 "github.com/prysmaticlabs/prysm/shared/debug" 15 "github.com/prysmaticlabs/prysm/shared/featureconfig" 16 "github.com/prysmaticlabs/prysm/shared/journald" 17 "github.com/prysmaticlabs/prysm/shared/logutil" 18 "github.com/prysmaticlabs/prysm/shared/tos" 19 "github.com/prysmaticlabs/prysm/shared/version" 20 "github.com/prysmaticlabs/prysm/slasher/db" 21 "github.com/prysmaticlabs/prysm/slasher/node" 22 "github.com/sirupsen/logrus" 23 "github.com/urfave/cli/v2" 24 prefixed "github.com/x-cray/logrus-prefixed-formatter" 25 ) 26 27 func startSlasher(cliCtx *cli.Context) error { 28 // verify if ToS accepted 29 if err := tos.VerifyTosAcceptedOrPrompt(cliCtx); err != nil { 30 return err 31 } 32 33 verbosity := cliCtx.String(cmd.VerbosityFlag.Name) 34 level, err := logrus.ParseLevel(verbosity) 35 if err != nil { 36 return err 37 } 38 logrus.SetLevel(level) 39 slasher, err := node.New(cliCtx) 40 if err != nil { 41 return err 42 } 43 slasher.Start() 44 return nil 45 } 46 47 var appFlags = []cli.Flag{ 48 cmd.MinimalConfigFlag, 49 cmd.E2EConfigFlag, 50 cmd.RPCMaxPageSizeFlag, 51 cmd.VerbosityFlag, 52 cmd.DataDirFlag, 53 cmd.EnableTracingFlag, 54 cmd.TracingProcessNameFlag, 55 cmd.TracingEndpointFlag, 56 cmd.TraceSampleFractionFlag, 57 cmd.MonitoringHostFlag, 58 flags.MonitoringPortFlag, 59 cmd.DisableMonitoringFlag, 60 cmd.EnableBackupWebhookFlag, 61 cmd.BackupWebhookOutputDir, 62 cmd.LogFileName, 63 cmd.LogFormat, 64 cmd.ClearDB, 65 cmd.ForceClearDB, 66 cmd.ConfigFileFlag, 67 debug.PProfFlag, 68 debug.PProfAddrFlag, 69 debug.PProfPortFlag, 70 debug.MemProfileRateFlag, 71 debug.CPUProfileFlag, 72 debug.TraceFlag, 73 flags.RPCPort, 74 flags.RPCHost, 75 flags.CertFlag, 76 flags.KeyFlag, 77 flags.BeaconCertFlag, 78 flags.BeaconRPCProviderFlag, 79 flags.EnableHistoricalDetectionFlag, 80 flags.SpanCacheSize, 81 cmd.AcceptTosFlag, 82 flags.HighestAttCacheSize, 83 } 84 85 func init() { 86 appFlags = cmd.WrapFlags(append(appFlags, featureconfig.SlasherFlags...)) 87 } 88 89 func main() { 90 app := cli.App{} 91 app.Name = "hash slinging slasher" 92 app.Usage = `launches an Ethereum Serenity slasher server that interacts with a beacon chain.` 93 app.Version = version.Version() 94 app.Commands = []*cli.Command{ 95 db.DatabaseCommands, 96 } 97 app.Flags = appFlags 98 app.Action = startSlasher 99 app.Before = func(ctx *cli.Context) error { 100 // Load flags from config file, if specified. 101 if err := cmd.LoadFlagsFromConfig(ctx, app.Flags); err != nil { 102 return err 103 } 104 105 format := ctx.String(cmd.LogFormat.Name) 106 switch format { 107 case "text": 108 formatter := new(prefixed.TextFormatter) 109 formatter.TimestampFormat = "2006-01-02 15:04:05" 110 formatter.FullTimestamp = true 111 // If persistent log files are written - we disable the log messages coloring because 112 // the colors are ANSI codes and seen as Gibberish in the log files. 113 formatter.DisableColors = ctx.String(cmd.LogFileName.Name) != "" 114 logrus.SetFormatter(formatter) 115 case "fluentd": 116 logrus.SetFormatter(joonix.NewFormatter()) 117 case "json": 118 logrus.SetFormatter(&logrus.JSONFormatter{}) 119 case "journald": 120 if err := journald.Enable(); err != nil { 121 return err 122 } 123 default: 124 return fmt.Errorf("unknown log format %s", format) 125 } 126 127 logFileName := ctx.String(cmd.LogFileName.Name) 128 if logFileName != "" { 129 if err := logutil.ConfigurePersistentLogging(logFileName); err != nil { 130 log.WithError(err).Error("Failed to configuring logging to disk.") 131 } 132 } 133 134 runtime.GOMAXPROCS(runtime.NumCPU()) 135 if err := debug.Setup(ctx); err != nil { 136 return err 137 } 138 return cmd.ValidateNoArgs(ctx) 139 } 140 141 app.After = func(ctx *cli.Context) error { 142 debug.Exit(ctx) 143 return nil 144 } 145 146 if err := app.Run(os.Args); err != nil { 147 log.Error(err.Error()) 148 os.Exit(1) 149 } 150 }