github.com/prysmaticlabs/prysm@v1.4.4/cmd/beacon-chain/main.go (about)

     1  // Package beacon-chain defines the entire runtime of an Ethereum beacon node.
     2  package main
     3  
     4  import (
     5  	"fmt"
     6  	"os"
     7  	"path/filepath"
     8  	"runtime"
     9  	runtimeDebug "runtime/debug"
    10  
    11  	gethlog "github.com/ethereum/go-ethereum/log"
    12  	golog "github.com/ipfs/go-log/v2"
    13  	joonix "github.com/joonix/log"
    14  	"github.com/prysmaticlabs/prysm/beacon-chain/node"
    15  	dbcommands "github.com/prysmaticlabs/prysm/cmd/beacon-chain/db"
    16  	"github.com/prysmaticlabs/prysm/cmd/beacon-chain/flags"
    17  	"github.com/prysmaticlabs/prysm/shared/cmd"
    18  	"github.com/prysmaticlabs/prysm/shared/debug"
    19  	"github.com/prysmaticlabs/prysm/shared/featureconfig"
    20  	"github.com/prysmaticlabs/prysm/shared/fileutil"
    21  	"github.com/prysmaticlabs/prysm/shared/journald"
    22  	"github.com/prysmaticlabs/prysm/shared/logutil"
    23  	_ "github.com/prysmaticlabs/prysm/shared/maxprocs"
    24  	"github.com/prysmaticlabs/prysm/shared/tos"
    25  	"github.com/prysmaticlabs/prysm/shared/version"
    26  	"github.com/sirupsen/logrus"
    27  	"github.com/urfave/cli/v2"
    28  	prefixed "github.com/x-cray/logrus-prefixed-formatter"
    29  )
    30  
    31  var appFlags = []cli.Flag{
    32  	flags.DepositContractFlag,
    33  	flags.HTTPWeb3ProviderFlag,
    34  	flags.FallbackWeb3ProviderFlag,
    35  	flags.RPCHost,
    36  	flags.RPCPort,
    37  	flags.CertFlag,
    38  	flags.KeyFlag,
    39  	flags.DisableGRPCGateway,
    40  	flags.GRPCGatewayHost,
    41  	flags.GRPCGatewayPort,
    42  	flags.EthApiPort,
    43  	flags.GPRCGatewayCorsDomain,
    44  	flags.MinSyncPeers,
    45  	flags.ContractDeploymentBlock,
    46  	flags.SetGCPercent,
    47  	flags.HeadSync,
    48  	flags.DisableSync,
    49  	flags.DisableDiscv5,
    50  	flags.BlockBatchLimit,
    51  	flags.BlockBatchLimitBurstFactor,
    52  	flags.InteropMockEth1DataVotesFlag,
    53  	flags.InteropGenesisStateFlag,
    54  	flags.InteropNumValidatorsFlag,
    55  	flags.InteropGenesisTimeFlag,
    56  	flags.SlotsPerArchivedPoint,
    57  	flags.EnableDebugRPCEndpoints,
    58  	flags.SubscribeToAllSubnets,
    59  	flags.HistoricalSlasherNode,
    60  	flags.ChainID,
    61  	flags.NetworkID,
    62  	flags.WeakSubjectivityCheckpt,
    63  	flags.Eth1HeaderReqLimit,
    64  	flags.GenesisStatePath,
    65  	cmd.EnableBackupWebhookFlag,
    66  	cmd.BackupWebhookOutputDir,
    67  	cmd.MinimalConfigFlag,
    68  	cmd.E2EConfigFlag,
    69  	cmd.RPCMaxPageSizeFlag,
    70  	cmd.BootstrapNode,
    71  	cmd.NoDiscovery,
    72  	cmd.StaticPeers,
    73  	cmd.RelayNode,
    74  	cmd.P2PUDPPort,
    75  	cmd.P2PTCPPort,
    76  	cmd.P2PIP,
    77  	cmd.P2PHost,
    78  	cmd.P2PHostDNS,
    79  	cmd.P2PMaxPeers,
    80  	cmd.P2PPrivKey,
    81  	cmd.P2PMetadata,
    82  	cmd.P2PAllowList,
    83  	cmd.P2PDenyList,
    84  	cmd.DataDirFlag,
    85  	cmd.VerbosityFlag,
    86  	cmd.EnableTracingFlag,
    87  	cmd.TracingProcessNameFlag,
    88  	cmd.TracingEndpointFlag,
    89  	cmd.TraceSampleFractionFlag,
    90  	cmd.MonitoringHostFlag,
    91  	flags.MonitoringPortFlag,
    92  	cmd.DisableMonitoringFlag,
    93  	cmd.ClearDB,
    94  	cmd.ForceClearDB,
    95  	cmd.LogFormat,
    96  	cmd.MaxGoroutines,
    97  	debug.PProfFlag,
    98  	debug.PProfAddrFlag,
    99  	debug.PProfPortFlag,
   100  	debug.MemProfileRateFlag,
   101  	debug.CPUProfileFlag,
   102  	debug.TraceFlag,
   103  	debug.BlockProfileRateFlag,
   104  	debug.MutexProfileFractionFlag,
   105  	cmd.LogFileName,
   106  	cmd.EnableUPnPFlag,
   107  	cmd.ConfigFileFlag,
   108  	cmd.ChainConfigFileFlag,
   109  	cmd.GrpcMaxCallRecvMsgSizeFlag,
   110  	cmd.AcceptTosFlag,
   111  	cmd.RestoreSourceFileFlag,
   112  	cmd.RestoreTargetDirFlag,
   113  	cmd.BoltMMapInitialSizeFlag,
   114  }
   115  
   116  func init() {
   117  	appFlags = cmd.WrapFlags(append(appFlags, featureconfig.BeaconChainFlags...))
   118  }
   119  
   120  func main() {
   121  	app := cli.App{}
   122  	app.Name = "beacon-chain"
   123  	app.Usage = "this is a beacon chain implementation for Ethereum"
   124  	app.Action = startNode
   125  	app.Version = version.Version()
   126  	app.Commands = []*cli.Command{
   127  		dbcommands.Commands,
   128  	}
   129  
   130  	app.Flags = appFlags
   131  
   132  	app.Before = func(ctx *cli.Context) error {
   133  		// Load flags from config file, if specified.
   134  		if err := cmd.LoadFlagsFromConfig(ctx, app.Flags); err != nil {
   135  			return err
   136  		}
   137  
   138  		format := ctx.String(cmd.LogFormat.Name)
   139  		switch format {
   140  		case "text":
   141  			formatter := new(prefixed.TextFormatter)
   142  			formatter.TimestampFormat = "2006-01-02 15:04:05"
   143  			formatter.FullTimestamp = true
   144  			// If persistent log files are written - we disable the log messages coloring because
   145  			// the colors are ANSI codes and seen as gibberish in the log files.
   146  			formatter.DisableColors = ctx.String(cmd.LogFileName.Name) != ""
   147  			logrus.SetFormatter(formatter)
   148  		case "fluentd":
   149  			f := joonix.NewFormatter()
   150  			if err := joonix.DisableTimestampFormat(f); err != nil {
   151  				panic(err)
   152  			}
   153  			logrus.SetFormatter(f)
   154  		case "json":
   155  			logrus.SetFormatter(&logrus.JSONFormatter{})
   156  		case "journald":
   157  			if err := journald.Enable(); err != nil {
   158  				return err
   159  			}
   160  		default:
   161  			return fmt.Errorf("unknown log format %s", format)
   162  		}
   163  
   164  		logFileName := ctx.String(cmd.LogFileName.Name)
   165  		if logFileName != "" {
   166  			if err := logutil.ConfigurePersistentLogging(logFileName); err != nil {
   167  				log.WithError(err).Error("Failed to configuring logging to disk.")
   168  			}
   169  		}
   170  		if err := cmd.ExpandSingleEndpointIfFile(ctx, flags.HTTPWeb3ProviderFlag); err != nil {
   171  			return err
   172  		}
   173  		if err := cmd.ExpandWeb3EndpointsIfFile(ctx, flags.FallbackWeb3ProviderFlag); err != nil {
   174  			return err
   175  		}
   176  		if ctx.IsSet(flags.SetGCPercent.Name) {
   177  			runtimeDebug.SetGCPercent(ctx.Int(flags.SetGCPercent.Name))
   178  		}
   179  		runtime.GOMAXPROCS(runtime.NumCPU())
   180  		if err := debug.Setup(ctx); err != nil {
   181  			return err
   182  		}
   183  		return cmd.ValidateNoArgs(ctx)
   184  	}
   185  
   186  	defer func() {
   187  		if x := recover(); x != nil {
   188  			log.Errorf("Runtime panic: %v\n%v", x, string(runtimeDebug.Stack()))
   189  			panic(x)
   190  		}
   191  	}()
   192  
   193  	if err := app.Run(os.Args); err != nil {
   194  		log.Error(err.Error())
   195  	}
   196  }
   197  
   198  func startNode(ctx *cli.Context) error {
   199  	// Fix data dir for Windows users.
   200  	outdatedDataDir := filepath.Join(fileutil.HomeDir(), "AppData", "Roaming", "Eth2")
   201  	currentDataDir := ctx.String(cmd.DataDirFlag.Name)
   202  	if err := cmd.FixDefaultDataDir(outdatedDataDir, currentDataDir); err != nil {
   203  		return err
   204  	}
   205  
   206  	// verify if ToS accepted
   207  	if err := tos.VerifyTosAcceptedOrPrompt(ctx); err != nil {
   208  		return err
   209  	}
   210  
   211  	verbosity := ctx.String(cmd.VerbosityFlag.Name)
   212  	level, err := logrus.ParseLevel(verbosity)
   213  	if err != nil {
   214  		return err
   215  	}
   216  	logrus.SetLevel(level)
   217  	if level == logrus.TraceLevel {
   218  		// libp2p specific logging.
   219  		golog.SetAllLoggers(golog.LevelDebug)
   220  		// Geth specific logging.
   221  		glogger := gethlog.NewGlogHandler(gethlog.StreamHandler(os.Stderr, gethlog.TerminalFormat(true)))
   222  		glogger.Verbosity(gethlog.LvlTrace)
   223  		gethlog.Root().SetHandler(glogger)
   224  	}
   225  
   226  	beacon, err := node.New(ctx)
   227  	if err != nil {
   228  		return err
   229  	}
   230  	beacon.Start()
   231  	return nil
   232  }