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  }